הצעות לסיבוב

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

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

כשמצב נעילת הסיבוב פועל, מוצג לחצן בסרגל הניווט כשהמכשיר משתנה. כדי לעשות זאת, חיישן הכיוון של המכשיר צריך להישאר פעיל גם כשהסיבוב האוטומטי מושבת. הקשה על הלחצן הזה מגדירה את העדפת הסיבוב של המשתמש (Settings.System.USER_ROTATION). WindowManager משתמש בהעדפה הזו, יחד עם פרטים אחרים על הפעילות העיקרית וסטטוס המערכת, כדי לשנות את סיבוב המערכת. WindowManager ממשיך להשתמש בהעדפות הסיבוב של המשתמש כשמחליט באיזה סיבוב להציג את המערכת כשעוברים לפעילות אחרת.

ב-GIF הזה מוצג טלפון במצב אופקי עם המסך במצב לאורך. יופיע סמל עם בקשה לשנות את כיוון המסך לרוחב.
איור 1. סיבוב לחצן ההצעות כשהתנועה 'החלקה למעלה על הלחצן הראשי' מופעלת

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

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

מקור

הוספנו תמיכה בהצעות לכיוון ב-Android 9. רוב השינויים נכללים בקבצים הבאים.

  • services/.../server/policy/PhoneWindowManager.java:
    • הוקס שצורכים את הפלט של WindowOrientationListener (MyOrientationListener, אחראי למעקב אחרי חיישנים כדי לקבוע אם המכשיר הופנה)
    • השמירה על הפעילות של WindowOrientationListener גם כשהסיבוב האוטומטי מושבת (ראו needSensorRunningLp())
    • חישוב רוטציית המערכת בהתאם להעדפות של המשתמש, להגדרות הפעילות screenOrientation המובילות ולסטטוס המערכת (ראו rotationForOrientationLw())
    • בודקים אם הפעילות העליונה יכולה להתרוצץ לכיוון מסוים (ראו isRotationChoicePossible())
  • SystemUI/.../statusbar/phone/NavigationBarFragment:
    • קובע אם לחצן סרגל הניווט יוצג בהודעות חזרה (callbacks) של הצעות לתנועה, מ-PhoneWindowManager (ראו onRotationProposal())
    • קובע מתי להסתיר את לחצן סרגל הניווט לסיבוב (ראו קריאות ל-setRotateSuggestionButtonState(false))
    • טיפול בזמני תפוגה של לחצנים, כולל במקרה המיוחד שבו שורת הניווט מוסתרת (בדרך כלל במסך מלא)
    • איפוס העדפת המשתמש כשחוזרים לכיוון הטבעי של המכשיר (mRotationWatcher)
    • בחירת הסגנון המתאים לאנימציה של לחצן סרגל הניווט, שיוחל ב-NavigationBarView (ראו onRotationProposal())
    • הוספת לוגיקה של מצב מבוא, כולל אנימציה מיוחדת (ראו הפניות ל-Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED)
    • הטמעת הדגל disable2 לכיוון (ראו disable())
  • SystemUI/.../statusbar/phone/NavigationBarView.java:
    • אנימציה של סמל לחצן הסגנונות שתואמת לסבב המודעות בהמתנה (ראו updateRotateSuggestionButtonStyle())
    • מטפל בשינויים בחשיפה של הלחצנים (ראו setRotateButtonVisibility()), כולל לוגיקה להסתרת לחצן הסיבוב אם שירותי נגישות מסוימים פעילים (תוך התחשבות בדירוג של סטאק הלחצנים של סרגל הניווט הימני ביותר)
  • SystemUI/res/layout/menu_ime.xml:
    • כולל את הסמל KeyButtonView החדש של לחצן הסיבוב, שמופיע מעל לתפריט ולבורר ה-IME או המקלדת, אבל מתחת ללחצן הנגישות
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml:
    • AnimatedVectorDrawable מורכב שמשמש ליצירת אנימציה של לחצן הניווט הראשי המסתובב
    • הסטיילינג (ב-SystemUI/res/values/styles.xml) משמש להגדרת זוויות ההתחלה והסיום של הסיבוב, כדי שאפשר יהיה להשתמש באותו אובייקט גרפי ליצירת אנימציה של סיבובים שונים בהתחלה ובסיום
    • גוון הסמל מוגדר באמצעות TintedKeyButtonDrawable

