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

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

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

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

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

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

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

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

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

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