सुझावों को घुमाना

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

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

रोटेशन लॉक मोड, डिवाइस के रोटेशन में बदलाव होने पर नेविगेशन बार में एक बटन दिखाकर काम करता है. ऐसा करने के लिए, डिवाइस का ओरिएंटेशन सेंसर चालू रहना चाहिए, भले ही ऑटो-रोटेट की सुविधा बंद हो. इस बटन पर टैप करने से, डिवाइस के रोटेशन की उपयोगकर्ता की प्राथमिकता (Settings.System.USER_ROTATION) सेट हो जाती है. WindowManager, सिस्टम के रोटेशन को बदलने के लिए, इस प्राथमिकता के साथ-साथ टॉप ऐक्टिविटी और सिस्टम की स्थिति की अन्य जानकारी का इस्तेमाल करता है. WindowManager, किसी दूसरी ऐक्टिविटी पर स्विच करते समय, सिस्टम को किस रोटेशन में रेंडर करना है, यह तय करते समय उपयोगकर्ता के रोटेशन की प्राथमिकता का इस्तेमाल करता रहता है.

इस GIF में, लैंडस्केप ओरिएंटेशन में मौजूद फ़ोन की स्क्रीन को पोर्ट्रेट ओरिएंटेशन में दिखाया गया है. उपयोगकर्ता से पूछने के लिए एक आइकॉन दिखता है कि क्या उसे स्क्रीन ओरिएंटेशन को लैंडस्केप में बदलना है.
पहली इमेज. "होम बटन पर ऊपर की ओर स्वाइप करें" जेस्चर चालू होने पर, सुझाव बटन को घुमाएं

एक गतिविधि से दूसरी गतिविधि पर जाने पर, उपयोगकर्ता रोटेशन की प्राथमिकता को बनाए रखा जाना चाहिए. हालांकि, ज़्यादातर फ़ोन इस्तेमाल करने वाले लोग, लैंडस्केप मोड का इस्तेमाल सिर्फ़ कुछ समय के लिए करना चाहते हैं. इसलिए, हमने नैचुरल ओरिएंटेशन बायस जोड़ा है. जब भी डिवाइस के ऑरियंटेशन में बदलाव होता है, तो उपयोगकर्ता के डिवाइस के ऑरियंटेशन की प्राथमिकता को रीसेट कर दिया जाता है. ज़्यादातर फ़ोन के लिए, डिवाइस का नेचुरल ओरिएंटेशन पोर्ट्रेट (0º) होता है. डिवाइस के रोटेशन की सेटिंग को रीसेट करने की वजह से, अक्सर डिवाइस के रोटेशन की सेटिंग में बदलाव होता है. ऐसा सिर्फ़ पोर्ट्रेट मोड में काम करने वाले ऐप्लिकेशन का इस्तेमाल करने, फ़ोन को लॉक करने या लॉन्चर वर्कस्पेस पर वापस जाने पर होता है.

पिछले एक दशक में, उपयोगकर्ताओं के लिए रोटेशन इंटरैक्शन में काफ़ी बदलाव नहीं हुआ है. नेविगेशन बार में बटन की पोज़िशन और रोटेशन के साथ उपयोगकर्ताओं के पिछले इतिहास को देखते हुए, हो सकता है कि उन्हें यह सुविधा ढूंढने में मुश्किल हो. इस वजह से, हमने 'घुमाएं' बटन में एक 'शुरुआत का मोड' जोड़ा है. यह मोड, बटन दिखने पर उसे हाइलाइट करता है. शुरुआती मोड का व्यवहार सिर्फ़ बटन के शुरुआती कुछ इंटरैक्शन के लिए होता है. इसके बाद, शुरुआती मोड बंद हो जाता है.

सोर्स

