텐트 및 웨지 모드

북 스타일 폴더블 기기에서는 텐트 모드와 웨지 모드 지원을 사용 설정할 수 있습니다.

텐트 모드와 웨지 모드를 사용하면 다음 그림과 같이 기기가 약간 열려 있을 때 외부 화면을 사용할 수 있습니다.

텐트 및 웨지 폴더블 상태

그림 1. 텐트 및 웨지 폴더블 상태

텐트 모드에서는 기기가 부분적으로 열려 있으며, 두 절반을 모두 사용하여 텐트처럼 기기를 지지합니다. 웨지 모드에서는 기기가 표면에 평평하게 놓인 오른쪽 절반에 지지됩니다.

Android 16 이상에서는 BookStyleDeviceStatePolicy을 기기 상태 정책으로 사용하여 이 동작을 지원합니다. 이 정책은 책 스타일의 화면이 두 개이고 접었을 때 기기의 왼쪽에 힌지가 있는 폴더블 기기에서 작동합니다.

이 정책은 다음과 같은 특정 조건에서 펼칠 때 외부 화면을 더 오래 켜진 상태로 유지합니다.

  • 기기의 오른쪽 절반이 대부분 평평하여 기기가 웨지 모드일 가능성이 높습니다.
  • 기기 방향이 가로 반전으로, 텐트 모드일 가능성이 높음을 나타냅니다.
  • 화면 방향이 가로 모드 또는 반전된 가로 모드입니다.
  • 화면 절전 모드를 방지하는 화면 절전 모드 해제 상태를 유지하는 앱이 있습니다.

이 정책은 텐트 또는 웨지 자세에 별도의 기기 상태를 도입하지 않습니다. 이러한 특정 조건에서 더 넓은 범위의 힌지 각도에 대해 닫힌 상태를 유지합니다.

이러한 휴리스틱을 완전히 지원하려면 기기에 다음이 필요합니다.

  • 기기의 두 절반 사이의 각도를 보고하는 힌지 각 센서
  • 기기의 각 절반 (왼쪽 및 오른쪽)에 있는 가속도계 센서

텐트 모드 또는 스탠드 모드 구성

다음 단계에 따라 기기에서 텐트 모드 및 웨지 모드 지원을 사용 설정하세요.

  1. BookStyleDeviceStatePolicy 인스턴스를 반환하는 DeviceStatePolicy.Provider 구현을 만듭니다. 인스턴스는 센서 객체와 같은 필요한 모든 종속 항목을 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. 정책 제공자를 시스템 서버의 클래스 경로에 추가합니다. 이전 단계에서 만든 기기 상태 정책 제공자 클래스로 라이브러리를 만들어 시작합니다.

    다음 예시에서는 Soong Android.bp 블루프린트 구성을 보여줍니다.

    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>