summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/system-current.txt3
-rw-r--r--core/java/android/app/ambient_context.aconfig8
-rw-r--r--core/java/android/app/ambientcontext/AmbientContextEvent.java83
-rw-r--r--services/core/java/com/android/server/ambientcontext/AmbientContextManagerService.java3
4 files changed, 89 insertions, 8 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 2898705b75d4..c22f54c33e27 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -1596,12 +1596,14 @@ package android.app.ambientcontext {
method public int getDensityLevel();
method @NonNull public java.time.Instant getEndTime();
method public int getEventType();
+ method @FlaggedApi("android.app.ambient_heart_rate") @IntRange(from=0xffffffff) public int getRatePerMinute();
method @NonNull public java.time.Instant getStartTime();
method @NonNull public android.os.PersistableBundle getVendorData();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.app.ambientcontext.AmbientContextEvent> CREATOR;
field public static final int EVENT_BACK_DOUBLE_TAP = 3; // 0x3
field public static final int EVENT_COUGH = 1; // 0x1
+ field @FlaggedApi("android.app.ambient_heart_rate") public static final int EVENT_HEART_RATE = 4; // 0x4
field public static final int EVENT_SNORE = 2; // 0x2
field public static final int EVENT_UNKNOWN = 0; // 0x0
field public static final int EVENT_VENDOR_WEARABLE_START = 100000; // 0x186a0
@@ -1621,6 +1623,7 @@ package android.app.ambientcontext {
method @NonNull public android.app.ambientcontext.AmbientContextEvent.Builder setDensityLevel(int);
method @NonNull public android.app.ambientcontext.AmbientContextEvent.Builder setEndTime(@NonNull java.time.Instant);
method @NonNull public android.app.ambientcontext.AmbientContextEvent.Builder setEventType(int);
+ method @FlaggedApi("android.app.ambient_heart_rate") @NonNull public android.app.ambientcontext.AmbientContextEvent.Builder setRatePerMinute(@IntRange(from=0xffffffff) int);
method @NonNull public android.app.ambientcontext.AmbientContextEvent.Builder setStartTime(@NonNull java.time.Instant);
method @NonNull public android.app.ambientcontext.AmbientContextEvent.Builder setVendorData(@NonNull android.os.PersistableBundle);
}
diff --git a/core/java/android/app/ambient_context.aconfig b/core/java/android/app/ambient_context.aconfig
new file mode 100644
index 000000000000..3f73da216b9f
--- /dev/null
+++ b/core/java/android/app/ambient_context.aconfig
@@ -0,0 +1,8 @@
+package: "android.app"
+
+flag {
+ namespace: "biometrics_integration"
+ name: "ambient_heart_rate"
+ description: "Feature flag for adding heart rate api to ambient context."
+ bug: "318309481"
+}
diff --git a/core/java/android/app/ambientcontext/AmbientContextEvent.java b/core/java/android/app/ambientcontext/AmbientContextEvent.java
index b5c66ffa72a1..f94987e8495a 100644
--- a/core/java/android/app/ambientcontext/AmbientContextEvent.java
+++ b/core/java/android/app/ambientcontext/AmbientContextEvent.java
@@ -16,7 +16,9 @@
package android.app.ambientcontext;
+import android.annotation.FlaggedApi;
import android.annotation.IntDef;
+import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.os.Parcelable;
@@ -68,6 +70,14 @@ public final class AmbientContextEvent implements Parcelable {
public static final int EVENT_BACK_DOUBLE_TAP = 3;
/**
+ * The integer indicating a heart rate measurement was done.
+ *
+ * @see #getRatePerMinute
+ */
+ @Event @FlaggedApi(android.app.Flags.FLAG_AMBIENT_HEART_RATE)
+ public static final int EVENT_HEART_RATE = 4;
+
+ /**
* Integer indicating the start of wearable vendor defined events that can be detected.
* These depend on the vendor implementation.
*/
@@ -79,12 +89,16 @@ public final class AmbientContextEvent implements Parcelable {
*/
public static final String KEY_VENDOR_WEARABLE_EVENT_NAME = "wearable_event_name";
+ /** Default value for the rate per minute data field. */
+ private static final int RATE_PER_MINUTE_UNKNOWN = -1;
+
/** @hide */
@IntDef(prefix = { "EVENT_" }, value = {
EVENT_UNKNOWN,
EVENT_COUGH,
EVENT_SNORE,
EVENT_BACK_DOUBLE_TAP,
+ EVENT_HEART_RATE,
EVENT_VENDOR_WEARABLE_START,
})
@Retention(RetentionPolicy.SOURCE)
@@ -170,6 +184,16 @@ public final class AmbientContextEvent implements Parcelable {
return new PersistableBundle();
}
+ /**
+ * Rate per minute of the event during the start to end time.
+ *
+ * @return the rate per minute, or {@link #RATE_PER_MINUTE_UNKNOWN} if the rate is unknown.
+ */
+ private final @IntRange(from = -1) int mRatePerMinute;
+ private static int defaultRatePerMinute() {
+ return RATE_PER_MINUTE_UNKNOWN;
+ }
+
// Code below generated by codegen v1.0.23.
@@ -179,6 +203,8 @@ public final class AmbientContextEvent implements Parcelable {
//
// To regenerate run:
// $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/app/ambientcontext/AmbientContextEvent.java
+ // then manually add @FlaggedApi(android.app.Flags.FLAG_AMBIENT_HEART_RATE) back to flagged
+ // APIs.
//
// To exclude the generated code from IntelliJ auto-formatting enable (one-time):
// Settings > Editor > Code Style > Formatter Control
@@ -191,6 +217,7 @@ public final class AmbientContextEvent implements Parcelable {
EVENT_COUGH,
EVENT_SNORE,
EVENT_BACK_DOUBLE_TAP,
+ EVENT_HEART_RATE,
EVENT_VENDOR_WEARABLE_START
})
@Retention(RetentionPolicy.SOURCE)
@@ -209,6 +236,8 @@ public final class AmbientContextEvent implements Parcelable {
return "EVENT_SNORE";
case EVENT_BACK_DOUBLE_TAP:
return "EVENT_BACK_DOUBLE_TAP";
+ case EVENT_HEART_RATE:
+ return "EVENT_HEART_RATE";
case EVENT_VENDOR_WEARABLE_START:
return "EVENT_VENDOR_WEARABLE_START";
default: return Integer.toHexString(value);
@@ -255,7 +284,8 @@ public final class AmbientContextEvent implements Parcelable {
@NonNull Instant endTime,
@LevelValue int confidenceLevel,
@LevelValue int densityLevel,
- @NonNull PersistableBundle vendorData) {
+ @NonNull PersistableBundle vendorData,
+ @IntRange(from = -1) int ratePerMinute) {
this.mEventType = eventType;
com.android.internal.util.AnnotationValidations.validate(
EventCode.class, null, mEventType);
@@ -274,6 +304,10 @@ public final class AmbientContextEvent implements Parcelable {
this.mVendorData = vendorData;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mVendorData);
+ this.mRatePerMinute = ratePerMinute;
+ com.android.internal.util.AnnotationValidations.validate(
+ IntRange.class, null, mRatePerMinute,
+ "from", -1);
// onConstructed(); // You can define this method to get a callback
}
@@ -330,6 +364,17 @@ public final class AmbientContextEvent implements Parcelable {
return mVendorData;
}
+ /**
+ * Rate per minute of the event during the start to end time.
+ *
+ * @return the rate per minute, or {@link #RATE_PER_MINUTE_UNKNOWN} if the rate is unknown.
+ */
+ @DataClass.Generated.Member
+ @FlaggedApi(android.app.Flags.FLAG_AMBIENT_HEART_RATE)
+ public @IntRange(from = -1) int getRatePerMinute() {
+ return mRatePerMinute;
+ }
+
@Override
@DataClass.Generated.Member
public String toString() {
@@ -342,7 +387,8 @@ public final class AmbientContextEvent implements Parcelable {
"endTime = " + mEndTime + ", " +
"confidenceLevel = " + mConfidenceLevel + ", " +
"densityLevel = " + mDensityLevel + ", " +
- "vendorData = " + mVendorData +
+ "vendorData = " + mVendorData + ", " +
+ "ratePerMinute = " + mRatePerMinute +
" }";
}
@@ -380,6 +426,7 @@ public final class AmbientContextEvent implements Parcelable {
dest.writeInt(mConfidenceLevel);
dest.writeInt(mDensityLevel);
dest.writeTypedObject(mVendorData, flags);
+ dest.writeInt(mRatePerMinute);
}
@Override
@@ -399,6 +446,7 @@ public final class AmbientContextEvent implements Parcelable {
int confidenceLevel = in.readInt();
int densityLevel = in.readInt();
PersistableBundle vendorData = (PersistableBundle) in.readTypedObject(PersistableBundle.CREATOR);
+ int ratePerMinute = in.readInt();
this.mEventType = eventType;
com.android.internal.util.AnnotationValidations.validate(
@@ -418,6 +466,10 @@ public final class AmbientContextEvent implements Parcelable {
this.mVendorData = vendorData;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mVendorData);
+ this.mRatePerMinute = ratePerMinute;
+ com.android.internal.util.AnnotationValidations.validate(
+ IntRange.class, null, mRatePerMinute,
+ "from", -1);
// onConstructed(); // You can define this method to get a callback
}
@@ -449,6 +501,7 @@ public final class AmbientContextEvent implements Parcelable {
private @LevelValue int mConfidenceLevel;
private @LevelValue int mDensityLevel;
private @NonNull PersistableBundle mVendorData;
+ private @IntRange(from = -1) int mRatePerMinute;
private long mBuilderFieldsSet = 0L;
@@ -525,10 +578,22 @@ public final class AmbientContextEvent implements Parcelable {
return this;
}
+ /**
+ * Rate per minute of the event during the start to end time.
+ */
+ @DataClass.Generated.Member
+ @FlaggedApi(android.app.Flags.FLAG_AMBIENT_HEART_RATE)
+ public @NonNull Builder setRatePerMinute(@IntRange(from = -1) int value) {
+ checkNotUsed();
+ mBuilderFieldsSet |= 0x40;
+ mRatePerMinute = value;
+ return this;
+ }
+
/** Builds the instance. This builder should not be touched after calling this! */
public @NonNull AmbientContextEvent build() {
checkNotUsed();
- mBuilderFieldsSet |= 0x40; // Mark builder used
+ mBuilderFieldsSet |= 0x80; // Mark builder used
if ((mBuilderFieldsSet & 0x1) == 0) {
mEventType = defaultEventType();
@@ -548,18 +613,22 @@ public final class AmbientContextEvent implements Parcelable {
if ((mBuilderFieldsSet & 0x20) == 0) {
mVendorData = defaultVendorData();
}
+ if ((mBuilderFieldsSet & 0x40) == 0) {
+ mRatePerMinute = defaultRatePerMinute();
+ }
AmbientContextEvent o = new AmbientContextEvent(
mEventType,
mStartTime,
mEndTime,
mConfidenceLevel,
mDensityLevel,
- mVendorData);
+ mVendorData,
+ mRatePerMinute);
return o;
}
private void checkNotUsed() {
- if ((mBuilderFieldsSet & 0x40) != 0) {
+ if ((mBuilderFieldsSet & 0x80) != 0) {
throw new IllegalStateException(
"This Builder should not be reused. Use a new Builder instance instead");
}
@@ -567,10 +636,10 @@ public final class AmbientContextEvent implements Parcelable {
}
@DataClass.Generated(
- time = 1671217108067L,
+ time = 1704895515931L,
codegenVersion = "1.0.23",
sourceFile = "frameworks/base/core/java/android/app/ambientcontext/AmbientContextEvent.java",
- inputSignatures = "public static final int EVENT_UNKNOWN\npublic static final int EVENT_COUGH\npublic static final int EVENT_SNORE\npublic static final int EVENT_BACK_DOUBLE_TAP\npublic static final int EVENT_VENDOR_WEARABLE_START\npublic static final java.lang.String KEY_VENDOR_WEARABLE_EVENT_NAME\npublic static final int LEVEL_UNKNOWN\npublic static final int LEVEL_LOW\npublic static final int LEVEL_MEDIUM_LOW\npublic static final int LEVEL_MEDIUM\npublic static final int LEVEL_MEDIUM_HIGH\npublic static final int LEVEL_HIGH\nprivate final @android.app.ambientcontext.AmbientContextEvent.EventCode int mEventType\nprivate final @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInstant.class) @android.annotation.NonNull java.time.Instant mStartTime\nprivate final @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInstant.class) @android.annotation.NonNull java.time.Instant mEndTime\nprivate final @android.app.ambientcontext.AmbientContextEvent.LevelValue int mConfidenceLevel\nprivate final @android.app.ambientcontext.AmbientContextEvent.LevelValue int mDensityLevel\nprivate final @android.annotation.NonNull android.os.PersistableBundle mVendorData\nprivate static int defaultEventType()\nprivate static @android.annotation.NonNull java.time.Instant defaultStartTime()\nprivate static @android.annotation.NonNull java.time.Instant defaultEndTime()\nprivate static int defaultConfidenceLevel()\nprivate static int defaultDensityLevel()\nprivate static android.os.PersistableBundle defaultVendorData()\nclass AmbientContextEvent extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genBuilder=true, genConstructor=false, genHiddenConstDefs=true, genParcelable=true, genToString=true)")
+ inputSignatures = "public static final int EVENT_UNKNOWN\npublic static final int EVENT_COUGH\npublic static final int EVENT_SNORE\npublic static final int EVENT_BACK_DOUBLE_TAP\npublic static final @android.app.ambientcontext.AmbientContextEvent.Event @android.annotation.FlaggedApi int EVENT_HEART_RATE\npublic static final int EVENT_VENDOR_WEARABLE_START\npublic static final java.lang.String KEY_VENDOR_WEARABLE_EVENT_NAME\nprivate static final int RATE_PER_MINUTE_UNKNOWN\npublic static final int LEVEL_UNKNOWN\npublic static final int LEVEL_LOW\npublic static final int LEVEL_MEDIUM_LOW\npublic static final int LEVEL_MEDIUM\npublic static final int LEVEL_MEDIUM_HIGH\npublic static final int LEVEL_HIGH\nprivate final @android.app.ambientcontext.AmbientContextEvent.EventCode int mEventType\nprivate final @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInstant.class) @android.annotation.NonNull java.time.Instant mStartTime\nprivate final @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInstant.class) @android.annotation.NonNull java.time.Instant mEndTime\nprivate final @android.app.ambientcontext.AmbientContextEvent.LevelValue int mConfidenceLevel\nprivate final @android.app.ambientcontext.AmbientContextEvent.LevelValue int mDensityLevel\nprivate final @android.annotation.NonNull android.os.PersistableBundle mVendorData\nprivate final @android.annotation.IntRange int mRatePerMinute\nprivate static int defaultEventType()\nprivate static @android.annotation.NonNull java.time.Instant defaultStartTime()\nprivate static @android.annotation.NonNull java.time.Instant defaultEndTime()\nprivate static int defaultConfidenceLevel()\nprivate static int defaultDensityLevel()\nprivate static android.os.PersistableBundle defaultVendorData()\nprivate static int defaultRatePerMinute()\nclass AmbientContextEvent extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genBuilder=true, genConstructor=false, genHiddenConstDefs=true, genParcelable=true, genToString=true)")
@Deprecated
private void __metadata() {}
diff --git a/services/core/java/com/android/server/ambientcontext/AmbientContextManagerService.java b/services/core/java/com/android/server/ambientcontext/AmbientContextManagerService.java
index 9f31f375dafe..5f12ce1e4163 100644
--- a/services/core/java/com/android/server/ambientcontext/AmbientContextManagerService.java
+++ b/services/core/java/com/android/server/ambientcontext/AmbientContextManagerService.java
@@ -73,7 +73,8 @@ public class AmbientContextManagerService extends
private static final Set<Integer> DEFAULT_EVENT_SET = Sets.newHashSet(
AmbientContextEvent.EVENT_COUGH,
AmbientContextEvent.EVENT_SNORE,
- AmbientContextEvent.EVENT_BACK_DOUBLE_TAP);
+ AmbientContextEvent.EVENT_BACK_DOUBLE_TAP,
+ AmbientContextEvent.EVENT_HEART_RATE);
/** Default value in absence of {@link DeviceConfig} override. */
private static final boolean DEFAULT_SERVICE_ENABLED = true;