Android 9 में, स्क्रीन घुमाने के सुझावों की सुविधा जोड़ी गई है. ज़्यादातर बदलाव, इन फ़ाइलों में किए गए हैं.

  • services/.../server/policy/PhoneWindowManager.java:
    • WindowOrientationListener के आउटपुट का इस्तेमाल करने वाले हुक (MyOrientationListener, डिवाइस के घूमने का पता लगाने के लिए, सेंसर की निगरानी करने की ज़िम्मेदारी)
    • ऑटो-रोटेट की सुविधा बंद होने पर भी, WindowOrientationListener को चालू रखता है (needSensorRunningLp() देखें)
    • उपयोगकर्ता के रोटेशन की प्राथमिकता, गतिविधि की सबसे ऊपर वाली screenOrientation सेटिंग, और सिस्टम की स्थिति (rotationForOrientationLw() देखें) के हिसाब से, सिस्टम रोटेशन का हिसाब लगाता है
    • यह पता लगाएं कि टॉप ऐक्टिविटी, किसी दिए गए रोटेशन में घूम सकती है या नहीं (देखें isRotationChoicePossible())
  • SystemUI/.../statusbar/phone/NavigationBarFragment:
    • इससे यह तय होता है कि PhoneWindowManager से मिले सुझाव के कॉलबैक के दौरान, रोटेशन पर नेविगेशन बार का बटन दिखना चाहिए या नहीं (onRotationProposal() देखें)
    • यह तय करता है कि नेविगेशन बार को घुमाने के लिए बटन कब छिपाया जाए (setRotateSuggestionButtonState(false) को कॉल देखें)
    • बटन के टाइम आउट को मैनेज करता है. इसमें, नेविगेशन बार के छिपे होने (आम तौर पर फ़ुल स्क्रीन में) के मामले में भी बटन के टाइम आउट को मैनेज किया जाता है
    • डिवाइस के सामान्य ओरिएंटेशन (mRotationWatcher) पर वापस आने पर, उपयोगकर्ता की प्राथमिकता को रीसेट करता है
    • नेविगेशन बार के बटन के ऐनिमेशन के लिए सही स्टाइल चुनता है. इसे NavigationBarView में लागू किया जाता है. onRotationProposal() देखें
    • इसमें खास ऐनिमेशन के साथ-साथ, परिचय मोड का लॉजिक जोड़ा गया है (Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED के रेफ़रंस देखें)
    • रोटेशन को बंद करने के लिए, disable2 फ़्लैग लागू करता है (disable() देखें)
  • SystemUI/.../statusbar/phone/NavigationBarView.java:
    • स्टाइल बटन के आइकॉन का ऐनिमेशन, जो रोटेशन के हिसाब से दिखता है (देखें updateRotateSuggestionButtonStyle())
    • बटन के दिखने की सेटिंग में बदलाव करता है (setRotateButtonVisibility() देखें). इसमें, सुलभता से जुड़ी कुछ सेवाएं चालू होने पर, स्क्रीन घुमाने के बटन को छिपाने का लॉजिक भी शामिल है. यह लॉजिक, सबसे दाईं ओर मौजूद नेविगेशन बार के बटन की रैंकिंग के हिसाब से काम करता है
  • SystemUI/res/layout/menu_ime.xml:
    • इसमें घुमाने के बटन के लिए एक नया KeyButtonView शामिल है, जो मेन्यू और IME/कीबोर्ड चुनने वाले टूल के ऊपर, लेकिन सुलभता बटन के नीचे होता है
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml:
    • नेविगेशन बार के बटन को ऐनिमेट करने के लिए इस्तेमाल किया जाने वाला जटिल AnimatedVectorDrawable
    • SystemUI/res/values/styles.xml में स्टाइल का इस्तेमाल, घुमाव के शुरू और खत्म होने के ऐंगल को सेट करने के लिए किया जाता है, ताकि एक ही ड्रॉबल का इस्तेमाल, शुरू और खत्म होने के अलग-अलग ऐंगल के लिए किया जा सके
    • आइकॉन को टिंट करने की सुविधा, TintedKeyButtonDrawable से सेट की जाती है

लागू करना

