डिवाइस की स्थिति के आधार पर, स्क्रीन को अपने-आप घुमाने की सेटिंग

फ़ोल्ड किए जा सकने वाले डिवाइसों के लिए, स्क्रीन रोटेशन के व्यवहार को डिवाइस की फ़िज़िकल स्थिति के हिसाब से ऑप्टिमाइज़ किया जा सकता है. इससे, उपयोगकर्ताओं को बेहतर अनुभव मिलता है. उदाहरण के लिए, स्क्रीन को अपने-आप रोटेट होने के लिए सेट किया जा सकता है. ऐसा तब होगा, जब डिवाइस को टैबलेट की तरह खोला जाएगा. हालांकि, डिवाइस को फ़ोल्ड करने पर, स्क्रीन पोर्ट्रेट मोड में लॉक हो जाएगी.

Android 13 से, Android में डिवाइस की स्थितियों के आधार पर, ऑटो-रोटेट की सेटिंग को पसंद के मुताबिक बनाने की सुविधा है. जैसे, फ़ोल्ड किया गया, खोला गया या आधा फ़ोल्ड किया गया (टेबलटॉप मोड).

डिवाइस की स्थिति के आधार पर, ऑटो-रोटेट सेटिंग वाला पेज

पहली इमेज. डिवाइस की स्थिति के आधार पर ऑटो-रोटेट की सेटिंग, जैसा कि उपयोगकर्ता को दिखती है.

डिवाइस की स्थिति के आधार पर ऑटो-रोटेट की सेटिंग चालू करना

डिवाइस की स्थिति के आधार पर ऑटो-रोटेट की सुविधा चालू करने और इसे कॉन्फ़िगर करने के लिए, फ़्रेमवर्क की config.xml फ़ाइल के लिए डिवाइस ओवरले बनाएं. इसके लिए, यह तरीका अपनाएं:

  1. अपने डिवाइस के ओवरले 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 स्थिति के लिए प्राथमिकता अपडेट हो जाती है.
  2. उपयोगकर्ता की ओर से सेट की जा सकने वाली, डिवाइस की हर स्थिति के लिए, ब्यौरे कॉन्फ़िगर करें. अपने डिवाइस के सेटिंग ऐप्लिकेशन के ओवरले में, 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>
    
  3. इन सेटिंग में प्रोग्राम के ज़रिए बदलाव करने के लिए, सेटिंग के प्रोवाइडर को सीधे तौर पर लिखने के बजाय, सही एपीआई का इस्तेमाल करें. इससे, सेटिंग के व्यवहार में गड़बड़ी होने से बचा जा सकेगा:

    • रोटेशन लॉक की मौजूदा स्थिति बदलने के लिए (ACCELEROMETER_ROTATION में बदलाव करता है):

      • SystemUI या लॉन्चर से, RotationPolicy#setRotationLock(...) का इस्तेमाल करें.
      • विंडो मैनेजर से, DisplayRotation#freezeRotation() या thawRotation() का इस्तेमाल करें.
    • डिवाइस की किसी खास स्थिति के लिए, रोटेशन लॉक की प्राथमिकता बदलने के लिए (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: डिवाइस की स्थिति के सामान्य आइडेंटिफ़ायर और इस सुविधा के इस्तेमाल किए जाने वाले डिवाइस की स्थिति के आइडेंटिफ़ायर के बीच कन्वर्ज़न करता है.

सत्यापन

इस सुविधा का व्यवहार, ओईएम के कॉन्फ़िगरेशन पर निर्भर करता है. इसलिए, इसके लिए सीटीएस के खास टेस्ट नहीं हैं. आपको मैन्युअल तरीके से टेस्ट करना होगा, ताकि यह पुष्टि की जा सके कि डिवाइस की अलग-अलग फ़िज़िकल स्थितियों के बीच ट्रांज़िशन होने पर, ऑटो-रोटेट की सेटिंग में उम्मीद के मुताबिक बदलाव होता है.