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

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

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

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

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

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

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

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

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

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

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

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

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

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

پیاده‌سازی

در اندروید ۹ (و پایین‌تر)، IME فقط در صفحه پیش‌فرض در دسترس بود، همانطور که در روش‌های ورودی روی صفحه توضیح داده شده است. در اندروید ۱۰ (و بالاتر)، کاربر می‌تواند با تغییر فوکوس، بین فیلدهای متنی ورودی مختلف در نمایشگرهای مختلف جابجا شود و پنجره IME به نمایشگرهای ثانویه منتقل شود.

پیاده‌سازی در WindowManager پنجره متد ورودی (پنجره IME که صفحه‌کلید نرم‌افزاری در آن رسم می‌شود) و هدف متد ورودی (پنجره‌ای که ورودی IME به آن می‌رود) را برای مدیریت وضعیت IME ردیابی می‌کند.

برای InputMethodManagerService (IMMS)، هیچ مکانیزم داخلی دیگری نمی‌تواند تغییر نمایش را به InputMethodService (IMS) منتقل کند و هنگام انتقال فوکوس به نمایشگر دیگر، طرح‌بندی صفحه‌کلید را در زمان اجرا مجدداً پیکربندی کند.

برای دستیابی به جابجایی پنجره IME بین نمایشگرها، اندروید ۱۰ موارد زیر را پیاده‌سازی می‌کند:

  • IME و پنجره‌ی هدف ورودی اکنون در DisplayContent#mInputMethodWindow و DisplayContent#mInputMethodTarget برای هر نمایشگر ردیابی می‌شوند، به طوری که WindowManager (WM) می‌تواند وضعیت فوکوس IME را مستقل از هر نمایشگر مدیریت کند.
  • در سمت IMMS، هنگامی که درخواست focus یک کلاینت برنامه از نمایشگر خارجی از طریق 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() برای مقداردهی مجدد نمای ورودی، پیکربندی صحیح را با معیارهای نمایش صحیح دریافت می‌کند.