折りたたみ式デバイスでは、画面の回転動作をデバイスの物理的な状態に合わせて調整することで、ユーザー エクスペリエンスを最適化できます。たとえば、タブレットのような姿勢でデバイスを開いたときに画面が自動的に回転するように設定し、デバイスを折りたたんだときに縦向きにロックするように設定できます。
Android 13 以降では、折りたたみ、展開、半折りたたみ(卓上モード)などのデバイスの状態に基づいて、自動回転の設定をカスタマイズできるようになりました。
図 1: ユーザーに表示されるデバイスの状態に基づく自動回転の設定。
デバイスの状態に基づく自動回転設定を有効にする
デバイスの状態に基づく自動回転を有効にして設定するには、次のように、フレームワークの config.xml ファイルのデバイス オーバーレイを作成します。
デバイスのオーバーレイ
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姿勢の設定が更新されます。
ユーザーが設定可能なデバイスの各ポーズの説明を設定します。デバイスの設定アプリのオーバーレイで
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>一貫性のない動作を防ぐため、これらの設定をプログラムで変更するには、設定プロバイダに直接書き込むのではなく、適切な API を使用する必要があります。
現在の回転ロックの状態を変更するには(
ACCELEROMETER_ROTATIONを変更します):- SystemUI またはランチャーから、[
RotationPolicy#setRotationLock(...)][5] を使用します。 - ウィンドウ マネージャーから
DisplayRotation#freezeRotation()またはthawRotation()を使用します。
- SystemUI またはランチャーから、[
特定のデバイス状態の回転ロック設定を変更するには(
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_ROTATIONとDEVICE_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