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

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

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

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

यह GIF एक फ़ोन को लैंडस्केप ओरिएंटेशन में और स्क्रीन पोर्ट्रेट ओरिएंटेशन में दिखाता है। एक आइकन उपयोगकर्ता से पूछता हुआ दिखाई देता है कि क्या वे अपने स्क्रीन ओरिएंटेशन को लैंडस्केप में बदलना चाहते हैं।
आकृति 1 । "होम बटन पर ऊपर की ओर स्वाइप करें" जेस्चर सक्षम करके सुझाव बटन को घुमाएँ

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

पिछले दशक में उपयोगकर्ताओं के लिए रोटेशन इंटरैक्शन में बहुत अधिक बदलाव नहीं आया है। नेविगेशन बार में रोटेशन और बटन की स्थिति के साथ उनके पूर्व इतिहास को देखते हुए उपयोगकर्ताओं को इस सुविधा को खोजना मुश्किल हो सकता है। इस कारण से, हमने रोटेट बटन में एक परिचय मोड जोड़ा है जो दिखाई देने पर इसे हाइलाइट करता है। परिचय मोड व्यवहार केवल पहले कुछ बटन इंटरैक्शन के लिए होता है जिसके बाद परिचय मोड अक्षम हो जाता है।

स्रोत

एंड्रॉइड 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 के माध्यम से सेट की गई है

कार्यान्वयन

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

डिवाइस निर्माता जो हार्डवेयर नेविगेशन कुंजियों के साथ डिवाइस बनाते हैं और इस सुविधा को लागू करना चाहते हैं, उन्हें अपने स्वयं के सिस्टम यूआई खर्च को डिजाइन और कार्यान्वित करने या सुविधा को अक्षम करने की आवश्यकता होगी। यह अनुशंसा की जाती है कि जब डिवाइस को वर्तमान सिस्टम रोटेशन के लिए 90º या 180º पर रखा जाता है और तेजी से पहुंच योग्य हो तो किसी भी पेश की गई सतह का उपयोग करना आसान हो। इन कारणों से, सूचनाओं के उपयोग की अनुशंसा नहीं की जाती है (जैसा कि IME/कीबोर्ड पिकर के लिए किया जाता है)।

इस सुविधा का उपयोग करने के लिए हार्डवेयर आवश्यकताएँ ऑटो-रोटेट का उपयोग करने की आवश्यकताओं के समान हैं।

कार्यान्वयन की स्थिरता के लिए यह आवश्यक है कि उपयोगकर्ता रोटेशन प्राथमिकता ( 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 shell settings put secure show_rotation_suggestions <x>

ऑफ के लिए x को 0 और ऑन के लिए 1 सेट करें।

परीक्षण के लिए, संबंधित Settings.Secure मान को बदलकर परिचय मोड को रीसेट किया जा सकता है। विशेषाधिकार प्राप्त एडीबी इंस्टेंस से निम्नलिखित कमांड चलाकर इसे आसानी से पूरा किया जा सकता है:

adb shell settings put secure num_rotation_suggestions_accepted 0