텐트 및 웨지 모드

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

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

텐트 및 웨지 폴더블 상태

그림 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>