ท่าเต็นท์และท่าลิ่ม

ในอุปกรณ์แบบพับได้สไตล์หนังสือ คุณสามารถเปิดใช้การรองรับโหมดเต็นท์และโหมดลิ่มได้

โหมดเต็นท์และโหมดลิ่มช่วยให้คุณใช้หน้าจอด้านนอกได้เมื่อเปิดอุปกรณ์เล็กน้อย ดังที่แสดงในรูปต่อไปนี้

ท่าทางแบบเต็นท์และแบบพับ

รูปที่ 1 ท่าทางแบบเต็นท์และแบบลิ่มที่พับได้

ในโหมดเต็นท์ อุปกรณ์จะเปิดออกบางส่วน โดยใช้ทั้ง 2 ครึ่งเพื่อรองรับ ตัวเครื่องเองเหมือนเต็นท์ ในโหมดลิ่ม อุปกรณ์จะตั้งขึ้นโดยใช้ครึ่งด้านขวา ซึ่งวางราบอยู่บนพื้นผิว

Android 16 ขึ้นไปรองรับลักษณะการทำงานนี้โดยใช้ BookStyleDeviceStatePolicy เป็นนโยบายสถานะอุปกรณ์ นโยบายนี้ใช้ได้ ในอุปกรณ์แบบพับได้ที่มี 2 หน้าจอในรูปแบบหนังสือ โดยบานพับจะอยู่ ทางด้านซ้ายของอุปกรณ์เมื่อพับ

นโยบายนี้จะเปิดหน้าจอด้านนอกไว้นานขึ้นเมื่อกางออกภายใต้เงื่อนไขบางประการ เช่น

  • ครึ่งขวาของอุปกรณ์ส่วนใหญ่แบนราบ ซึ่งบ่งบอกว่าอุปกรณ์ น่าจะอยู่ในโหมดลิ่ม
  • การวางแนวอุปกรณ์เป็นแนวนอนกลับด้าน ซึ่งบ่งบอกว่าอุปกรณ์น่าจะอยู่ในโหมดเต็นท์
  • การวางแนวหน้าจอเป็นแนวนอนหรือแนวนอนกลับด้าน
  • มีแอปที่ถือ Wake Lock หน้าจอ (ป้องกันไม่ให้หน้าจอหมดเวลา)

นโยบายนี้ไม่ได้กำหนดสถานะอุปกรณ์แยกต่างหากสำหรับท่าเต็นท์หรือท่าลิ่ม แต่จะคงสถานะปิดไว้สำหรับมุมบานพับที่หลากหลายมากขึ้นภายใต้เงื่อนไขที่เฉพาะเจาะจงเหล่านี้

อุปกรณ์ต้องมีคุณสมบัติดังนี้เพื่อให้รองรับฮิวริสติกเหล่านี้ได้อย่างเต็มที่

  • เซ็นเซอร์มุมบานพับที่รายงานมุมระหว่างครึ่งหนึ่งของอุปกรณ์ทั้ง 2 ส่วน
  • เซ็นเซอร์วัดความเร่งที่ครึ่งซ้ายและขวาของอุปกรณ์

กำหนดค่าโหมดเต็นท์หรือโหมดลิ่ม

ทำตามขั้นตอนต่อไปนี้เพื่อเปิดใช้การรองรับโหมดเต็นท์และโหมดลิ่มบนอุปกรณ์

  1. สร้างการติดตั้งใช้งานของ DeviceStatePolicy.Provider ที่แสดงผลอินสแตนซ์ของ BookStyleDeviceStatePolicy อินสแตนซ์ต้องระบุการอ้างอิงที่จำเป็นทั้งหมด เช่น ออบเจ็กต์เซ็นเซอร์ ให้กับ เครื่องมือสร้าง 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. เพิ่มผู้ให้บริการนโยบายไปยัง classpath ของเซิร์ฟเวอร์ระบบ เริ่มต้นด้วยการสร้าง ไลบรารีที่มีคลาสผู้ให้บริการนโยบายสถานะของอุปกรณ์ที่คุณสร้างไว้ใน ขั้นตอนก่อนหน้า

    ตัวอย่างต่อไปนี้แสดงการกำหนดค่าพิมพ์เขียวของ 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_deviceSpecificDeviceStatePolicyProvider เป็นชื่อชั้นเรียนของ ผู้ให้บริการในไฟล์ config.xml เช่น

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