הטמעה

גרסת Android 9 כוללת את כל השינויים הנדרשים כדי להפעיל את ההצעות לסיבוב במכשירים שמשתמשים במפתחות ניווט בתוכנה (חזרה, דף הבית וכו').

יצרני מכשירים שיוצרים מכשירים עם מקשי ניווט בחומרה ורוצים להטמיע את התכונה הזו יצטרכו לתכנן ולהטמיע את היכולת להשתמש בממשק המשתמש של המערכת בעצמם, או להשבית את התכונה. מומלץ להשתמש במשטח שבו קל להשתמש כשהמכשיר מוחזק בזווית של 90º או 180º לכיוון הסיבוב הנוכחי של המערכת, ושאפשר לגשת אליו במהירות. לכן, לא מומלץ להשתמש בהתראות (כמו בחירת מקלדת או IME).

דרישות החומרה לשימוש בתכונה הזו זהות לדרישות לשימוש בסיבוב אוטומטי.

כדי לשמור על עקביות בהטמעה, צריך לאפס את העדפת הסיבוב של המשתמש (Settings.System.USER_ROTATION) לסיבוב הטבעי של המכשיר כשהמערכת עוברת לסיבוב הטבעי של המכשיר מכל סיבה שהיא כשהסיבוב האוטומטי מושבת. ההטמעה שסופקה עושה זאת (ראו NavigationBarFragment.mRotationWatcher).

יש דגל חדש ב-StatusBarManager.disable2 שאפשר להשתמש בו כדי למנוע באופן זמני את ההצגה של הצעות לרוטינת מודעות. ראו StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS. צריך להקפיד על הדגל הזה בכל ההטמעות, כי אפליקציות קריטיות למערכת, כולל אשף ההגדרה, משתמשות בו. ההטמעה שסופקה תומכת בכך (ראו NavigationBarFragment.disable()).

מומלץ מאוד להפעיל את התכונה ולפעול לפי ההטמעה ב-AOSP, אם אפשר. אנחנו שואפים לשמור על חוויית הסיבוב דומה במכשירים השונים, בדומה לאחידות בחוויה של רוב הטלפונים כיום בין סיבוב אוטומטי לבין נעילה בפריסה לאורך.

התאמה אישית

מכיוון שהצעות לסיבוב מופיעות רק במצב נעילה של הסיבוב (הסיבוב האוטומטי מושבת), אפשר לבחור אם התכונה תופעל כברירת מחדל בהתקנות חדשות על ידי השבתת הסיבוב האוטומטי כברירת מחדל. במאמר def_accelerometer_rotation בנושא SettingsProvider/res/values/defaults.xml מוסבר איך לשנות את הגדרות ברירת המחדל.

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

אימות

לצורך בדיקה, אפשר להפעיל או להשבית את התכונה על ידי שינוי ערך Settings.Secure של תנאי סינון. הדרך הקלה ביותר לעשות זאת היא להריץ את הפקודה הבאה ממכונה עם הרשאות adb:

adb shell settings put secure show_rotation_suggestions <x>

מגדירים את x כ-0 כדי להשבית את האפשרות וכ-1 כדי להפעיל אותה.

לצורך בדיקה, אפשר לאפס את מצב ההדרכה על ידי שינוי הערך המשויך של Settings.Secure. הדרך הקלה ביותר לעשות זאת היא להריץ את הפקודה הבאה ממכונה עם הרשאות adb:

adb shell settings put secure num_rotation_suggestions_accepted 0