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

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

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.S>ecure<.DeviceStateRotationLockSetting. --
        integer-array name=&qu>ot;config<_per>Dev<iceSt>a<teRotationLo>ckDefaults>"
      <    >  ite<m0:1/>i<tem !-- CLOSED - >LOCKED --
            item1:0:2/item !-- HALF_OPENED - IGNORED an>d fallbac<k to>
      <     > <    device p>osture OPENE>D --
        <    >item2<:2/it>e<m !-- OPENED - UNL>OCKED --
            item3:0:0/item !-- REAR_DISPLAY - IGNORED an>d fal<lback 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 overla>y< --
    resou>rces
    <    !-- 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_>perDe<viceStateRotationLockDefaults". --
        string-array name="con>fig_setta<bleA>utoRotationDeviceStates<Descr>iptions&q<uot;>
        <    <>/span>it<emAuto-rotate when folded/item
            item@null/item !-- No description for state in >position <1 (i>t
            is not settable< by t>he us<er) --
          > < it>emAuto-rotate when unfolded/item
        /string-array
    /resources
    
  3. इन सेटिंग में प्रोग्राम के हिसाब से बदलाव करने के लिए, आपको सही एपीआई का इस्तेमाल करना होगा. इसके लिए, सेटिंग उपलब्ध कराने वाली कंपनियों को सीधे तौर पर नहीं लिखना होगा. ऐसा इसलिए, ताकि आपको एक जैसा अनुभव मिल सके:

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

      • SystemUI या लॉन्चर से, RotationPolicy#setRotationLock(...) का इस्तेमाल करें.
      • विंडो मैनेजर में जाकर, DisplayRotation#freezeRotation() या thawRotation() का इस्तेमाल करें.
    • किसी डिवाइस की स्थिति के लिए, स्क्रीन रोटेशन लॉक करने की सेटिंग बदलने के लिए (DEVICE_STATE_ROTATION_LOCK में बदलाव करता है):

      • requestDeviceStateAutoRotateSettingChange(...) एट्रिब्यूट के लिए, RotationPolicy या DeviceStateAutoRotateSettingManager में से किसी एक का इस्तेमाल करें.

लागू करने से जुड़ी जानकारी

यहां दिए गए सेक्शन में, फ़ोल्ड किए जा सकने वाले डिवाइस के लिए, अपने-आप स्क्रीन रोटेट होने की सुविधा को कंट्रोल करने वाली सेटिंग और मुख्य क्लास के बारे में बताया गया है.

सेटिंग

सिस्टम, स्क्रीन के अपने-आप दिशा बदलने (ऑटो-रोटेट) की सुविधा को मैनेज करने के लिए, इन दो सेटिंग का इस्तेमाल करता है:

  • 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).

मुख्य क्लास

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

Validation

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