diff options
| -rw-r--r-- | core/api/system-current.txt | 4 | ||||
| -rw-r--r-- | core/java/android/companion/virtual/flags/flags.aconfig | 7 | ||||
| -rw-r--r-- | core/java/android/companion/virtual/sensor/VirtualSensorConfig.java | 73 |
3 files changed, 82 insertions, 2 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 47e12aef9926..5413c6606bcb 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -3694,9 +3694,11 @@ package android.companion.virtual.sensor { method public int getMinDelay(); method @NonNull public String getName(); method public float getPower(); + method @FlaggedApi("android.companion.virtualdevice.flags.device_aware_display_power") public int getReportingMode(); method public float getResolution(); method public int getType(); method @Nullable public String getVendor(); + method @FlaggedApi("android.companion.virtualdevice.flags.device_aware_display_power") public boolean isWakeUpSensor(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.companion.virtual.sensor.VirtualSensorConfig> CREATOR; } @@ -3710,8 +3712,10 @@ package android.companion.virtual.sensor { method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setMaximumRange(float); method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setMinDelay(int); method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setPower(float); + method @FlaggedApi("android.companion.virtualdevice.flags.device_aware_display_power") @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setReportingMode(int); method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setResolution(float); method @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setVendor(@Nullable String); + method @FlaggedApi("android.companion.virtualdevice.flags.device_aware_display_power") @NonNull public android.companion.virtual.sensor.VirtualSensorConfig.Builder setWakeUpSensor(boolean); } public interface VirtualSensorDirectChannelCallback { diff --git a/core/java/android/companion/virtual/flags/flags.aconfig b/core/java/android/companion/virtual/flags/flags.aconfig index c3c3f0ef32e1..b4c36e1bc513 100644 --- a/core/java/android/companion/virtual/flags/flags.aconfig +++ b/core/java/android/companion/virtual/flags/flags.aconfig @@ -103,3 +103,10 @@ flag { description: "Expose multiple surface for the virtual camera owner for different stream resolution" bug: "341083465" } + +flag { + namespace: "virtual_devices" + name: "device_aware_display_power" + description: "Device awareness in power and display APIs" + bug: "285020111" +} diff --git a/core/java/android/companion/virtual/sensor/VirtualSensorConfig.java b/core/java/android/companion/virtual/sensor/VirtualSensorConfig.java index 21ad914bbc29..82f183fd1d62 100644 --- a/core/java/android/companion/virtual/sensor/VirtualSensorConfig.java +++ b/core/java/android/companion/virtual/sensor/VirtualSensorConfig.java @@ -17,12 +17,14 @@ package android.companion.virtual.sensor; +import android.annotation.FlaggedApi; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.TestApi; +import android.companion.virtualdevice.flags.Flags; import android.hardware.Sensor; import android.hardware.SensorDirectChannel; import android.os.Parcel; @@ -42,6 +44,13 @@ import java.util.Objects; public final class VirtualSensorConfig implements Parcelable { private static final String TAG = "VirtualSensorConfig"; + // Defined in sensors.h + private static final int FLAG_WAKE_UP_SENSOR = 1; + + // Mask for the reporting mode, bit 2, 3, 4. + private static final int REPORTING_MODE_MASK = 0xE; + private static final int REPORTING_MODE_SHIFT = 1; + // Mask for direct mode highest rate level, bit 7, 8, 9. private static final int DIRECT_REPORT_MASK = 0x380; private static final int DIRECT_REPORT_SHIFT = 7; @@ -193,8 +202,7 @@ public final class VirtualSensorConfig implements Parcelable { @SensorDirectChannel.RateLevel public int getHighestDirectReportRateLevel() { int rateLevel = ((mFlags & DIRECT_REPORT_MASK) >> DIRECT_REPORT_SHIFT); - return rateLevel <= SensorDirectChannel.RATE_VERY_FAST - ? rateLevel : SensorDirectChannel.RATE_VERY_FAST; + return Math.min(rateLevel, SensorDirectChannel.RATE_VERY_FAST); } /** @@ -215,6 +223,28 @@ public final class VirtualSensorConfig implements Parcelable { } /** + * Returns whether the sensor is a wake-up sensor. + * + * @see Builder#setWakeUpSensor(boolean) + * @see Sensor#isWakeUpSensor() + */ + @FlaggedApi(Flags.FLAG_DEVICE_AWARE_DISPLAY_POWER) + public boolean isWakeUpSensor() { + return (mFlags & FLAG_WAKE_UP_SENSOR) > 0; + } + + /** + * Returns the reporting mode of this sensor. + * + * @see Builder#setReportingMode(int) + * @see Sensor#getReportingMode() + */ + @FlaggedApi(Flags.FLAG_DEVICE_AWARE_DISPLAY_POWER) + public int getReportingMode() { + return ((mFlags & REPORTING_MODE_MASK) >> REPORTING_MODE_SHIFT); + } + + /** * Returns the sensor flags. * * @hide @@ -383,6 +413,45 @@ public final class VirtualSensorConfig implements Parcelable { } return this; } + + /** + * Sets whether this sensor is a wake up sensor. + * + * @see Sensor#isWakeUpSensor() + */ + @FlaggedApi(Flags.FLAG_DEVICE_AWARE_DISPLAY_POWER) + @NonNull + public VirtualSensorConfig.Builder setWakeUpSensor(boolean wakeUpSensor) { + if (wakeUpSensor) { + mFlags |= FLAG_WAKE_UP_SENSOR; + } else { + mFlags &= ~FLAG_WAKE_UP_SENSOR; + } + return this; + } + + /** + * Sets the reporting mode of this sensor. + * + * @throws IllegalArgumentException if the reporting mode is not one of + * {@link Sensor#REPORTING_MODE_CONTINUOUS}, {@link Sensor#REPORTING_MODE_ON_CHANGE}, + * {@link Sensor#REPORTING_MODE_ONE_SHOT}, or + * {@link Sensor#REPORTING_MODE_SPECIAL_TRIGGER}. + * + * @see Sensor#getReportingMode() + */ + @FlaggedApi(Flags.FLAG_DEVICE_AWARE_DISPLAY_POWER) + @NonNull + public VirtualSensorConfig.Builder setReportingMode(int reportingMode) { + if (reportingMode != Sensor.REPORTING_MODE_CONTINUOUS + && reportingMode != Sensor.REPORTING_MODE_ON_CHANGE + && reportingMode != Sensor.REPORTING_MODE_ONE_SHOT + && reportingMode != Sensor.REPORTING_MODE_SPECIAL_TRIGGER) { + throw new IllegalArgumentException("Invalid reporting mode: " + reportingMode); + } + mFlags |= reportingMode << REPORTING_MODE_SHIFT; + return this; + } } @NonNull |