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

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

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

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

Рисунок 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 системного сервера. Начните с создания библиотеки с классом поставщика политики состояния устройства, созданным на предыдущем шаге.

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

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

    Затем, чтобы добавить эту библиотеку на системный сервер, измените make-файл устройства, добавив следующие строки:

    # Add system service libraries (they contain device-specific policies)
    PRODUCT_SYSTEM_SERVER_JARS += \
        my-device-services
    PRODUCT_PACKAGES += \
        my-device-services
    
  3. Обновите config_deviceSpecificDeviceStatePolicyProvider на имя класса вашего поставщика в файле config.xml , например:

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