Positions en tente et en coin

Sur les appareils pliables au format livre, vous pouvez activer la prise en charge des modes Tente et Chevalet.

Les modes Tente et Coin vous permettent d'utiliser l'écran extérieur lorsque l'appareil est légèrement ouvert, comme illustré ci-dessous :

Positions pliables en forme de tente et de cale

Figure 1 : Positions pliables en tente et en coin.

En mode Tente, l'appareil est partiellement ouvert, les deux moitiés servant de support comme une tente. En mode Wedge, l'appareil est posé sur sa moitié droite, qui repose à plat sur une surface.

Android 16 et versions ultérieures prennent en charge ce comportement en utilisant BookStyleDeviceStatePolicy comme règle d'état de l'appareil. Cette règle fonctionne sur un appareil pliable à deux écrans en forme de livre, avec la charnière située sur le côté gauche de l'appareil lorsqu'il est plié.

Cette règle permet de maintenir l'écran extérieur allumé plus longtemps lorsque l'appareil est déplié dans certaines conditions, par exemple :

  • La moitié droite de l'appareil est presque plate, ce qui indique qu'il est probablement en mode Wedge.
  • L'orientation de l'appareil est en mode Paysage inversé, ce qui indique qu'il est probablement en mode Tente.
  • L'écran est en mode paysage ou paysage inversé.
  • Une application maintient un wakelock forçant l'activation de l'écran (empêchant l'écran de se mettre en veille).

Le règlement n'introduit pas d'état d'appareil distinct pour la position en tente ou en biseau. Il conserve l'état fermé pour une plus large plage d'angles de charnière dans ces conditions spécifiques.

Pour prendre pleinement en charge ces heuristiques, l'appareil doit :

  • Capteur d'angle de charnière indiquant l'angle entre les deux moitiés de l'appareil
  • Capteur d'accéléromètre sur chaque moitié (gauche et droite) de l'appareil

Configurer le mode Tente ou Coin

Pour activer la prise en charge des modes Tente et Coin sur votre appareil :

  1. Créez une implémentation de DeviceStatePolicy.Provider qui renvoie une instance de BookStyleDeviceStatePolicy. L'instance doit fournir toutes les dépendances nécessaires, comme les objets de capteur, au constructeur BookStyleDeviceStatePolicy.

    L'exemple suivant montre une implémentation :

    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. Ajoutez le fournisseur de règles au chemin de classe du serveur système. Commencez par créer une bibliothèque avec la classe de fournisseur de règles d'état de l'appareil que vous avez créée à l'étape précédente.

    L'exemple suivant montre une configuration de plan Android.bp Soong :

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

    Ensuite, pour ajouter cette bibliothèque au serveur système, modifiez le fichier makefile de l'appareil en ajoutant les lignes suivantes :

    # Add system service libraries (they contain device-specific policies)
    PRODUCT_SYSTEM_SERVER_JARS += \
        my-device-services
    PRODUCT_PACKAGES += \
        my-device-services
    
  3. Mettez à jour config_deviceSpecificDeviceStatePolicyProvider avec le nom de classe de votre fournisseur dans le fichier config.xml, par exemple :

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