इनपुट के तरीके के संपादक से जुड़ी सहायता

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

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

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

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

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

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

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

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

यह सिस्टम, एक IME का इस्तेमाल करता है. हालांकि, उपयोगकर्ता के फ़ोकस को ट्रैक करने के लिए, यह डिसप्ले के बीच स्विच कर सकता है. Android 10 में, पहले और तीसरे पक्ष के सभी 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 की ओर से, IMS#attachToken मिलने के बाद, यह फ़्लो होता है:
    • ContextImpl#updateDisplay को InputMethodService#attachToken() में सेवा के कॉन्टेक्स्ट के डिसप्ले को अपडेट करने के लिए कॉल किया जाता है. यह कीबोर्ड के लेआउट में बदलाव करने और मौजूदा कॉन्टेक्स्ट की जांच करके, टारगेट डिसप्ले के हिसाब से बदलाव करने के लिए, ViewGroup#addView() को कॉल करता है.
    • DisplayContent#setInputMethodWindowLocked() को कॉल करने के बाद, लागू करने की प्रोसेस, IME प्रोसेस में WindowProcessController का इस्तेमाल करके, प्रोसेस-लेवल के डिसप्ले कॉन्फ़िगरेशन में बदलाव भेजती है. इससे, संसाधनों और डिसप्ले मेट्रिक को बदला जा सकता है.
    • InputMethodService क्लाइंट को onConfigurationChanged() के बाद, सही डिसप्ले मेट्रिक के साथ सही कॉन्फ़िगरेशन मिलता है. साथ ही, इनपुट व्यू को फिर से शुरू करने के लिए ViewGroup#addView() कॉल भी मिलता है.