הגדרה של סיבוב אוטומטי שמבוססת על מצב המכשיר

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

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

דף ההגדרות של סיבוב אוטומטי שמבוסס על מצב המכשיר

איור 1: הגדרות סיבוב אוטומטי שמבוססות על מצב המכשיר, כפי שהן מוצגות למשתמש.

הפעלה של הגדרת סיבוב אוטומטי שמבוססת על מצב המכשיר

כדי להפעיל ולהגדיר סיבוב אוטומטי שמבוסס על מצב המכשיר, יוצרים שכבת-על של המכשיר עבור קובץ config.xml של המסגרת, באופן הבא:

  1. כדי להגדיר את התנהגות ברירת המחדל של סיבוב אוטומטי במצבי מכשיר שונים, צריך לאכלס את מערך המספרים השלמים [config_perDeviceStateRotationLockDefaults][7] בשכבת העל של המכשיר 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.
  2. הגדרת תיאורים לכל מצבי המכשיר שמשתמשים יכולים להגדיר. מאכלסים את מערך המחרוזות 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>
    
  3. כדי למנוע התנהגות לא עקבית, צריך להשתמש בממשקי ה-API הנכונים כדי לשנות את ההגדרות האלה באופן פרוגרמטי, ולא לכתוב ישירות לספקי ההגדרות:

    • כדי לשנות את המצב הנוכחי של נעילת הסיבוב (משנה את ACCELEROMETER_ROTATION):

      • מ-SystemUI או ממרכז האפליקציות, משתמשים ב-[RotationPolicy#setRotationLock(...)][5].
      • ב-Window Manager, משתמשים ב-DisplayRotation#freezeRotation() או ב-thawRotation().
    • כדי לשנות את העדפת נעילת הסיבוב למצב מכשיר ספציפי (משנה את DEVICE_STATE_ROTATION_LOCK):

      • אפשר להשתמש ב-requestDeviceStateAutoRotateSettingChange(...) מתוך RotationPolicy או [DeviceStateAutoRotateSettingManager][6].

פרטי ההטמעה

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

הגדרות

המערכת משתמשת בשתי ההגדרות הבאות כדי לנהל את הסיבוב האוטומטי:

  • 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][1]: ניהול ההגדרה DEVICE_STATE_ROTATION_LOCK. היא כוללת שיטות לעדכון ההגדרה, לאחזור הערך שלה ולרישום מאזינים לשינויים.

  • [DeviceStateAutoRotateSettingController (Window Manager)][2]: סנכרון של ACCELEROMETER_ROTATION ו-DEVICE_STATE_ROTATION_LOCK. כשמשנים את מצב המכשיר, המצב של ACCELEROMETER_ROTATION מתעדכן בהתאם להעדפה של המשתמש לגבי המצב החדש. היא מוודאת שכל שינוי ב-ACCELEROMETER_ROTATION נשמר בחזרה ב-DEVICE_STATE_ROTATION_LOCK עבור מצב האבטחה הנוכחי של המכשיר, ובאופן דומה, ששינויים ב-DEVICE_STATE_ROTATION_LOCK עבור מצב האבטחה הנוכחי משתקפים ב-ACCELEROMETER_ROTATION.

  • [DeviceStateAutoRotateSettingController (אפליקציית ההגדרות)][3]: שליטה בממשק המשתמש בדף ההגדרות של הסיבוב האוטומטי לפי מצב המכשיר.

  • PostureDeviceStateConverter: ממיר בין מזהים כלליים של מצב המכשיר לבין מזהים של תנוחת המכשיר שמשמשים את התכונה הזו.

אימות

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

‫[1]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/packages/SettingsLib/DeviceStateRotationLock/src/com/android/settingslib/devicestate/DeviceStateAutoRotateSettingManagerImpl.java [2]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/services/core/java/com/android/server/wm/DeviceStateAutoRotateSettingController.java [3]: https://cs.android.com/android/platform/superproject/+/android-latest-release:packages/apps/Settings/src/com/android/settings/display/DeviceStateAutoRotateSettingController.java [4]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/android/provider/Settings.java [5]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/com/android/internal/view/RotationPolicy.java;bpv=0 [6]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/packages/SettingsLib/DeviceStateRotationLock/src/com/android/settingslib/devicestate/DeviceStateAutoRotateSettingManager.java [7]: https://cs.android.com/android/platform/superproject/+/android-latest-release:packages/apps/Settings/res/values/config.xml;l=674;drc=485b59a37c1cd0af72ca706e0ba1094f4e7fef0e;l=674