इनपुट विधि संपादक समर्थन

इन प्रदर्शन-विशिष्ट क्षेत्रों में किए गए अपडेट नीचे दिए गए हैं:

एंड्रॉइड 10 नॉन-डिफॉल्ट डिस्प्ले पर चलने वाले ऐप्स के लिए सॉफ्टवेयर कीबोर्ड का समर्थन करता है।

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

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

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

सिस्टम यह निर्धारित करता है कि डिस्प्ले की सेटिंग्स के आधार पर किस मोड का उपयोग करना है जिस पर केंद्रित ऐप दिखाई देता है। अधिक जानकारी के लिए देखें:

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

चित्र 1. IME सॉफ़्टवेयर कीबोर्ड, जैसा कि लक्ष्य ऐप सहित, द्वितीयक डिस्प्ले पर दिखाई देता है

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

यदि डिस्प्ले ए पर कोई सक्रिय कनेक्शन है, और इनपुट फ़ील्ड डिस्प्ले बी पर इनपुट फोकस का अनुरोध करता है, तो निम्न प्रवाह होता है:

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

सुरक्षा प्रतिबंध

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

कार्यान्वयन

एंड्रॉइड 9 (और उससे पहले) में, IME केवल डिफ़ॉल्ट स्क्रीन पर उपलब्ध था, जैसा कि ऑन-स्क्रीन इनपुट विधियों में वर्णित है। एंड्रॉइड 10 (और उच्चतर) में, उपयोगकर्ता फोकस स्विच करके विभिन्न डिस्प्ले पर विभिन्न इनपुट टेक्स्ट फ़ील्ड के बीच स्विच कर सकता है, और IME विंडो सेकेंडरी डिस्प्ले पर चली जाती है।

WindowManager में कार्यान्वयन IME स्थिति को प्रबंधित करने के लिए इनपुट विधि विंडो (IME विंडो जहां सॉफ्ट कीबोर्ड खींचा जाता है) और इनपुट विधि लक्ष्य (वह विंडो जहां IME इनपुट जाता है) को ट्रैक करता है।

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

डिस्प्ले के बीच IME विंडो स्विच प्राप्त करने के लिए, एंड्रॉइड 10 निम्नलिखित लागू करता है:

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