Android 9 में, स्क्रीन घुमाने के सुझावों को उन डिवाइसों पर काम करने के लिए सभी ज़रूरी बदलाव किए गए हैं जिनमें सॉफ़्टवेयर नेविगेशन बटन (बैक, होम वगैरह) का इस्तेमाल किया जाता है.

डिवाइस बनाने वाली जिन कंपनियों के डिवाइसों में हार्डवेयर नेविगेशन बटन होते हैं और जो इस सुविधा को लागू करना चाहती हैं उन्हें अपना सिस्टम यूज़र इंटरफ़ेस (यूआई) डिज़ाइन करना होगा और उसे लागू करना होगा. इसके अलावा, वे इस सुविधा को बंद भी कर सकती हैं. हमारा सुझाव है कि जो भी नया इंटरफ़ेस जोड़ा जाए वह डिवाइस के मौजूदा रोटेशन के हिसाब से 90º या 180º पर होने पर आसानी से इस्तेमाल किया जा सके. साथ ही, उसे तुरंत ऐक्सेस किया जा सके. इन वजहों से, सूचनाओं का इस्तेमाल करने का सुझाव नहीं दिया जाता. ऐसा आईएमई/कीबोर्ड पिकर के लिए किया जाता है.

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

यह ज़रूरी है कि डिवाइस के अपने-आप घूमने की सुविधा बंद होने पर, अगर किसी भी वजह से डिवाइस अपने-आप घूमने की सुविधा चालू हो जाती है, तो उपयोगकर्ता के डिवाइस के घूमने की प्राथमिकता (Settings.System.USER_ROTATION) को डिवाइस के अपने-आप घूमने की सुविधा पर रीसेट कर दिया जाए. ऐसा करने के लिए, यहां दिया गया तरीका अपनाएं (NavigationBarFragment.mRotationWatcher देखें).

StatusBarManager.disable2 में एक नया फ़्लैग जोड़ा गया है. इससे, रोटेशन के सुझावों को कुछ समय के लिए दिखने से रोका जा सकता है. StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS देखें. इस फ़्लैग का इस्तेमाल, सभी ऐप्लिकेशन में किया जाना चाहिए. ऐसा इसलिए, क्योंकि इसका इस्तेमाल सिस्टम के ज़रूरी ऐप्लिकेशन करते हैं. इनमें सेटअप विज़र्ड भी शामिल है. लागू करने का यह तरीका, इस सुविधा के साथ काम करता है (NavigationBarFragment.disable() देखें).

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

पसंद के मुताबिक बनाएं

डिवाइस के रोटेशन के सुझाव सिर्फ़ रोटेशन लॉक मोड (डिवाइस अपने-आप रोटेट होने की सुविधा बंद) में दिखते हैं. इसलिए, यह चुना जा सकता है कि नए इंस्टॉल के लिए यह सुविधा डिफ़ॉल्ट रूप से चालू हो या नहीं. इसके लिए, डिवाइस के अपने-आप रोटेट होने की सुविधा को डिफ़ॉल्ट रूप से बंद रखें. डिफ़ॉल्ट बदलाव करने के लिए, SettingsProvider/res/values/defaults.xml में def_accelerometer_rotation देखें.

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

पुष्टि करें

जांच के लिए, गेटिंग Settings.Secure वैल्यू में बदलाव करके, इस सुविधा को बंद और चालू किया जा सकता है. ऐसा करने के लिए, ऐडमिन ऐक्सेस वाले adb इंस्टेंस से यह कमांड चलाएं:

adb shell settings put secure show_rotation_suggestions <x>

बंद करने के लिए x को 0 और चालू करने के लिए 1 पर सेट करें.

जांच के लिए, इससे जुड़ी Settings.Secure वैल्यू में बदलाव करके, शुरुआती मोड को रीसेट किया जा सकता है. ऐसा करने के लिए, ऐडमिन ऐक्सेस वाले adb इंस्टेंस से यह कमांड चलाएं:

adb shell settings put secure num_rotation_suggestions_accepted 0