Tư thế lều và tư thế nêm

Trên thiết bị có thể gập lại kiểu quyển sách, bạn có thể bật chế độ hỗ trợ cho chế độ lều và chế độ nêm.

Chế độ lều và chế độ nghiêng cho phép bạn sử dụng màn hình ngoài khi thiết bị hơi mở, như minh hoạ trong hình sau:

Tư thế gập kiểu lều và kiểu nêm

Hình 1. Các chế độ lều và chế độ gập kiểu nêm.

Ở chế độ lều, thiết bị sẽ mở một phần, sử dụng cả hai nửa để tự hỗ trợ như một chiếc lều. Ở chế độ nghiêng, thiết bị sẽ được dựng trên nửa bên phải và nằm phẳng trên một bề mặt.

Android 16 trở lên hỗ trợ hành vi này bằng cách sử dụng BookStyleDeviceStatePolicy làm chính sách trạng thái thiết bị. Chính sách này hoạt động trên một thiết bị có thể gập lại có hai màn hình theo kiểu sách, với bản lề nằm ở bên trái thiết bị khi gập lại.

Chính sách này giúp màn hình ngoài luôn bật lâu hơn khi mở ra trong một số điều kiện nhất định, ví dụ:

  • Nửa bên phải của thiết bị hầu hết là phẳng, cho thấy thiết bị có khả năng ở chế độ nêm.
  • Hướng của thiết bị là hướng ngang ngược, cho biết có thể thiết bị đang ở chế độ lều.
  • Hướng màn hình là hướng ngang hoặc hướng ngang đảo ngược.
  • Có một ứng dụng đang giữ chế độ thức của màn hình (ngăn màn hình hết thời gian chờ).

Chính sách này không giới thiệu trạng thái thiết bị riêng cho tư thế lều hoặc tư thế nêm; chính sách này duy trì trạng thái đóng cho nhiều góc bản lề hơn trong những điều kiện cụ thể này.

Để hỗ trợ đầy đủ các phương pháp phỏng đoán này, thiết bị cần:

  • Cảm biến góc bản lề báo cáo góc giữa hai nửa của thiết bị
  • Cảm biến gia tốc trên mỗi nửa (trái và phải) của thiết bị

Định cấu hình chế độ lều hoặc chế độ nghiêng

Làm theo các bước sau để bật chế độ lều và chế độ nêm trên thiết bị:

  1. Tạo một phương thức triển khai DeviceStatePolicy.Provider trả về một thực thể của BookStyleDeviceStatePolicy. Thực thể phải cung cấp tất cả các phần phụ thuộc cần thiết, chẳng hạn như các đối tượng cảm biến, cho hàm khởi tạo BookStyleDeviceStatePolicy.

    Ví dụ sau đây cho thấy một cách triển khai:

    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. Thêm trình cung cấp chính sách vào đường dẫn lớp của máy chủ hệ thống. Bắt đầu bằng cách tạo một thư viện có lớp trình cung cấp chính sách trạng thái thiết bị mà bạn đã tạo ở bước trước.

    Ví dụ sau đây minh hoạ cấu hình bản thiết kế Android.bp của Soong:

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

    Sau đó, để thêm thư viện này vào máy chủ hệ thống, hãy sửa đổi tệp makefile của thiết bị bằng cách thêm các dòng sau:

    # Add system service libraries (they contain device-specific policies)
    PRODUCT_SYSTEM_SERVER_JARS += \
        my-device-services
    PRODUCT_PACKAGES += \
        my-device-services
    
  3. Cập nhật config_deviceSpecificDeviceStatePolicyProvider thành tên lớp của trình cung cấp trong tệp config.xml, ví dụ:

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