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

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

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

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

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

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

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

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

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

実装の詳細

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

設定

システムは、次の 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: 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(設定アプリ): デバイスの状態に基づく自動回転の設定ページの UI を制御します。

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

検証

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