دعم محرر أسلوب الإدخال

يتم توفير التحديثات التي تم إجراؤها على هذه المناطق الخاصة بالعرض أدناه:

يدعم Android 10 لوحة المفاتيح البرمجية للتطبيقات التي تعمل على شاشة غير افتراضية.

التطبيقات التي تعمل على شاشة غير افتراضية

من حيث الشاشة التي تعرض لوحة مفاتيح برنامج محرر أسلوب الإدخال (IME)، هناك أوضاع مختلفة. تظهر لوحة المفاتيح البرمجية على:

  • نفس الشاشة التي يظهر عليها التطبيق الذي تم التركيز عليه.
  • العرض الافتراضي أثناء تشغيل التطبيق الذي يتم التركيز عليه على شاشة غير افتراضية.
  • لا يوجد عرض على الإطلاق.

يحدد النظام الوضع الذي سيتم استخدامه بناءً على إعدادات الشاشة التي يظهر عليها التطبيق الذي يتم التركيز عليه. لمزيد من التفاصيل، راجع:

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

الشكل 1. لوحة مفاتيح برنامج IME كما تظهر على الشاشة الثانوية، بما في ذلك التطبيق المستهدف

يستخدم النظام محرر أسلوب إدخال (IME) واحدًا، لكن يمكنه التبديل بين شاشات العرض لمتابعة تركيز المستخدم. يتوقع Android 10 تلقائيًا أن تقوم جميع أدوات IME التابعة لجهات خارجية بمراجعة التخطيط وتغيير حجمه وفقًا لحجم العرض الجديد عند إنشائه.

إذا كان هناك اتصال نشط على الشاشة A، ويطلب حقل الإدخال التركيز على الإدخال على الشاشة B، فسيحدث التدفق التالي:

  1. يأتي اتصال الإدخال الجديد من حقل الإدخال الموجود على الشاشة B.
  2. يتحقق InputMethodManagerService من ضرورة الموافقة على الاتصال.
  3. يتم تحديد عرض لـ IME. إذا كانت الشاشة B تدعم عرض محرر أسلوب الإدخال (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 ، فإنه يقوم أولاً بإلغاء ربط خدمة أسلوب الإدخال الحالي ثم يعيد ربط الخدمة لإعادة توصيل محرر أسلوب الإدخال (IME) الجديد رمز النافذة للعرض الخارجي في onServiceConnected() .
  • على جانب IMS، بعد تلقي IMS#attachToken ، يحدث التدفق التالي:
    • يتم استدعاء ContextImpl#updateDisplay لتحديث عرض سياق الخدمة في InputMethodService#attachToken() . يؤدي هذا إلى استدعاء ViewGroup#addView() لمراجعة تخطيط لوحة المفاتيح والتكيف مع العرض المستهدف للتحقق من السياق الحالي.
    • بعد استدعاء DisplayContent#setInputMethodWindowLocked() ، يرسل التطبيق تغييرات تكوين العرض على مستوى العملية باستخدام WindowProcessController إلى عملية IME لتجاوز الموارد وعرض المقاييس.
    • يحصل عميل InputMethodService على التكوين الصحيح بمقاييس العرض الصحيحة بعد onConfigurationChanged() واستدعاء ViewGroup#addView() لإعادة تهيئة عرض الإدخال.