फ़ोल्ड किए जा सकने वाले डिवाइसों के लिए, स्क्रीन रोटेशन के व्यवहार को डिवाइस की फ़िज़िकल स्थिति के हिसाब से ऑप्टिमाइज़ किया जा सकता है. इससे, उपयोगकर्ताओं को बेहतर अनुभव मिलता है. उदाहरण के लिए, स्क्रीन को अपने-आप रोटेट होने के लिए सेट किया जा सकता है. ऐसा तब होगा, जब डिवाइस को टैबलेट की तरह खोला जाएगा. हालांकि, डिवाइस को फ़ोल्ड करने पर, स्क्रीन पोर्ट्रेट मोड में लॉक हो जाएगी.
Android 13 से, Android में डिवाइस की स्थितियों के आधार पर, ऑटो-रोटेट की सेटिंग को पसंद के मुताबिक बनाने की सुविधा है. जैसे, फ़ोल्ड किया गया, खोला गया या आधा फ़ोल्ड किया गया (टेबलटॉप मोड).
पहली इमेज. डिवाइस की स्थिति के आधार पर ऑटो-रोटेट की सेटिंग, जैसा कि उपयोगकर्ता को दिखती है.
डिवाइस की स्थिति के आधार पर ऑटो-रोटेट की सेटिंग चालू करना
डिवाइस की स्थिति के आधार पर ऑटो-रोटेट की सुविधा चालू करने और इसे कॉन्फ़िगर करने के लिए, फ़्रेमवर्क की config.xml फ़ाइल के लिए डिवाइस ओवरले बनाएं. इसके लिए, यह तरीका अपनाएं:
अपने डिवाइस के ओवरले
config.xmlमें,config_perDeviceStateRotationLockDefaultsइंटिजर ऐरे में जानकारी डालकर, डिवाइस की अलग-अलग स्थितियों के लिए, ऑटो-रोटेट के डिफ़ॉल्ट व्यवहार को कॉन्फ़िगर करें:<!-- In your device overlay, for example, device/generic/goldfish/phone/overlay/frameworks/base/core/res/res/values/config.xml --> <resources> <!-- Map of device posture to rotation lock setting. Each entry must be in the format "key:value", or "key:value:fallback_key" for example: "0:1" or "2:0:1". The keys are one of Settings.Secure.DeviceStateRotationLockKey, and the values are one of Settings.Secure.DeviceStateRotationLockSetting. --> <integer-array name="config_perDeviceStateRotationLockDefaults"> <item>0:1</item> <!-- CLOSED -> LOCKED --> <item>1:0:2</item> <!-- HALF_OPENED -> IGNORED and fallback to device posture OPENED --> <item>2:2</item> <!-- OPENED -> UNLOCKED --> <item>3:0:0</item> <!-- REAR_DISPLAY -> IGNORED and fallback to device posture CLOSED --> </integer-array> </resources>fallback-key, डिवाइस की किसी दूसरी स्थिति का रेफ़रंस है. आपको यह बताना होगा कि किसी स्थिति की वैल्यूSettings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNOREDकब होती है. जब किसी स्थिति को इस तरह कॉन्फ़िगर किया जाता है, तो ऑटो-रोटेट की प्राथमिकता पाने या सेट करने के सभी अनुरोध, फ़ॉलबैक स्थिति पर रीडायरेक्ट कर दिए जाते हैं.उदाहरण के लिए, अगर
HALF_OPENEDस्थिति,OPENEDस्थिति पर फ़ॉल बैक होती है, तो:HALF_OPENEDके लिए, ऑटो-रोटेट की सेटिंग पढ़ने पर,OPENEDके लिए मौजूदा सेटिंग दिखती है.- डिवाइस के
HALF_OPENEDहोने पर, ऑटो-रोटेट की नई प्राथमिकता लिखने पर,OPENEDस्थिति के लिए प्राथमिकता अपडेट हो जाती है.
उपयोगकर्ता की ओर से सेट की जा सकने वाली, डिवाइस की हर स्थिति के लिए, ब्यौरे कॉन्फ़िगर करें. अपने डिवाइस के सेटिंग ऐप्लिकेशन के ओवरले में,
config_settableAutoRotationDeviceStatesDescriptionsस्ट्रिंग ऐरे में जानकारी डालें:<!-- In your device's Settings app overlay --> <resources> <!-- The settings/preference description for each settable device posture defined in the array "config_perDeviceStateRotationLockDefaults". The item in position "i" describes the auto-rotation setting for the device posture also in position "i" in the array "config_perDeviceStateRotationLockDefaults". --> <string-array name="config_settableAutoRotationDeviceStatesDescriptions"> <item>Auto-rotate when folded</item> <item>@null</item> <!-- No description for state in position 1 (it is not settable by the user) --> <item>Auto-rotate when unfolded</item> </string-array> </resources>इन सेटिंग में प्रोग्राम के ज़रिए बदलाव करने के लिए, सेटिंग के प्रोवाइडर को सीधे तौर पर लिखने के बजाय, सही एपीआई का इस्तेमाल करें. इससे, सेटिंग के व्यवहार में गड़बड़ी होने से बचा जा सकेगा:
रोटेशन लॉक की मौजूदा स्थिति बदलने के लिए (
ACCELEROMETER_ROTATIONमें बदलाव करता है):- SystemUI या लॉन्चर से,
RotationPolicy#setRotationLock(...)का इस्तेमाल करें. - विंडो मैनेजर से,
DisplayRotation#freezeRotation()याthawRotation()का इस्तेमाल करें.
- SystemUI या लॉन्चर से,
डिवाइस की किसी खास स्थिति के लिए, रोटेशन लॉक की प्राथमिकता बदलने के लिए (
DEVICE_STATE_ROTATION_LOCKमें बदलाव करता है):-
RotationPolicyयाDeviceStateAutoRotateSettingManagerमें से किसी एक से,requestDeviceStateAutoRotateSettingChange(...)का इस्तेमाल करें.
-
लागू करने से जुड़ी जानकारी
फ़ोल्ड किए जा सकने वाले डिवाइस के लिए, ऑटो-रोटेट के व्यवहार को कंट्रोल करने वाली सेटिंग और मुख्य क्लास के बारे में, यहां बताया गया है.
सेटिंग
सिस्टम, ऑटो-रोटेट को मैनेज करने के लिए, इन दो सेटिंग का इस्तेमाल करता है:
Settings.System.ACCELEROMETER_ROTATION: यह ऑटो-रोटेट की मुख्य सेटिंग है. फ़ोल्ड किए जा सकने वाले डिवाइस के लिए, इसकी वैल्यू से पता चलता है कि डिवाइस की मौजूदा स्थिति के लिए, ऑटो-रोटेट की सुविधा चालू है या नहीं.Settings.Secure.DEVICE_STATE_ROTATION_LOCK: इस सेटिंग में, डिवाइस की हर स्थिति (जैसे, फ़ोल्ड या अनफ़ोल्ड) के लिए, ऑटो-रोटेट की उपयोगकर्ता की प्राथमिकता सेव होती है. इससे, डिवाइस की स्थिति बदलने पर, सिस्टम सही प्राथमिकता लागू कर पाता है.यह सेटिंग, कॉलन से अलग की गई स्ट्रिंग के तौर पर सेव होती है. वैल्यू का हर पेयर, डिवाइस की एक स्थिति और उससे जुड़ी रोटेशन सेटिंग दिखाता है. इसका फ़ॉर्मैट यह है:
<device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...रोटेशन की वैल्यू ये हैं:
0: अनदेखा किया गया (फ़ॉलबैक स्थिति के लिए सेटिंग का इस्तेमाल किया जाता है)1: लॉक किया गया (ऑटो-रोटेट बंद है)2: अनलॉक किया गया (ऑटो-रोटेट चालू है)
उदाहरण के लिए, स्ट्रिंग
"0:2:2:1"का मतलब है:- फ़ोल्ड की गई स्थिति (स्थिति
0) के लिए, ऑटो-रोटेट अनलॉक (2) है. - अनफ़ोल्ड की गई स्थिति (स्थिति
2) के लिए, ऑटो-रोटेट लॉक (1) है.
मुख्य क्लास
डिवाइस की स्थिति के आधार पर ऑटो-रोटेट की सेटिंग को मैनेज करने की लॉजिक को इन क्लास से मैनेज किया जाता है:
DeviceStateAutoRotateSettingManagerImpl:DEVICE_STATE_ROTATION_LOCKसेटिंग को मैनेज करता है. यह सेटिंग को अपडेट करने, उसकी वैल्यू पाने, और बदलावों के लिए लिसनर रजिस्टर करने के तरीके उपलब्ध कराता है.DeviceStateAutoRotateSettingController(विंडो मैनेजर):ACCELEROMETER_ROTATIONऔरDEVICE_STATE_ROTATION_LOCKको सिंक करता है. डिवाइस की स्थिति बदलने पर, यह नई स्थिति के लिए उपयोगकर्ता की प्राथमिकता के आधार पर,ACCELEROMETER_ROTATIONको अपडेट करता है. यह पक्का करता है किACCELEROMETER_ROTATIONमें किया गया कोई भी बदलाव, डिवाइस की मौजूदा स्थिति के लिएDEVICE_STATE_ROTATION_LOCKमें सेव हो. इसी तरह, मौजूदा स्थिति के लिएDEVICE_STATE_ROTATION_LOCKमें किए गए बदलाव,ACCELEROMETER_ROTATIONमें दिखें.DeviceStateAutoRotateSettingController(सेटिंग ऐप्लिकेशन): डिवाइस की स्थिति के आधार पर ऑटो-रोटेट की सेटिंग वाले पेज पर यूज़र इंटरफ़ेस (यूआई) को कंट्रोल करता है.PostureDeviceStateConverter: डिवाइस की स्थिति के सामान्य आइडेंटिफ़ायर और इस सुविधा के इस्तेमाल किए जाने वाले डिवाइस की स्थिति के आइडेंटिफ़ायर के बीच कन्वर्ज़न करता है.
सत्यापन
इस सुविधा का व्यवहार, ओईएम के कॉन्फ़िगरेशन पर निर्भर करता है. इसलिए, इसके लिए सीटीएस के खास टेस्ट नहीं हैं. आपको मैन्युअल तरीके से टेस्ट करना होगा, ताकि यह पुष्टि की जा सके कि डिवाइस की अलग-अलग फ़िज़िकल स्थितियों के बीच ट्रांज़िशन होने पर, ऑटो-रोटेट की सेटिंग में उम्मीद के मुताबिक बदलाव होता है.