इनपुट के तरीके में बदलाव करने के लिए सहायता

डिसप्ले के हिसाब से इन सेटिंग में किए गए अपडेट यहां दिए गए हैं:

Android 10, डिफ़ॉल्ट डिसप्ले के अलावा किसी दूसरे डिसप्ले पर काम करने वाले ऐप्लिकेशन के लिए, सॉफ़्टवेयर कीबोर्ड की सुविधा देता है.

डिफ़ॉल्ट डिसप्ले के अलावा किसी दूसरे डिसप्ले पर चल रहे ऐप्लिकेशन

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

  • वही डिसप्ले जिस पर फ़ोकस किया गया ऐप्लिकेशन दिखता है.
  • फ़ोकस किया गया ऐप्लिकेशन, डिफ़ॉल्ट डिसप्ले के अलावा किसी दूसरे डिसप्ले पर चलने पर, डिफ़ॉल्ट डिसप्ले.
  • नहीं, बिलकुल न दिखाएं.

जिस डिसप्ले पर फ़ोकस किया गया ऐप्लिकेशन दिखता है उसकी सेटिंग के आधार पर, सिस्टम यह तय करता है कि किस मोड का इस्तेमाल करना है. ज़्यादा जानकारी के लिए, यह देखें:

  • WindowManager#setDisplayImePolicy()
  • WindowManager#getDisplayImePolicy()

पहली इमेज. IME सॉफ़्टवेयर कीबोर्ड, जैसा कि सेकंडरी डिसप्ले पर दिखता है. इसमें टारगेट ऐप्लिकेशन भी शामिल है

यह सिस्टम एक IME का इस्तेमाल करता है, लेकिन उपयोगकर्ता के फ़ोकस का पालन करने के लिए, डिसप्ले के बीच शिफ़्ट हो सकता है. Android 10 में, पहले और तीसरे पक्ष के सभी IME अपने-आप लेआउट में बदलाव करते हैं. साथ ही, डिसप्ले के नए साइज़ के हिसाब से, IME का साइज़ भी अपने-आप बदल जाता है.

अगर डिसप्ले A पर कोई चालू कनेक्शन है और कोई इनपुट फ़ील्ड, डिसप्ले B पर इनपुट फ़ोकस का अनुरोध करता है, तो यह फ़्लो होता है:

  1. डिसप्ले B के इनपुट फ़ील्ड से एक नया इनपुट कनेक्शन आता है.
  2. InputMethodManagerService जांचता है कि कनेक्शन को स्वीकार करना है या नहीं.
  3. IME के लिए कोई डिसप्ले चुना गया है. अगर डिसप्ले B के साथ IME है और उसे दिखाने की अनुमति है, तो B का इस्तेमाल किया जाता है. ऐसा न करने पर, डिवाइस का प्राइमरी डिसप्ले चुना जाता है.
  4. अगर चुना गया डिसप्ले, डिसप्ले A से नहीं है, तो कनेक्शन फिर से स्थापित हो जाता है. InputMethodService को मिटा दिया जाता है और फिर से बनाया जाता है.

सुरक्षा से जुड़ी पाबंदी

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

लागू करना

Android 9 और उससे पहले के वर्शन में, IME सिर्फ़ डिफ़ॉल्ट स्क्रीन पर उपलब्ध था, जैसा कि स्क्रीन पर दिखने वाले इनपुट के तरीकों में बताया गया है. Android 10 और उसके बाद के वर्शन में, फ़ोकस को स्विच करके उपयोगकर्ता अलग-अलग डिसप्ले पर, अलग-अलग इनपुट टेक्स्ट फ़ील्ड के बीच स्विच कर सकते हैं. इससे IME विंडो, सेकंडरी डिसप्ले पर काम करती है.

WindowManager में लागू करने पर, IME की स्थिति को मैनेज करने के लिए, इनपुट के तरीके की विंडो (IME विंडो, जहां सॉफ़्ट कीबोर्ड बनाया जाता है) और इनपुट के तरीके के टारगेट (वह विंडो जहां IME इनपुट जाता है) को ट्रैक किया जाता है.

InputMethodManagerService (IMMS) के लिए, कोई भी अन्य डिफ़ॉल्ट तरीका, डिसप्ले में हुए बदलाव को InputMethodService (IMS) पर लागू नहीं कर सकता. साथ ही, फ़ोकस को किसी दूसरे डिसप्ले पर ले जाने पर, रनटाइम के दौरान कीबोर्ड लेआउट को फिर से कॉन्फ़िगर नहीं कर सकता.

एक डिसप्ले से दूसरे पर IME विंडो स्विच करने के लिए, Android 10 ये काम करता है:

  • IME और इनपुट टारगेट विंडो को अब DisplayContent#mInputMethodWindow और DisplayContent#mInputMethodTarget में हर डिसप्ले के हिसाब से ट्रैक किया जाता है, ताकि WindowManager (WM) हर डिसप्ले के लिए, IME फ़ोकस की स्थिति को अलग से मैनेज कर सके.
  • IMMS के मामले में, जब ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus के ज़रिए बाहरी डिसप्ले से ऐप्लिकेशन क्लाइंट का फ़ोकस अनुरोध मिलता है, तो यह पहले मौजूदा इनपुट विधि की सेवा को अनबाइंड करता है. इसके बाद, onServiceConnected() में बाहरी डिसप्ले के लिए नया IME विंडो टोकन फिर से अटैच करने के लिए, सेवा को फिर से बांधता है.
  • आईएमएस की ओर से, IMS#attachToken मिलने के बाद, यह फ़्लो होता है:
    • ContextImpl#updateDisplay को InputMethodService#attachToken() में सेवा के कॉन्टेक्स्ट के डिसप्ले को अपडेट करने के लिए कॉल किया जाता है. यह कीबोर्ड के लेआउट में बदलाव करने और मौजूदा कॉन्टेक्स्ट की जांच करके, टारगेट डिसप्ले के हिसाब से बदलाव करने के लिए, ViewGroup#addView() को कॉल करता है.
    • DisplayContent#setInputMethodWindowLocked() को कॉल करने के बाद, लागू करने की प्रोसेस, IME प्रोसेस में WindowProcessController का इस्तेमाल करके, प्रोसेस-लेवल के डिसप्ले कॉन्फ़िगरेशन में बदलाव भेजती है. इससे, संसाधनों और डिसप्ले मेट्रिक को बदला जा सकता है.
    • InputMethodService क्लाइंट को onConfigurationChanged() के बाद, सही डिसप्ले मेट्रिक के साथ सही कॉन्फ़िगरेशन मिलता है और इनपुट व्यू को फिर से शुरू करने के लिए ViewGroup#addView() कॉल किया जाता है.