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

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

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

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

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

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

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

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

  • DisplayWindowSettings#shouldShowImeLocked()
  • DisplayWindowSettings#setShouldShowImeLocked()

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

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

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

  1. يأتي اتصال الإدخال الجديد من حقل الإدخال المعروض على الشاشة B.
  2. يتحقق InputMethodManagerService إذا كان ينبغي الموافقة على الاتصال.
  3. يتم تحديد عرض لمحرر أسلوب الإدخال (IME). إذا كان العرض B يدعم إظهار محرر أسلوب الإدخال ويسمح بعرضه ، فسيتم استخدام B. خلاف ذلك ، يتم تحديد عرض الجهاز الأساسي.
  4. إذا لم تكن الشاشة المختارة من العرض A ، فسيتم إعادة الاتصال. تم إتلاف InputMethodService ثم إنشائه مرة أخرى.

قيود أمنية

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

تطبيق

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

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

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

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

  • يتم الآن تعقب نافذة IME والإدخال الهدف لكل عرض في DisplayContent#mInputMethodWindow و DisplayContent#mInputMethodTarget ، بحيث يمكن لـ WindowManager (WM) إدارة حالة تركيز محرر أسلوب الإدخال بشكل مستقل عن كل شاشة عرض.
  • على جانب 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() لإعادة تهيئة عرض الإدخال.

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

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

الشكل 2. نموذج لمحرر أسلوب الإدخال متعدد الجلسات

الشكل 3. نموذج لمحرر أسلوب الإدخال متعدد الجلسات

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

في Android 10 ، يتم تنفيذ دعم محرر أسلوب الإدخال متعدد الجلسات مع خدمات نظام منفصلة مع مجموعة مختلفة من واجهات برمجة التطبيقات ووظائف منخفضة. محرر أسلوب الإدخال متعدد الجلسات غير متوافق مع أدوات تحرير أسلوب الإدخال الحالية. يمكن استخدام خدمة جلسة متعددة أو جلسة واحدة ، ولكن ليس كليهما.

لا يمكن استخدام أدوات تحرير أسلوب الإدخال (IME) الموجودة في Android والتي تم إنشاؤها في أعلى فئة InputMethodService نظرًا لافتراض إمكانية التركيز على عميل واحد لمحرر أسلوب الإدخال في نفس الوقت قبل تقديم واجهات برمجة تطبيقات Android IME في Android 1.5 والعديد من واجهات برمجة التطبيقات العامة في InputMethodService يعتمد بالفعل بشكل كبير على هذا الافتراض. ومع ذلك ، فإن تحديث فئة InputMethodService لدعم سيناريو متعدد العملاء يمثل تحديًا للأسباب التالية:

  1. سيؤدي القيام بذلك إلى إدخال قدر غير مقبول من التعقيد في InputMethodService ، والذي يصعب الحفاظ عليه بالفعل.
  2. لا يزال مطورو محرر أسلوب الإدخال (IME) بحاجة إلى تحديث التنفيذ الخاص بهم حتى يتمكنوا من دعم الطلبات المتوازية من العديد من عملاء محرر أسلوب الإدخال المركّز ، الأمر الذي قد يتطلب إعادة تصميم غير بديهية من جانبهم (مثل وحدة فك ترميز الإدخال وقاعدة بيانات محفوظات الكتابة).
  3. من المتوقع أن تتطور حالات الاستخدام الفعلي لعملاء محرر أسلوب الإدخال المتعدد بسرعة ، لذا فإن البروتوكول الجديد غير مستقر وغير جاهز للعرض باعتباره واجهات برمجة تطبيقات عامة.

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

يوجد نموذج لمحرر أسلوب الإدخال متعدد الجلسات موجود في development/samples/MultiClientInputMethod .

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

  1. اضبط config_perDisplayFocusEnabled على " true ".
  2. قم بتشغيل هذه الأوامر:
    1. $ make -j MultiClientInputMethod
    2. $ adb install -r $OUT/system/priv-app/MultiClientInputMethod/MultiClientInputMethod.apk
    3. $ adb root
    4. $ adb shell setprop persist.debug.multi_client_ime \
      com.example.android.multiclientinputmethod/.MultiClientInputMethod
    5. $ adb reboot
  3. جرب سيناريوهات متعددة لإدخال النص.

تطبيق

راجع MultiClientInputMethodManagerService للحصول على تفاصيل التنفيذ.