במכשירים מתקפלים בסגנון ספר, אפשר להפעיל תמיכה במצבי אוהל ויתד.
במצבי אוהל ויתד אפשר להשתמש במסך החיצוני כשהמכשיר פתוח קצת, כמו שמוצג באיור הבא:
איור 1. מצבי קיפול של אוהל וטריז.
במצב אוהל, המכשיר פתוח באופן חלקי, ושני החלקים שלו משמשים לתמיכה במכשיר כמו אוהל. במצב 'משולש', המכשיר נשען על החלק הימני שלו, שמונח שטוח על משטח.
Android מגרסה 16 ואילך תומך בהתנהגות הזו באמצעות BookStyleDeviceStatePolicy
כמדיניות מצב המכשיר. המדיניות הזו פועלת במכשיר מתקפל עם שני מסכים בסגנון ספר, כשהציר ממוקם בצד שמאל של המכשיר כשהוא מקופל.
המדיניות הזו מאפשרת להשאיר את המסך החיצוני פתוח למשך זמן ארוך יותר כשפותחים את המכשיר בתנאים מסוימים, למשל:
- החלק השמאלי של המכשיר שטוח ברובו, מה שמצביע על כך שהמכשיר נמצא כנראה במצב טריז.
- כיוון המכשיר הוא פריסה הפוכה לרוחב, מה שמצביע על כך שהמכשיר נמצא כנראה במצב אוהל.
- כיוון המסך הוא לרוחב או לרוחב הפוך.
- יש אפליקציה שמונעת את כיבוי המסך (wakelock).
המדיניות לא מציגה מצב מכשיר נפרד למצב אוהל או למצב טריז, אלא שומרת על המצב הסגור לטווח רחב יותר של זוויות ציר בתנאים הספציפיים האלה.
כדי לתמוך באופן מלא בהיוריסטיקה הזו, המכשיר צריך:
- חיישן זווית הציר שמדווח על הזווית בין שני חלקי המכשיר
- חיישן מד תאוצה בכל אחד מהחלקים (שמאל וימין) של המכשיר
הגדרת מצב אוהל או מצב טריז
כדי להפעיל במכשיר תמיכה במצב אוהל ובמצב טריז:
יוצרים הטמעה של
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); } }
מוסיפים את ספק המדיניות לנתיב המחלקה של שרת המערכת. מתחילים ביצירת ספרייה עם המחלקה של ספק מדיניות מצב המכשיר שיצרתם בשלב הקודם.
בדוגמה הבאה מוצגת הגדרת תוכנית 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
מעדכנים את
config_deviceSpecificDeviceStatePolicyProvider
לשם המחלקה של הספק בקובץconfig.xml
, לדוגמה:<string translatable="false" name="config_deviceSpecificDeviceStatePolicyProvider">com.example.MyDevicePolicyProvider</string>