Posizioni della tenda e del cuneo

Sui dispositivi pieghevoli in stile libro, puoi attivare il supporto per le modalità tenda e cuneo.

Le modalità tenda e cuneo ti consentono di utilizzare lo schermo esterno quando il dispositivo è leggermente aperto, come mostrato nella figura seguente:

Pose pieghevoli a tenda e a cuneo

Figura 1. Posizioni pieghevoli a tenda e cuneo.

Nella modalità tenda, il dispositivo è parzialmente aperto e utilizza entrambe le metà per sostenersi come una tenda. Nella modalità cuneo, il dispositivo è appoggiato sulla metà destra, che è piatta su una superficie.

Android 16 e versioni successive supportano questo comportamento utilizzando BookStyleDeviceStatePolicy come norma sullo stato del dispositivo. Questa norma funziona su un dispositivo pieghevole con due schermi in stile libro, con la cerniera situata sul lato sinistro del dispositivo quando è piegato.

Questa norma mantiene lo schermo esterno acceso più a lungo quando si apre in determinate condizioni, ad esempio:

  • La metà destra del dispositivo è per lo più piatta, il che indica che è probabilmente in modalità cuneo.
  • L'orientamento del dispositivo è orizzontale inverso, il che indica che è probabilmente in modalità tenda.
  • L'orientamento dello schermo è orizzontale o orizzontale inverso.
  • Un'app mantiene attivo il blocco di riattivazione dello schermo (impedendo il timeout dello schermo).

La norma non introduce uno stato del dispositivo separato per la posizione a tenda o supporto inclinato; mantiene lo stato chiuso per una gamma più ampia di angoli della cerniera in queste condizioni specifiche.

Per supportare completamente queste euristiche, il dispositivo deve avere:

  • Sensore dell'angolo della cerniera che segnala l'angolo tra le due metà del dispositivo
  • Sensore accelerometro su ciascuna metà (sinistra e destra) del dispositivo

Configurare la modalità tenda o cuneo

Segui questi passaggi per attivare il supporto per la modalità tenda e cuneo sul tuo dispositivo:

  1. Crea un'implementazione di DeviceStatePolicy.Provider che restituisce un'istanza di BookStyleDeviceStatePolicy. L'istanza deve fornire tutte le dipendenze necessarie, come gli oggetti sensore, al costruttore BookStyleDeviceStatePolicy.

    Il seguente esempio mostra un'implementazione:

    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. Aggiungi il provider di norme al classpath del server di sistema. Inizia creando una libreria con la classe del provider di norme sullo stato del dispositivo che hai creato nel passaggio precedente.

    Il seguente esempio mostra una configurazione del progetto Soong Android.bp:

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

    Quindi, per aggiungere questa libreria al server di sistema, modifica il makefile del dispositivo aggiungendo le seguenti righe:

    # Add system service libraries (they contain device-specific policies)
    PRODUCT_SYSTEM_SERVER_JARS += \
        my-device-services
    PRODUCT_PACKAGES += \
        my-device-services
    
  3. Aggiorna config_deviceSpecificDeviceStatePolicyProvider al nome della classe del tuo provider nel file config.xml, ad esempio:

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