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

डिसप्ले से जुड़ी इन खास बातों में किए गए अपडेट के बारे में यहां बताया गया है:

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

नॉन-डिफ़ॉल्ट डिसप्ले पर चल रहे ऐप्लिकेशन

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

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

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

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

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

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

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

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

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

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

लागू करना

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

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

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

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

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