फ़ोल्ड किए जा सकने वाले डिवाइसों के लिए, स्क्रीन रोटेशन के व्यवहार को डिवाइस की फ़िज़िकल स्थिति के हिसाब से बदलकर, उपयोगकर्ता अनुभव को ऑप्टिमाइज़ किया जा सकता है. उदाहरण के लिए, डिवाइस को टैबलेट की तरह खोलने पर, स्क्रीन के अपने-आप घूमने की सुविधा चालू की जा सकती है. हालांकि, डिवाइस को फ़ोल्ड करने पर, स्क्रीन को पोर्ट्रेट मोड में लॉक किया जा सकता है.
Android 13 से, Android में डिवाइस की स्थितियों के आधार पर, अपने-आप स्क्रीन घूमने की सेटिंग को पसंद के मुताबिक बनाने की सुविधा है. जैसे, फ़ोल्ड किया गया, अनफ़ोल्ड किया गया या आधा फ़ोल्ड किया गया (टेबलटॉप मोड).
पहली इमेज: डिवाइस की स्थिति के हिसाब से स्क्रीन के अपने-आप घूमने की सेटिंग, जैसा कि उपयोगकर्ता को दिखती है.
डिवाइस की स्थिति के आधार पर स्क्रीन के अपने-आप घूमने की सेटिंग चालू करना
डिवाइस की स्थिति के आधार पर स्क्रीन के अपने-आप घूमने की सुविधा को चालू और कॉन्फ़िगर करने के लिए, फ़्रेमवर्क की config.xml फ़ाइल के लिए डिवाइस ओवरले बनाएं. इसके लिए, यह तरीका अपनाएं:
अपने डिवाइस के ओवरले
config.xmlमें, [config_perDeviceStateRotationLockDefaults][7] पूर्णांक ऐरे को पॉप्युलेट करके, डिवाइस के अलग-अलग पोस्चर के लिए, स्क्रीन के अपने-आप घूमने की डिफ़ॉल्ट सेटिंग कॉन्फ़िगर करें:<!-- 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(...)][5] का इस्तेमाल करें. - विंडो मैनेजर में जाकर,
DisplayRotation#freezeRotation()याthawRotation()का इस्तेमाल करें.
- SystemUI या लॉन्चर से, [
किसी डिवाइस की स्थिति के लिए, स्क्रीन रोटेशन लॉक करने की सेटिंग बदलने के लिए (
DEVICE_STATE_ROTATION_LOCKमें बदलाव करता है):RotationPolicyया [DeviceStateAutoRotateSettingManager][6] में से किसी एक का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][1]: यहDEVICE_STATE_ROTATION_LOCKसेटिंग को मैनेज करता है. यह सेटिंग को अपडेट करने, उसकी वैल्यू वापस पाने, और बदलावों के लिए लिसनर रजिस्टर करने के तरीके उपलब्ध कराता है.[
DeviceStateAutoRotateSettingController(विंडो मैनेजर)][2]:ACCELEROMETER_ROTATIONऔरDEVICE_STATE_ROTATION_LOCKको सिंक करता है. डिवाइस की स्थिति बदलने पर, यहACCELEROMETER_ROTATIONको अपडेट करता है. यह अपडेट, नई स्थिति के लिए उपयोगकर्ता की प्राथमिकता के आधार पर होता है. इससे यह पक्का होता है किACCELEROMETER_ROTATIONमें किए गए किसी भी बदलाव को, डिवाइस की मौजूदा स्थिति के लिएDEVICE_STATE_ROTATION_LOCKमें वापस सेव कर दिया गया है. इसी तरह, मौजूदा स्थिति के लिएDEVICE_STATE_ROTATION_LOCKमें किए गए बदलाव,ACCELEROMETER_ROTATIONमें दिखते हैं.[
DeviceStateAutoRotateSettingController(सेटिंग ऐप्लिकेशन)][3]: डिवाइस की स्थिति के आधार पर, ऑटो-रोटेट की सेटिंग वाले पेज पर यूज़र इंटरफ़ेस (यूआई) को कंट्रोल करें.PostureDeviceStateConverter: यह फ़ंक्शन, डिवाइस की सामान्य स्थिति के आइडेंटिफ़ायर और इस सुविधा के लिए इस्तेमाल किए जाने वाले डिवाइस की स्थिति के आइडेंटिफ़ायर के बीच कन्वर्ज़न करता है.
सत्यापन
इस सुविधा का व्यवहार, ओईएम के कॉन्फ़िगरेशन पर काफ़ी हद तक निर्भर करता है. इसलिए, इसके लिए कोई खास सीटीएस टेस्ट नहीं हैं. आपको मैन्युअल तरीके से जांच करनी होगी. इससे यह पुष्टि की जा सकेगी कि डिवाइस को कॉन्फ़िगर किए गए अलग-अलग फ़िज़िकल स्टेट के बीच ट्रांज़िशन करने पर, स्क्रीन अपने-आप घूमने की सेटिंग में उम्मीद के मुताबिक बदलाव होता है.
[1]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/packages/SettingsLib/DeviceStateRotationLock/src/com/android/settingslib/devicestate/DeviceStateAutoRotateSettingManagerImpl.java [2]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/services/core/java/com/android/server/wm/DeviceStateAutoRotateSettingController.java [3]: https://cs.android.com/android/platform/superproject/+/android-latest-release:packages/apps/Settings/src/com/android/settings/display/DeviceStateAutoRotateSettingController.java [4]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/android/provider/Settings.java [5]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/com/android/internal/view/RotationPolicy.java;bpv=0 [6]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/packages/SettingsLib/DeviceStateRotationLock/src/com/android/settingslib/devicestate/DeviceStateAutoRotateSettingManager.java [7]: https://cs.android.com/android/platform/superproject/+/android-latest-release:packages/apps/Settings/res/values/config.xml;l=674;drc=485b59a37c1cd0af72ca706e0ba1094f4e7fef0e;l=674