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

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

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

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

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

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

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

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

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

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

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

  1. חיבור קלט חדש מגיע משדה הקלט בתצוגה ב'.
  2. InputMethodManagerService בודק אם צריך לאשר את החיבור.
  3. נבחר מסך ל-IME. אם צג B תומך בהצגת ה-IME ומותר להציג אותו, נעשה שימוש בצג B. אחרת, המסך הראשי של המכשיר נבחר.
  4. אם הצג שנבחר לא שייך לצג א', החיבור יתבצע מחדש. ‫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#attachToken, מתרחש התהליך הבא:
    • הפונקציה ContextImpl#updateDisplay נקראת כדי לעדכן את התצוגה של הקשר של השירות ב-InputMethodService#attachToken(). הפעולה הזו קוראת ל-ViewGroup#addView() כדי לשנות את פריסת המקלדת ולהתאים אותה לתצוגת היעד, תוך בדיקת ההקשר הנוכחי.
    • אחרי הקריאה ל-DisplayContent#setInputMethodWindowLocked(), ההטמעה שולחת שינויים בהגדרות התצוגה ברמת התהליך באמצעות WindowProcessController לתהליך IME כדי לבטל את המשאבים ולהציג מדדים.
    • לקוח InputMethodService מקבל את ההגדרה הנכונה עם מדדי התצוגה הנכונים אחרי onConfigurationChanged() והקריאה ViewGroup#addView() לאתחול מחדש של תצוגת הקלט.