תנוחות אוהל ומשולש

במכשירים מתקפלים בסגנון ספר, אפשר להפעיל תמיכה במצבי אוהל ויתד.

במצבי אוהל ויתד אפשר להשתמש במסך החיצוני כשהמכשיר פתוח קצת, כמו שמוצג באיור הבא:

מצבי קיפול של אוהל ושל משולש

איור 1. מצבי קיפול של אוהל וטריז.

במצב אוהל, המכשיר פתוח באופן חלקי, ושני החלקים שלו משמשים לתמיכה במכשיר כמו אוהל. במצב 'משולש', המכשיר נשען על החלק הימני שלו, שמונח שטוח על משטח.

‫Android מגרסה 16 ואילך תומך בהתנהגות הזו באמצעות BookStyleDeviceStatePolicy כמדיניות מצב המכשיר. המדיניות הזו פועלת במכשיר מתקפל עם שני מסכים בסגנון ספר, כשהציר ממוקם בצד שמאל של המכשיר כשהוא מקופל.

המדיניות הזו מאפשרת להשאיר את המסך החיצוני פתוח למשך זמן ארוך יותר כשפותחים את המכשיר בתנאים מסוימים, למשל:

  • החלק השמאלי של המכשיר שטוח ברובו, מה שמצביע על כך שהמכשיר נמצא כנראה במצב טריז.
  • כיוון המכשיר הוא פריסה הפוכה לרוחב, מה שמצביע על כך שהמכשיר נמצא כנראה במצב אוהל.
  • כיוון המסך הוא לרוחב או לרוחב הפוך.
  • יש אפליקציה שמונעת את כיבוי המסך (wakelock).

המדיניות לא מציגה מצב מכשיר נפרד למצב אוהל או למצב טריז, אלא שומרת על המצב הסגור לטווח רחב יותר של זוויות ציר בתנאים הספציפיים האלה.

כדי לתמוך באופן מלא בהיוריסטיקה הזו, המכשיר צריך:

  • חיישן זווית הציר שמדווח על הזווית בין שני חלקי המכשיר
  • חיישן מד תאוצה בכל אחד מהחלקים (שמאל וימין) של המכשיר

הגדרת מצב אוהל או מצב טריז

כדי להפעיל במכשיר תמיכה במצב אוהל ובמצב טריז:

  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. מוסיפים את ספק המדיניות לנתיב המחלקה של שרת המערכת. מתחילים ביצירת ספרייה עם המחלקה של ספק מדיניות מצב המכשיר שיצרתם בשלב הקודם.

    בדוגמה הבאה מוצגת הגדרת תוכנית 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>