توفُّر محرِّر أسلوب الإدخال

في ما يلي التعديلات التي تم إجراؤها على هذه المناطق الخاصة بالشاشة:

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

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

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

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

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

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

الشكل 1: لوحة المفاتيح البرمجية لمحرر أسلوب الإدخال كما تظهر على الشاشة الثانوية، بما في ذلك التطبيق المستهدَف

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

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

  1. يأتي اتصال إدخال جديد من حقل الإدخال على الشاشة "ب".
  2. تتحقّق InputMethodManagerService مما إذا كان يجب الموافقة على الاتصال.
  3. يتم اختيار شاشة لمحرر أسلوب الإدخال. إذا كانت الشاشة "ب" تتيح عرض أداة IME ومسموحًا لها بعرضها، يتم استخدام الشاشة "ب". بخلاف ذلك، يتم اختيار شاشة الجهاز الأساسية.
  4. إذا لم تكن الشاشة المحدّدة من الشاشة "أ"، تتم إعادة إنشاء الاتصال. يتم إيقاف InputMethodService ثم إنشاؤه مرة أخرى.

قيود الأمان

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

التنفيذ

في Android 9 (والإصدارات الأقدم)، كان محرر أسلوب الإدخال متاحًا فقط على الشاشة التلقائية، كما هو موضّح في طرق الإدخال على الشاشة. في Android 10 (والإصدارات الأحدث)، يمكن للمستخدم التبديل بين حقول إدخال النصوص المختلفة على شاشات مختلفة من خلال التبديل بين التركيز، وينتقل نافذة محرر أسلوب الإدخال إلى الشاشات الثانوية.

يتتبّع التنفيذ في WindowManager نافذة أسلوب الإدخال (نافذة محرر أسلوب الإدخال التي يتم رسم لوحة المفاتيح البرمجية فيها) والهدف من أسلوب الإدخال (النافذة التي يتم فيها إدخال بيانات محرر أسلوب الإدخال) لإدارة حالة محرر أسلوب الإدخال.

بالنسبة إلى InputMethodManagerService (IMMS)، لا يمكن لأي آلية مضمّنة أخرى نشر تغيير الشاشة إلى InputMethodService (IMS) وإعادة ضبط تنسيق لوحة المفاتيح في وقت التشغيل عند نقل التركيز إلى شاشة أخرى.

لتحقيق التبديل بين نافذة محرر أسلوب الإدخال بين الشاشات، ينفّذ Android 10 ما يلي:

  • يتم الآن تتبُّع نافذة محرر أسلوب الإدخال ونافذة هدف الإدخال لكل شاشة في DisplayContent#mInputMethodWindow وDisplayContent#mInputMethodTarget، حتى يتمكّن WindowManager (WM) من إدارة حالة تركيز محرر أسلوب الإدخال بشكل مستقل عن كل شاشة.
  • على جانب IMMS، عند تلقّي طلب التركيز من عميل تطبيق من الشاشة الخارجية من خلال ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus، يتم أولاً إلغاء ربط خدمة أسلوب الإدخال الحالية ثم إعادة ربط الخدمة لإعادة إرفاق رمز نافذة محرر أسلوب الإدخال الجديد للشاشة الخارجية في onServiceConnected().
  • على جانب IMS، بعد تلقّي IMS#attachToken، يحدث التدفق التالي:
    • يتم استدعاء ContextImpl#updateDisplay لتعديل شاشة سياق الخدمة في InputMethodService#attachToken(). يؤدي ذلك إلى استدعاء ViewGroup#addView() لتعديل تنسيق لوحة المفاتيح وتكييفها مع الشاشة المستهدَفة من خلال التحقّق من السياق الحالي.
    • بعد استدعاء DisplayContent#setInputMethodWindowLocked()، يرسل التنفيذ تغييرات ضبط الشاشة على مستوى العملية باستخدام WindowProcessController إلى عملية محرر أسلوب الإدخال لتجاوز الموارد وقياسات الشاشة.
    • يحصل عميل InputMethodService على الضبط الصحيح مع قياسات الشاشة الصحيحة بعد onConfigurationChanged() واستدعاء ViewGroup#addView() لإعادة تهيئة طريقة عرض الإدخال.