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

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

بدءًا من 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 محدّدة لها. عليك إجراء اختبار يدوي للتأكّد من أنّ إعدادات التدوير التلقائي تتغيّر على النحو المتوقّع عند انتقال الجهاز بين الحالات المادية المختلفة التي ضبطتها.