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

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

החל מ-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(...).
      • במנהל החלונות, משתמשים ב-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: ממיר בין מזהים כלליים של מצב המכשיר לבין מזהי המיקום של המכשיר שבהם נעשה שימוש בתכונה הזו.

אימות

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