Позы палатки и клина

На складных устройствах книжной формы можно включить поддержку режимов «палатка» и «клин».

Режимы «палатка» и «клин» позволяют использовать внешний экран, когда устройство слегка приоткрыто, как показано на следующем рисунке:

Складные палатки и клинья

Рисунок 1. Варианты складывания палатки и клина.

В режиме «палатка» устройство частично открыто, опираясь на обе половины для устойчивости, как палатка. В режиме «клин» устройство опирается на свою правую половину, которая лежит ровно на поверхности.

В Android 16 и более поздних версиях это поведение поддерживается с помощью политики состояния устройства BookStyleDeviceStatePolicy . Эта политика работает на складных устройствах с двумя экранами, расположенных в виде книги, при этом шарнир находится с левой стороны устройства в сложенном состоянии.

Эта политика позволяет дольше сохранять внешний экран в развернутом состоянии при определенных условиях, например:

  • Правая половина устройства в основном плоская, что указывает на то, что устройство, вероятно, находится в режиме клиновидной формы.
  • Ориентация устройства — перевернутая альбомная, что указывает на вероятный режим "палатки".
  • Ориентация экрана — альбомная или перевернутая альбомная.
  • Присутствует приложение, удерживающее блокировку экрана (предотвращающее тайм-аут экрана).

Данная политика не вводит отдельное состояние устройства для положения палатки или клина; она сохраняет закрытое состояние для более широкого диапазона углов шарниров в этих конкретных условиях.

Для полноценной поддержки этих эвристических методов устройству необходимо:

  • Датчик угла шарнира, отображающий угол между двумя половинами устройства.
  • Акселерометр расположен на каждой из (левой и правой) половин устройства.

Настройте режим палатки или клина.

Выполните следующие шаги, чтобы включить поддержку режимов «палатка» и «клин» на вашем устройстве:

  1. Создайте реализацию DeviceStatePolicy.Provider , которая возвращает экземпляр BookStyleDeviceStatePolicy . Этот экземпляр должен предоставлять все необходимые зависимости, такие как объекты датчиков, конструктору 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. Добавьте поставщика политик в classpath системного сервера. Для начала создайте библиотеку с классом поставщика политик состояния устройства, который вы создали на предыдущем шаге.

    В следующем примере показана конфигурация шаблона Android.bp от Soong:

    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>