テントとウェッジの姿勢

ブック型の折りたたみ式デバイスでは、テントモードとウェッジモードのサポートを有効にできます。

テントモードとウェッジモードでは、次の図に示すように、デバイスを少し開いた状態で外側の画面を使用できます。

テントとウェッジの折りたたみ式デバイスの形状

図 1. テントとウェッジの折りたたみ形状。

テントモードでは、デバイスが部分的に開いており、テントのように両方の半分を使用して自立しています。ウェッジモードでは、デバイスの右半分が平らな面に置かれ、デバイスが支えられています。

Android 16 以降では、デバイス状態ポリシーとして BookStyleDeviceStatePolicy を使用することで、この動作をサポートしています。このポリシーは、折りたたんだときにデバイスの左側にヒンジがある、ブック スタイルの 2 つの画面を備えた折りたたみ式デバイスで機能します。

このポリシーでは、特定の条件下で折りたたんだ状態から開いたときに、アウトディスプレイをより長くオンに保ちます。たとえば、次のような場合です。

  • デバイスの右半分はほぼ平らであるため、デバイスがウェッジモードになっている可能性が高いことを示しています。
  • デバイスの向きが逆の横向きになっているため、テントモードになっている可能性があります。
  • 画面の向きが横向きまたは逆横向きである。
  • 画面ウェイクロックを保持しているアプリがある(画面のタイムアウトを防いでいる)。

このポリシーでは、テント型やウェッジ型の姿勢のための個別のデバイス状態は導入されません。特定の条件下で、より広範囲のヒンジ角度で閉じ状態が維持されます。

これらのヒューリスティックを完全にサポートするには、デバイスに次のものが必要です。

  • デバイスの 2 つの部分間の角度を報告するヒンジ角度センサー
  • デバイスの左右それぞれの半分に加速度センサー

テントモードまたはウェッジモードを設定する

デバイスでテントモードとウェッジモードのサポートを有効にする手順は次のとおりです。

  1. BookStyleDeviceStatePolicy のインスタンスを返す DeviceStatePolicy.Provider の実装を作成します。インスタンスは、センサー オブジェクトなどの必要な依存関係をすべて BookStyleDeviceStatePolicy コンストラクタに提供する必要があります。

    実装例を次に示します。

    package com.example;
    
    public class MyDevicePolicyProvider implements DeviceStatePolicy.Provider {
    
        @Override
        public DeviceStatePolicy instantiate(@NonNull Context context) {
            final SensorManager sensorManager = context.getSystemService(SensorManager.class);
            final Sensor hingeAngleSensor =
                    sensorManager.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE, /* wakeUp= */ true);
    
            final List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
            final Sensor hallSensor = CollectionUtils.find(sensors,
                    (sensor) -> Objects.equals(sensor.getStringType(),
                            "com.example.hall_effect"));
    
            final Sensor rightAccelerometerSensor = CollectionUtils.find(sensors,
                    (sensor) -> Objects.equals(sensor.getName(), "Accelerometer 0"));
            final Sensor leftAccelerometerSensor = CollectionUtils.find(sensors,
                    (sensor) -> Objects.equals(sensor.getName(), "Accelerometer 1"));
    
            // You can pass a non-null value here to disable tent/wedge mode logic,
            // so the displays switch will always happen at the fixed hinge angle.
            // This might be useful, for example, when in a retail demo mode where
            // the hinge angle range of the device is limited.
            final Integer closeAngleDegrees = null;
    
            return new BookStyleDeviceStatePolicy(new FeatureFlagsImpl(), context,
    hingeAngleSensor, hallSensor, leftAccelerometerSensor, rightAccelerometerSensor, closeAngleDegrees);
        }
    }
    
  2. ポリシー プロバイダをシステム サーバーのクラスパスに追加します。まず、前の手順で作成したデバイス状態ポリシー プロバイダ クラスを含むライブラリを作成します。

    次の例は、Soong Android.bp ブループリント構成を示しています。

    java_library {
        name: "my-device-services",
        installable: true,
        system_ext_specific: true,
        srcs: [
            "src/**/*.java"
        ],
        libs: [
            "services",
        ],
    }
    

    次に、このライブラリをシステム サーバーに追加するため、次の行を追加してデバイスの makefile を変更します。

    # Add system service libraries (they contain device-specific policies)
    PRODUCT_SYSTEM_SERVER_JARS += \
        my-device-services
    PRODUCT_PACKAGES += \
        my-device-services
    
  3. config.xml ファイルで、config_deviceSpecificDeviceStatePolicyProvider をプロバイダのクラス名に更新します。例:

    <string translatable="false" name="config_deviceSpecificDeviceStatePolicyProvider">com.example.MyDevicePolicyProvider</string>