إعداد التدوير التلقائي المستند إلى حالة الجهاز

بالنسبة إلى الأجهزة القابلة للطي، يمكن تحسين تجربة المستخدم من خلال تعديل سلوك دوران الشاشة بما يتناسب مع الحالة المادية للجهاز. على سبيل المثال، يمكنك ضبط الشاشة على التدوير تلقائيًا عند فتح الجهاز في وضع يشبه وضع الجهاز اللوحي، ولكن يمكنك ضبطها على الوضع العمودي عند طي الجهاز.

بدءًا من نظام التشغيل 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. استخدِم واجهات برمجة التطبيقات الصحيحة لتعديل هذه الإعدادات آليًا، بدلاً من الكتابة إلى موفّري الإعدادات مباشرةً، وذلك لتجنُّب السلوك غير المتسق:

    • لتغيير حالة قفل الدوران الحالية (يعدّل ACCELEROMETER_ROTATION):

      • من SystemUI أو Launcher، استخدِم 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 (مدير النوافذ): تتم مزامنة ACCELEROMETER_ROTATION وDEVICE_STATE_ROTATION_LOCK. عندما تتغير وضعية الجهاز، يتم تعديل ACCELEROMETER_ROTATION استنادًا إلى الإعدادات المفضّلة للمستخدم في الحالة الجديدة. ويضمن هذا الإعداد حفظ أي تغييرات في ACCELEROMETER_ROTATION مرة أخرى في DEVICE_STATE_ROTATION_LOCK لوضع الجهاز الحالي، وبطريقة مشابهة، يتم عرض التغييرات في DEVICE_STATE_ROTATION_LOCK للوضع الحالي في ACCELEROMETER_ROTATION.

  • DeviceStateAutoRotateSettingController (تطبيق الإعدادات): يتحكّم في واجهة المستخدم في صفحة إعدادات التدوير التلقائي استنادًا إلى حالة الجهاز.

  • PostureDeviceStateConverter: تحويل المعرّفات العامة لحالة الجهاز إلى معرّفات وضع الجهاز المستخدَمة في هذه الميزة

التحقق من صحة البيانات

وبما أنّ سلوك هذه الميزة يعتمد بشكل كبير على إعدادات الشركة المصنّعة للجهاز الأصلي، لا تتوفّر اختبارات CTS محدّدة لها. عليك إجراء اختبار يدوي للتأكّد من أنّ إعدادات التدوير التلقائي تتغيّر على النحو المتوقّع عند انتقال الجهاز بين الحالات المادية المختلفة التي ضبطتها.