تنظیم چرخش خودکار براساس وضعیت دستگاه

برای دستگاه‌های تاشو، با تطبیق رفتار چرخش صفحه‌نمایش با وضعیت فیزیکی دستگاه می‌توان تجربه کاربر را بهینه کرد. برای مثال، می‌توانید تنظیم کنید که وقتی دستگاه در حالت شبیه رایانه لوحی باز می‌شود، صفحه به‌طور خودکار بچرخد، اما وقتی دستگاه تا می‌شود، روی حالت عمودی قفل شود.

از Android 13، این سیستم‌عامل می‌تواند تنظیمات چرخش خودکار را براساس وضعیت دستگاه (مثلاً تاشده، بازشده، یا نیمه‌تاشده (حالت رومیزی)) سفارشی‌سازی کند.

صفحه تنظیمات چرخش خودکار براساس وضعیت دستگاه

شکل ۱. تنظیمات چرخش خودکار براساس وضعیت دستگاه که کاربر می‌بیند.

فعال کردن تنظیم چرخش خودکار براساس وضعیت دستگاه

برای فعال کردن و پیکربندی چرخش خودکار براساس وضعیت دستگاه، رونهادی برای فایل 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 یا «راه‌انداز»، از 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 خاصی برای آن وجود ندارد. باید آزمایش دستی انجام دهید تا تأیید کنید تنظیمات چرخش خودکار هنگام انتقال دستگاه بین حالت‌های فیزیکی مختلفی که پیکربندی کرده‌اید، طبق انتظار تغییر می‌کند.