תמיכה בעורך שיטות הקלט

בהמשך מפורטים העדכונים שבוצעו בתחומים הספציפיים האלה של המסכים:

Android 10 תומך במקלדת תוכנה באפליקציות שפועלות במסך שלא מוגדר כברירת המחדל.

אפליקציות שפועלות במסך שאינו מסך ברירת המחדל

אם התצוגה מציגה את מקלדת התוכנה של עורך שיטות הקלט (IME), יש מצבים שונים. מקלדת התוכנה מוצגת ב:

  • תצוגה זהה שבה מופיעה האפליקציה שבה מתמקדים.
  • התצוגה ברירת המחדל מוצגת בזמן שהאפליקציה שמתמקדת בה פועלת במסך שלא מוגדר כברירת המחדל.
  • ללא הצגה בכלל.

המערכת קובעת באיזה מצב להשתמש על סמך ההגדרות של המסך שבו מוצגת האפליקציה שבה מתמקדים. פרטים נוספים זמינים במאמרים הבאים:

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

איור 1. מקלדת התוכנה של IME כפי שהיא מופיעה במסך המשני, כולל אפליקציית היעד

המערכת משתמשת ב-IME יחיד, אבל היא יכולה לעבור בין המסכים כדי לעקוב אחרי המיקוד של המשתמש. ב-Android 10, כל ממשקי ה-IME של צד ראשון ושל צד שלישי צפויים לשנות את הפריסה ולשנות את הגודל בהתאם לגודל המסך החדש בזמן היצירה.

אם יש חיבור פעיל במסך א' ושדה קלט מבקש להתמקד בקלט במסך ב', מתרחש התהליך הבא:

  1. חיבור קלט חדש מגיע משדה הקלט במסך B.
  2. InputMethodManagerService בודק אם צריך לאשר את החיבור.
  3. בחירת תצוגה ל-IME. אם המסך B תומך בהצגת ה-IME ורשאי להציג אותו, המערכת תשתמש ב-B. אחרת, המסך הראשי של המכשיר נבחר.
  4. אם המסך שנבחר הוא לא מסך א', החיבור מתחדש. השירות InputMethodService מושמד ואז נוצר שוב.

הגבלת אבטחה

המערכת לא תציג IME במסכים וירטואליים שאינם בבעלות המערכת. הסיבה לכך היא שיקולי אבטחה, כי אפליקציה זדונית עשויה ליצור תצוגה וירטואלית עם תמיכה בקישוט המערכת ולקרוא ממנה מידע רגיש של המשתמש, כמו תחזיות הקלדה ורקעים מותאמים אישית.

הטמעה

ב-Android 9 (וגרסאות קודמות), ה-IME היה זמין רק במסך ברירת המחדל, כפי שמתואר בשיטות קלט על המסך. ב-Android 10 (ואילך), משתמש יכול לעבור בין שדות שונים של טקסט קלט במסכים שונים על ידי החלפת המיקוד, וחלון ה-IME עובר למסכים המשניים.

כדי לנהל את מצב ה-IME, ההטמעה ב-WindowManager עוקבת אחרי החלון של שיטת הקלט (חלון ה-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() לאיnicialization מחדש של תצוגת הקלט.