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

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

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

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

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

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

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

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

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

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

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

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

הגבלת אבטחה

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

הטמעה

ב-Android 9 (ובגרסאות קודמות), ה-IME היה זמין רק במסך ברירת המחדל, כפי שמתואר במאמר שיטות קלט במסך. ב-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 החדש לתצוגה החיצונית ב-ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus.onServiceConnected()
  • בצד של IMS, אחרי שמתקבלת ההודעה IMS#attachToken, מתרחש התהליך הבא:
    • הפונקציה ContextImpl#updateDisplay נקראת כדי לעדכן את התצוגה של הקשר של השירות ב-InputMethodService#attachToken(). הפעולה הזו קוראת ל-ViewGroup#addView() כדי לשנות את פריסת המקלדת ולהתאים אותה לתצוגת היעד על ידי בדיקת ההקשר הנוכחי.
    • אחרי הקריאה ל-DisplayContent#setInputMethodWindowLocked(), ההטמעה שולחת שינויים בהגדרות התצוגה ברמת התהליך באמצעות WindowProcessController לתהליך IME כדי לבטל את המשאבים ולהציג מדדים.
    • לקוח InputMethodService מקבל את ההגדרה הנכונה עם מדדי התצוגה הנכונים אחרי onConfigurationChanged() והקריאה ViewGroup#addView() לאתחול מחדש של תצוגת הקלט.