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

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

از اندروید ۱۳ به بعد، اندروید قابلیت شخصی‌سازی تنظیمات چرخش خودکار را بر اساس حالت‌های دستگاه، مانند حالت تا شده، باز شده یا نیمه تا شده (حالت تبلت) دارد.

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

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

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

برای فعال کردن و پیکربندی چرخش خودکار مبتنی بر وضعیت دستگاه، یک پوشش دستگاه برای فایل 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 یا 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 : تبدیل بین شناسه‌های عمومی وضعیت دستگاه و شناسه‌های وضعیت دستگاه مورد استفاده این ویژگی را انجام می‌دهد.

اعتبارسنجی

از آنجا که رفتار این ویژگی به شدت به پیکربندی سازنده اصلی (OEM) وابسته است، هیچ آزمایش CTS خاصی برای آن وجود ندارد. شما باید آزمایش دستی انجام دهید تا تأیید کنید که تنظیمات چرخش خودکار هنگام تغییر دستگاه بین حالت‌های فیزیکی مختلفی که پیکربندی کرده‌اید، مطابق انتظار تغییر می‌کند.