デバイスの状態に基づく自動回転の設定

折りたたみ式デバイスでは、画面の回転動作をデバイスの物理的な状態に合わせて調整することで、ユーザー エクスペリエンスを最適化できます。たとえば、タブレットのような姿勢でデバイスを開いたときに画面が自動的に回転するように設定し、デバイスを折りたたんだときに縦向きにロックするように設定できます。

Android 13 以降では、折りたたみ、展開、半折りたたみ(卓上モード)などのデバイスの状態に基づいて、自動回転の設定をカスタマイズできるようになりました。

デバイスの状態に基づく自動回転の設定ページ

図 1: ユーザーに表示されるデバイスの状態に基づく自動回転の設定。

デバイスの状態に基づく自動回転設定を有効にする

デバイスの状態に基づく自動回転を有効にして設定するには、次のように、フレームワークの config.xml ファイルのデバイス オーバーレイを作成します。

  1. デバイスのオーバーレイ config.xml で [config_perDeviceStateRotationLockDefaults][7] 整数配列を入力して、さまざまなデバイスのポーズのデフォルトの自動回転の動作を設定します。

    <!-- 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(...)][5] を使用します。
      • ウィンドウ マネージャーから DisplayRotation#freezeRotation() または thawRotation() を使用します。
    • 特定のデバイス状態の回転ロック設定を変更するには(DEVICE_STATE_ROTATION_LOCK を変更します):

      • RotationPolicy または [DeviceStateAutoRotateSettingManager][6] のいずれかの requestDeviceStateAutoRotateSettingChange(...) を使用します。

実装の詳細

折りたたみ式デバイスの自動回転の動作を制御する設定とコアキー クラスについては、以降のセクションで説明します。

設定

システムは、次の 2 つの設定を使用して自動回転を管理します。

  • 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][1]: DEVICE_STATE_ROTATION_LOCK 設定を管理します。設定の更新、値の取得、変更のリスナーの登録を行うメソッドを提供します。

  • [DeviceStateAutoRotateSettingController(ウィンドウ マネージャー)][2]: ACCELEROMETER_ROTATIONDEVICE_STATE_ROTATION_LOCK を同期します。デバイスのポーズが変化すると、新しい状態に対するユーザーの設定に基づいて ACCELEROMETER_ROTATION が更新されます。これにより、現在のデバイスの形状に対する ACCELEROMETER_ROTATION の変更が DEVICE_STATE_ROTATION_LOCK に保存され、同様に、現在の形状に対する DEVICE_STATE_ROTATION_LOCK の変更が ACCELEROMETER_ROTATION に反映されます。

  • [DeviceStateAutoRotateSettingController(設定アプリ)][3]: デバイスの状態ベースの自動回転設定ページの UI を制御します。

  • PostureDeviceStateConverter: 一般的なデバイス状態識別子と、この機能で使用されるデバイス形状識別子を変換します。

検証

この機能の動作は OEM の構成に大きく依存するため、この機能に固有の CTS テストはありません。デバイスが構成したさまざまな物理状態に移行したときに、自動回転の設定が想定どおりに変更されることを確認するには、手動テストを実施する必要があります。

[1]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/packages/SettingsLib/DeviceStateRotationLock/src/com/android/settingslib/devicestate/DeviceStateAutoRotateSettingManagerImpl.java [2]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/services/core/java/com/android/server/wm/DeviceStateAutoRotateSettingController.java [3]: https://cs.android.com/android/platform/superproject/+/android-latest-release:packages/apps/Settings/src/com/android/settings/display/DeviceStateAutoRotateSettingController.java [4]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/android/provider/Settings.java [5]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/com/android/internal/view/RotationPolicy.java;bpv=0 [6]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/packages/SettingsLib/DeviceStateRotationLock/src/com/android/settingslib/devicestate/DeviceStateAutoRotateSettingManager.java [7]: https://cs.android.com/android/platform/superproject/+/android-latest-release:packages/apps/Settings/res/values/config.xml;l=674;drc=485b59a37c1cd0af72ca706e0ba1094f4e7fef0e;l=674