במכשירים מתקפלים, אפשר לבצע אופטימיזציה של חוויית המשתמש על ידי התאמת ההתנהגות של סיבוב המסך למצב הפיזי של המכשיר. לדוגמה, אפשר להגדיר שהמסך יסתובב אוטומטית כשהמכשיר פתוח כמו טאבלט, אבל יהיה נעול לאורך כשהמכשיר מקופל.
החל מ-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(...). - ב-Window Manager, משתמשים ב-
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: ממיר בין מזהים כלליים של מצב המכשיר לבין מזהים של תנוחת המכשיר שמשמשים את התכונה הזו.
אימות
ההתנהגות של התכונה הזו תלויה מאוד בהגדרות של יצרן הציוד המקורי (OEM), ולכן אין בדיקות CTS ספציפיות בשבילה. צריך לבצע בדיקה ידנית כדי לוודא שהגדרות הסיבוב האוטומטי משתנות כמצופה כשהמכשיר עובר בין המצבים הפיזיים השונים שהגדרתם.