From d2309fa3a9b490feb4196df2b8114d2562de198b Mon Sep 17 00:00:00 2001 From: Yu-Han Yang Date: Wed, 28 Sep 2022 22:58:51 +0000 Subject: [PATCH] Add passive listener support for GnssMeasurement Bug: 248291428 Test: atest GnssMeasurementRegistrationTest Change-Id: Ifac665ff1e85ee9625613e87548460c8974a81bc --- core/api/current.txt | 1 + .../location/GnssMeasurementRequest.java | 18 ++++++++++++++++-- .../gnss/GnssMeasurementsProvider.java | 17 ++++++++++++----- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index c7ca0cdaac5a0..6755e6444b600 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -19450,6 +19450,7 @@ package android.location { method public boolean isFullTracking(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator CREATOR; + field public static final int PASSIVE_INTERVAL = 2147483647; // 0x7fffffff } public static final class GnssMeasurementRequest.Builder { diff --git a/location/java/android/location/GnssMeasurementRequest.java b/location/java/android/location/GnssMeasurementRequest.java index 71cb0e32a706c..a924b977f288d 100644 --- a/location/java/android/location/GnssMeasurementRequest.java +++ b/location/java/android/location/GnssMeasurementRequest.java @@ -31,6 +31,15 @@ import java.util.Objects; * This class contains extra parameters to pass in a GNSS measurement request. */ public final class GnssMeasurementRequest implements Parcelable { + /** + * Represents a passive only request. Such a request will not trigger any active GNSS + * measurements or power usage itself, but may receive GNSS measurements generated in response + * to other requests. + * + * @see GnssMeasurementRequest#getIntervalMillis() + */ + public static final int PASSIVE_INTERVAL = Integer.MAX_VALUE; + private final boolean mCorrelationVectorOutputsEnabled; private final boolean mFullTracking; private final int mIntervalMillis; @@ -76,7 +85,10 @@ public final class GnssMeasurementRequest implements Parcelable { } /** - * Represents the requested time interval between the reported measurements in milliseconds. + * Returns the requested time interval between the reported measurements in milliseconds, or + * {@link #PASSIVE_INTERVAL} if this is a passive, no power request. A passive request will not + * actively generate GNSS measurement updates, but may receive GNSS measurement updates + * generated as a result of other GNSS measurement requests. * *

If the time interval is not set, the default value is 0, which means the fastest rate the * GNSS chipset can report. @@ -213,7 +225,9 @@ public final class GnssMeasurementRequest implements Parcelable { /** * Set the time interval between the reported measurements in milliseconds, which is 0 by - * default. + * default. The request interval may be set to {@link #PASSIVE_INTERVAL} which indicates + * this request will not actively generate GNSS measurement updates, but may receive + * GNSS measurement updates generated as a result of other GNSS measurement requests. * *

An interval of 0 milliseconds means the fastest rate the chipset can report. * diff --git a/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java b/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java index 9f2a9cf86fb69..07e9fe6ad5419 100644 --- a/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java +++ b/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java @@ -112,6 +112,9 @@ public final class GnssMeasurementsProvider extends @Override protected boolean registerWithService(GnssMeasurementRequest request, Collection registrations) { + if (request.getIntervalMillis() == GnssMeasurementRequest.PASSIVE_INTERVAL) { + return true; + } if (mGnssNative.startMeasurementCollection(request.isFullTracking(), request.isCorrelationVectorOutputsEnabled(), request.getIntervalMillis())) { @@ -157,7 +160,7 @@ public final class GnssMeasurementsProvider extends Collection registrations) { boolean fullTracking = false; boolean enableCorrVecOutputs = false; - int intervalMillis = Integer.MAX_VALUE; + int intervalMillis = GnssMeasurementRequest.PASSIVE_INTERVAL; if (mSettingsHelper.isGnssMeasurementsFullTrackingEnabled()) { fullTracking = true; @@ -165,6 +168,10 @@ public final class GnssMeasurementsProvider extends for (GnssListenerRegistration registration : registrations) { GnssMeasurementRequest request = registration.getRequest(); + // passive requests do not contribute to the merged request + if (request.getIntervalMillis() == GnssMeasurementRequest.PASSIVE_INTERVAL) { + continue; + } if (request.isFullTracking()) { fullTracking = true; } @@ -175,10 +182,10 @@ public final class GnssMeasurementsProvider extends } return new GnssMeasurementRequest.Builder() - .setFullTracking(fullTracking) - .setCorrelationVectorOutputsEnabled(enableCorrVecOutputs) - .setIntervalMillis(intervalMillis) - .build(); + .setFullTracking(fullTracking) + .setCorrelationVectorOutputsEnabled(enableCorrVecOutputs) + .setIntervalMillis(intervalMillis) + .build(); } @Override