במכשירים מתקפלים, אפשר לבצע אופטימיזציה של חוויית המשתמש על ידי התאמה של התנהגות סיבוב המסך למצב הפיזי של המכשיר. לדוגמה, אתם יכולים להגדיר שהמסך יסתובב אוטומטית כשהמכשיר פתוח כמו טאבלט, אבל יהיה נעול לאורך כשהמכשיר מקופל.
החל מ-Android 13, יש ל-Android אפשרות להתאים אישית את הגדרות הסיבוב האוטומטי על סמך מצבי המכשיר, כמו מקופל, פתוח או מקופל חלקית (מצב שולחן).
איור 1. הגדרות הסיבוב האוטומטי שמבוססות על מצב המכשיר, כפי שהן מוצגות למשתמש.
הפעלה של הגדרת סיבוב אוטומטי שמבוססת על מצב המכשיר
כדי להפעיל ולהגדיר סיבוב אוטומטי שמבוסס על מצב המכשיר, יוצרים שכבת-על של המכשיר עבור קובץ config.xml של המסגרת, באופן הבא:
כדי להגדיר את התנהגות ברירת המחדל של הסיבוב האוטומטי למצבי מכשיר שונים, צריך לאכלס את מערך המספרים השלמים
config_perDeviceStateRotationLockDefaultsבשכבת העלconfig.xmlשל המכשיר:<!-- In your device overlay, for example, device/generic/goldfish/phone/overlay/frameworks/base/core/res/res/values/config.xml --> <resources> <!-- Map of device posture to rotation lock setting. Each entry must be in the format "key:value", or "key:value:fallback_key" for example: "0:1" or "2:0:1". The keys are one of Settings.Secure.DeviceStateRotationLockKey, and the values are one of Settings.Secure.DeviceStateRotationLockSetting. --> <integer-array name="config_perDeviceStateRotationLockDefaults"> <item>0:1</item> <!-- CLOSED -> LOCKED --> <item>1:0:2</item> <!-- HALF_OPENED -> IGNORED and fallback to device posture OPENED --> <item>2:2</item> <!-- OPENED -> UNLOCKED --> <item>3:0:0</item> <!-- REAR_DISPLAY -> IGNORED and fallback to device posture CLOSED --> </integer-array> </resources>
fallback-keyהיא הפניה למצב אבטחה של מכשיר אחר, וצריך לציין מתי הערך של מצב האבטחה הואSettings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED. כשמגדירים את המצב הזה, כל הבקשות לקבלת העדפת הסיבוב האוטומטי או להגדרת העדפת הסיבוב האוטומטי מופנות למצב ברירת המחדל.לדוגמה, אם מצב האבטחה
HALF_OPENEDחוזר למצבOPENED:- קריאת הגדרת הסיבוב האוטומטי של
HALF_OPENEDמחזירה את ההגדרה הנוכחית שלOPENED. - אם כותבים העדפה חדשה לסיבוב אוטומטי בזמן שהמכשיר
HALF_OPENEDמתעדכן, ההעדפה מתעדכנת לגבי המצבOPENED.
- קריאת הגדרת הסיבוב האוטומטי של
הגדרת תיאורים לכל מצב אבטחה של המכשיר שניתן להגדרה על ידי המשתמש. מאכלסים את מערך המחרוזות
config_settableAutoRotationDeviceStatesDescriptionsבשכבת העל של אפליקציית ההגדרות במכשיר:<!-- In your device's Settings app overlay --> <resources> <!-- The settings/preference description for each settable device posture defined in the array "config_perDeviceStateRotationLockDefaults". The item in position "i" describes the auto-rotation setting for the device posture also in position "i" in the array "config_perDeviceStateRotationLockDefaults". --> <string-array name="config_settableAutoRotationDeviceStatesDescriptions"> <item>Auto-rotate when folded</item> <item>@null</item> <!-- No description for state in position 1 (it is not settable by the user) --> <item>Auto-rotate when unfolded</item> </string-array> </resources>כדי למנוע התנהגות לא עקבית, צריך להשתמש בממשקי ה-API הנכונים כדי לשנות את ההגדרות האלה באופן פרוגרמטי, במקום לכתוב ישירות לספקי ההגדרות:
כדי לשנות את המצב הנוכחי של נעילת הסיבוב (משנה את
ACCELEROMETER_ROTATION):- מ-SystemUI או ממרכז האפליקציות, משתמשים ב-
RotationPolicy#setRotationLock(...). - במנהל החלונות, משתמשים ב-
DisplayRotation#freezeRotation()או ב-thawRotation().
- מ-SystemUI או ממרכז האפליקציות, משתמשים ב-
כדי לשנות את העדפת נעילת הסיבוב למצב מכשיר ספציפי (משנה את
DEVICE_STATE_ROTATION_LOCK):- אפשר להשתמש ב-
requestDeviceStateAutoRotateSettingChange(...)מ-RotationPolicyאו מ-DeviceStateAutoRotateSettingManager.
- אפשר להשתמש ב-
פרטי ההטמעה
בקטעים הבאים מתוארות ההגדרות והמחלקות העיקריות של המפתחות ששולטות בהתנהגות של סיבוב אוטומטי במכשיר מתקפל.
הגדרות
המערכת משתמשת בשתי ההגדרות הבאות כדי לנהל את הסיבוב האוטומטי:
Settings.System.ACCELEROMETER_ROTATION: זו ההגדרה הראשית של הסיבוב האוטומטי. במכשיר מתקפל, הערך משקף אם הסיבוב האוטומטי מופעל עבור המצב הנוכחי של המכשיר.
Settings.Secure.DEVICE_STATE_ROTATION_LOCK: ההגדרה הזו שומרת את ההעדפה של המשתמש לגבי סיבוב אוטומטי של המסך עבור כל מצב של המכשיר (לדוגמה, מקופל או לא מקופל). כך המערכת יכולה להחיל את ההעדפה הנכונה כשמצב המכשיר משתנה.ההגדרה מאוחסנת כמחרוזת עם נקודתיים כמפריד. כל זוג ערכים מייצג את מצב המכשיר ואת הגדרת הסיבוב התואמת שלו. הפורמט הוא:
<device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...הערכים של הרוטציה הם:
-
0: מתעלמים (נעשה שימוש בהגדרה של מצב ברירת מחדל) -
1: נעול (הסיבוב האוטומטי מושבת) -
2: בוטלה הנעילה (הסיבוב האוטומטי מופעל)
לדוגמה, המחרוזת
"0:2:2:1"פירושה:- במצב מקופל (תנוחה
0), הסיבוב האוטומטי לא נעול (2). - במצב הפתוח (תנוחה
2), הסיבוב האוטומטי נעול (1).
-
שיעורים מרכזיים
הלוגיקה לניהול הגדרות הסיבוב האוטומטי שמבוססות על מצב המכשיר מטופלת על ידי המחלקות הבאות:
DeviceStateAutoRotateSettingManagerImpl: ניהול ההגדרהDEVICE_STATE_ROTATION_LOCK. הוא כולל שיטות לעדכון ההגדרה, לאחזור הערך שלה ולרישום מאזינים לשינויים.
DeviceStateAutoRotateSettingController(Window Manager): סנכרון שלACCELEROMETER_ROTATIONו-DEVICE_STATE_ROTATION_LOCK. כשמשנים את המצב של המכשיר, המצב שלACCELEROMETER_ROTATIONמתעדכן בהתאם להעדפה של המשתמש לגבי המצב החדש. היא מוודאת שכל שינוי ב-ACCELEROMETER_ROTATIONנשמר בחזרה ב-DEVICE_STATE_ROTATION_LOCKעבור מצב האבטחה הנוכחי של המכשיר, ובאופן דומה, שינויים ב-DEVICE_STATE_ROTATION_LOCKעבור מצב האבטחה הנוכחי משתקפים ב-ACCELEROMETER_ROTATION.
DeviceStateAutoRotateSettingController(אפליקציית ההגדרות): אמצעי בקרה בממשק המשתמש בדף ההגדרות של סיבוב אוטומטי על סמך מצב המכשיר.
PostureDeviceStateConverter: ממיר בין מזהים כלליים של מצב המכשיר לבין מזהי המיקום של המכשיר שבהם נעשה שימוש בתכונה הזו.
אימות
ההתנהגות של התכונה הזו תלויה מאוד בהגדרות של יצרן הציוד המקורי, ולכן אין בדיקות CTS ספציפיות בשבילה. צריך לבצע בדיקה ידנית כדי לוודא שהגדרות הסיבוב האוטומטי משתנות כמצופה כשהמכשיר עובר בין המצבים הפיזיים השונים שהגדרתם.