پشتیبانی ویرایشگر روش ورودی

به‌روزرسانی‌های انجام‌شده در این بخش‌های ویژه نمایشگر در زیر ارائه شده است:

Android 10 از صفحه‌کلید نرم‌افزاری برای برنامه‌هایی که در نمایشگر غیرپیش‌فرض اجرا می‌شوند پشتیبانی می‌کند.

برنامه‌هایی که در نمایشگر غیرپیش‌فرض اجرا می‌شوند

ازنظر اینکه کدام نمایشگر صفحه‌کلید نرم‌افزاری «ویرایشگر روش ورودی» (IME) را نشان دهد، حالت‌های مختلفی وجود دارد. صفحه‌کلید نرم‌افزاری در موارد زیر نشان داده می‌شود:

  • نمایشگر یکسان که برنامه کانونی‌شده در آن ظاهر می‌شود.
  • نمایشگر پیش‌فرض درحالی‌که برنامه متمرکز در نمایشگر غیرپیش‌فرض درحال اجرا است.
  • اصلاً نمایشگری وجود ندارد.

سیستم براساس تنظیمات نمایشگری که برنامه متمرکزشده در آن نشان داده می‌شود، تعیین می‌کند از کدام حالت استفاده کند. برای جزئیات بیشتر، به اینجا مراجعه کنید:

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

شکل ۱. صفحه‌کلید نرم‌افزاری IME همان‌طور که در نمایشگر ثانویه نشان داده می‌شود، ازجمله برنامه هدف

سیستم از یک «روش ورودی» استفاده می‌کند، اما می‌تواند بین نمایشگرها جابه‌جا شود تا تمرکز کاربر را دنبال کند. ‫Android 10 به‌طور خودکار انتظار دارد که همه «روش‌های ورودی» شخص اول و سوم هنگام ایجاد شدن، چیدمان را اصلاح کنند و اندازه را براساس اندازه نمایشگر جدید تغییر دهند.

اگر اتصال فعالی در نمایشگر الف وجود داشته باشد و فیلد ورودی‌ای درخواست تمرکز ورودی در نمایشگر ب کند، جریان زیر رخ می‌دهد:

  1. اتصال ورودی جدید از فیلد ورودی در نمایشگر B می‌آید.
  2. ‫InputMethodManagerService بررسی می‌کند که آیا اتصال باید تأیید شود یا نه.
  3. نمایشگری برای IME انتخاب شده است. اگر نمایشگر B از نمایش IME پشتیبانی کند و اجازه نمایش آن را داشته باشد، از B استفاده می‌شود. درغیراین‌صورت، نمایشگر دستگاه اصلی انتخاب می‌شود.
  4. اگر نمایشگر انتخاب‌شده از نمایشگر A نباشد، اتصال دوباره برقرار می‌شود. ‫InputMethodService ازبین می‌رود و سپس دوباره ایجاد می‌شود.

محدودیت امنیتی

سیستم «ویرایشگر روش ورودی» را در نمایشگرهای مجازی که متعلق به سیستم نیستند نشان نمی‌دهد. این به‌دلیل نگرانی امنیتی است که یک برنامه مخرب می‌تواند یک نمایشگر مجازی با پشتیبانی از تزئینات سیستم فعال ایجاد کند و اطلاعات حساس کاربر را از سطح بخواند، مانند پیش‌بینی‌های تایپ و پس‌زمینه‌های سفارشی.

پیاده‌سازی

در Android 9 (و نسخه‌های پایین‌تر)، «روش ورودی» فقط در صفحه پیش‌فرض دردسترس بود، همان‌طور که در روش‌های ورودی روی صفحه توضیح داده شده است. در 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() برای مقداردهی اولیه مجدد نمای ورودی دریافت می‌کند.