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

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

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

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

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

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

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

  1. כדי להגדיר את התנהגות ברירת המחדל של הסיבוב האוטומטי למצבי מכשיר שונים, צריך לאכלס את מערך המספרים השלמים 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.
  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(...).
      • ב-Window Manager, משתמשים ב-DisplayRotation#freezeRotation() או ב-thawRotation().
    • כדי לשנות את העדפת נעילת הסיבוב למצב מכשיר ספציפי (שינוי של DEVICE_STATE_ROTATION_LOCK):

פרטי ההטמעה

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

הגדרות

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

  • 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 ספציפיות בשבילה. צריך לבצע בדיקה ידנית כדי לוודא שהגדרות הסיבוב האוטומטי משתנות כמצופה כשהמכשיר עובר בין המצבים הפיזיים השונים שהגדרתם.