summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yu-Han Yang <yuhany@google.com> 2022-12-22 22:26:25 +0000
committer Yu-Han Yang <yuhany@google.com> 2023-01-27 18:20:35 +0000
commit17d08b8f02ac43566ed8ea11b2f285c572f135d7 (patch)
tree37e986f9839c6abfb5b02f68bb9c5abd513b2c52
parent0f5c1d95934a717e1ae00af5a419c60804db09ab (diff)
Add isAccumulatedDeltaRangeCapabilityKnown for backward compatibility (frameworks/base)
Bug: 260002331 Test: atest GnssCapabilitiesTest Change-Id: I82356bc84abddf36b04da5576d34ba6d3f01f32f
-rw-r--r--core/api/current.txt2
-rw-r--r--location/java/android/location/GnssCapabilities.java70
-rw-r--r--services/core/java/com/android/server/location/gnss/hal/GnssNative.java5
-rw-r--r--services/core/jni/gnss/GnssCallback.cpp9
4 files changed, 65 insertions, 21 deletions
diff --git a/core/api/current.txt b/core/api/current.txt
index 3d76b6688053..b792ce1f033b 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -20020,6 +20020,7 @@ package android.location {
method public boolean hasSatellitePvt();
method public boolean hasScheduling();
method public boolean hasSingleShotFix();
+ method public boolean isAccumulatedDeltaRangeCapabilityKnown();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.location.GnssCapabilities> CREATOR;
}
@@ -20028,6 +20029,7 @@ package android.location {
ctor public GnssCapabilities.Builder();
ctor public GnssCapabilities.Builder(@NonNull android.location.GnssCapabilities);
method @NonNull public android.location.GnssCapabilities build();
+ method @NonNull public android.location.GnssCapabilities.Builder clearIsAccumulatedDeltaRangeCapabilityKnown();
method @NonNull public android.location.GnssCapabilities.Builder setGnssSignalTypes(@NonNull java.util.List<android.location.GnssSignalType>);
method @NonNull public android.location.GnssCapabilities.Builder setHasAccumulatedDeltaRange(boolean);
method @NonNull public android.location.GnssCapabilities.Builder setHasAntennaInfo(boolean);
diff --git a/location/java/android/location/GnssCapabilities.java b/location/java/android/location/GnssCapabilities.java
index f9f9fa47df97..62f7156d7083 100644
--- a/location/java/android/location/GnssCapabilities.java
+++ b/location/java/android/location/GnssCapabilities.java
@@ -129,21 +129,26 @@ public final class GnssCapabilities implements Parcelable {
* @hide
*/
public static GnssCapabilities empty() {
- return new GnssCapabilities(0, 0, 0, Collections.emptyList());
+ return new GnssCapabilities(/*topFlags=*/ 0, /*isAdrCapabilityKnown=*/ false,
+ /*measurementCorrectionsFlags=*/ 0, /*powerFlags=*/ 0, /*gnssSignalTypes=*/
+ Collections.emptyList());
}
private final @TopHalCapabilityFlags int mTopFlags;
+ private final boolean mIsAdrCapabilityKnown;
private final @SubHalMeasurementCorrectionsCapabilityFlags int mMeasurementCorrectionsFlags;
private final @SubHalPowerCapabilityFlags int mPowerFlags;
private final @NonNull List<GnssSignalType> mGnssSignalTypes;
private GnssCapabilities(
@TopHalCapabilityFlags int topFlags,
+ boolean isAdrCapabilityKnown,
@SubHalMeasurementCorrectionsCapabilityFlags int measurementCorrectionsFlags,
@SubHalPowerCapabilityFlags int powerFlags,
@NonNull List<GnssSignalType> gnssSignalTypes) {
Objects.requireNonNull(gnssSignalTypes);
mTopFlags = topFlags;
+ mIsAdrCapabilityKnown = isAdrCapabilityKnown;
mMeasurementCorrectionsFlags = measurementCorrectionsFlags;
mPowerFlags = powerFlags;
mGnssSignalTypes = Collections.unmodifiableList(gnssSignalTypes);
@@ -154,12 +159,13 @@ public final class GnssCapabilities implements Parcelable {
*
* @hide
*/
- public GnssCapabilities withTopHalFlags(@TopHalCapabilityFlags int flags) {
- if (mTopFlags == flags) {
+ public GnssCapabilities withTopHalFlags(@TopHalCapabilityFlags int flags,
+ boolean isAdrCapabilityKnown) {
+ if (mTopFlags == flags && mIsAdrCapabilityKnown == isAdrCapabilityKnown) {
return this;
} else {
- return new GnssCapabilities(flags, mMeasurementCorrectionsFlags, mPowerFlags,
- mGnssSignalTypes);
+ return new GnssCapabilities(flags, isAdrCapabilityKnown,
+ mMeasurementCorrectionsFlags, mPowerFlags, mGnssSignalTypes);
}
}
@@ -174,7 +180,7 @@ public final class GnssCapabilities implements Parcelable {
if (mMeasurementCorrectionsFlags == flags) {
return this;
} else {
- return new GnssCapabilities(mTopFlags, flags, mPowerFlags,
+ return new GnssCapabilities(mTopFlags, mIsAdrCapabilityKnown, flags, mPowerFlags,
mGnssSignalTypes);
}
}
@@ -189,8 +195,8 @@ public final class GnssCapabilities implements Parcelable {
if (mPowerFlags == flags) {
return this;
} else {
- return new GnssCapabilities(mTopFlags, mMeasurementCorrectionsFlags, flags,
- mGnssSignalTypes);
+ return new GnssCapabilities(mTopFlags, mIsAdrCapabilityKnown,
+ mMeasurementCorrectionsFlags, flags, mGnssSignalTypes);
}
}
@@ -204,8 +210,8 @@ public final class GnssCapabilities implements Parcelable {
if (mGnssSignalTypes.equals(gnssSignalTypes)) {
return this;
} else {
- return new GnssCapabilities(mTopFlags, mMeasurementCorrectionsFlags, mPowerFlags,
- new ArrayList<>(gnssSignalTypes));
+ return new GnssCapabilities(mTopFlags, mIsAdrCapabilityKnown,
+ mMeasurementCorrectionsFlags, mPowerFlags, new ArrayList<>(gnssSignalTypes));
}
}
@@ -368,16 +374,30 @@ public final class GnssCapabilities implements Parcelable {
* Returns {@code true} if GNSS chipset supports accumulated delta range, {@code false}
* otherwise.
*
+ * <p>The value is only known if {@link #isAccumulatedDeltaRangeCapabilityKnown()} is
+ * true.
+ *
* <p>The accumulated delta range information can be queried in
* {@link android.location.GnssMeasurement#getAccumulatedDeltaRangeState()},
* {@link android.location.GnssMeasurement#getAccumulatedDeltaRangeMeters()}, and
* {@link android.location.GnssMeasurement#getAccumulatedDeltaRangeUncertaintyMeters()}.
*/
public boolean hasAccumulatedDeltaRange() {
+ if (!mIsAdrCapabilityKnown) {
+ throw new IllegalStateException("Accumulated delta range capability is unknown.");
+ }
return (mTopFlags & TOP_HAL_CAPABILITY_ACCUMULATED_DELTA_RANGE) != 0;
}
/**
+ * Returns {@code true} if {@link #hasAccumulatedDeltaRange()} is known, {@code false}
+ * otherwise.
+ */
+ public boolean isAccumulatedDeltaRangeCapabilityKnown() {
+ return mIsAdrCapabilityKnown;
+ }
+
+ /**
* Returns {@code true} if GNSS chipset supports line-of-sight satellite identification
* measurement corrections, {@code false} otherwise.
*/
@@ -484,6 +504,7 @@ public final class GnssCapabilities implements Parcelable {
GnssCapabilities that = (GnssCapabilities) o;
return mTopFlags == that.mTopFlags
+ && mIsAdrCapabilityKnown == that.mIsAdrCapabilityKnown
&& mMeasurementCorrectionsFlags == that.mMeasurementCorrectionsFlags
&& mPowerFlags == that.mPowerFlags
&& mGnssSignalTypes.equals(that.mGnssSignalTypes);
@@ -491,15 +512,16 @@ public final class GnssCapabilities implements Parcelable {
@Override
public int hashCode() {
- return Objects.hash(mTopFlags, mMeasurementCorrectionsFlags, mPowerFlags, mGnssSignalTypes);
+ return Objects.hash(mTopFlags, mIsAdrCapabilityKnown, mMeasurementCorrectionsFlags,
+ mPowerFlags, mGnssSignalTypes);
}
public static final @NonNull Creator<GnssCapabilities> CREATOR =
new Creator<GnssCapabilities>() {
@Override
public GnssCapabilities createFromParcel(Parcel in) {
- return new GnssCapabilities(in.readInt(), in.readInt(), in.readInt(),
- in.createTypedArrayList(GnssSignalType.CREATOR));
+ return new GnssCapabilities(in.readInt(), in.readBoolean(), in.readInt(),
+ in.readInt(), in.createTypedArrayList(GnssSignalType.CREATOR));
}
@Override
@@ -516,6 +538,7 @@ public final class GnssCapabilities implements Parcelable {
@Override
public void writeToParcel(@NonNull Parcel parcel, int flags) {
parcel.writeInt(mTopFlags);
+ parcel.writeBoolean(mIsAdrCapabilityKnown);
parcel.writeInt(mMeasurementCorrectionsFlags);
parcel.writeInt(mPowerFlags);
parcel.writeTypedList(mGnssSignalTypes);
@@ -570,8 +593,10 @@ public final class GnssCapabilities implements Parcelable {
if (hasMeasurementCorrectionsForDriving()) {
builder.append("MEASUREMENT_CORRECTIONS_FOR_DRIVING ");
}
- if (hasAccumulatedDeltaRange()) {
+ if (mIsAdrCapabilityKnown && hasAccumulatedDeltaRange()) {
builder.append("ACCUMULATED_DELTA_RANGE ");
+ } else if (!mIsAdrCapabilityKnown) {
+ builder.append("ACCUMULATED_DELTA_RANGE(unknown) ");
}
if (hasMeasurementCorrectionsLosSats()) {
builder.append("LOS_SATS ");
@@ -618,12 +643,14 @@ public final class GnssCapabilities implements Parcelable {
public static final class Builder {
private @TopHalCapabilityFlags int mTopFlags;
+ private boolean mIsAdrCapabilityKnown;
private @SubHalMeasurementCorrectionsCapabilityFlags int mMeasurementCorrectionsFlags;
private @SubHalPowerCapabilityFlags int mPowerFlags;
private @NonNull List<GnssSignalType> mGnssSignalTypes;
public Builder() {
mTopFlags = 0;
+ mIsAdrCapabilityKnown = false;
mMeasurementCorrectionsFlags = 0;
mPowerFlags = 0;
mGnssSignalTypes = Collections.emptyList();
@@ -631,6 +658,7 @@ public final class GnssCapabilities implements Parcelable {
public Builder(@NonNull GnssCapabilities capabilities) {
mTopFlags = capabilities.mTopFlags;
+ mIsAdrCapabilityKnown = capabilities.mIsAdrCapabilityKnown;
mMeasurementCorrectionsFlags = capabilities.mMeasurementCorrectionsFlags;
mPowerFlags = capabilities.mPowerFlags;
mGnssSignalTypes = capabilities.mGnssSignalTypes;
@@ -764,12 +792,22 @@ public final class GnssCapabilities implements Parcelable {
* Sets accumulated delta range capability.
*/
public @NonNull Builder setHasAccumulatedDeltaRange(boolean capable) {
+ mIsAdrCapabilityKnown = true;
mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_ACCUMULATED_DELTA_RANGE,
capable);
return this;
}
/**
+ * Clears accumulated delta range capability and sets it as unknown.
+ */
+ public @NonNull Builder clearIsAccumulatedDeltaRangeCapabilityKnown() {
+ mIsAdrCapabilityKnown = false;
+ mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_ACCUMULATED_DELTA_RANGE, false);
+ return this;
+ }
+
+ /**
* Sets measurement corrections line-of-sight satellites capability.
*/
public @NonNull Builder setHasMeasurementCorrectionsLosSats(boolean capable) {
@@ -860,8 +898,8 @@ public final class GnssCapabilities implements Parcelable {
* Builds a new GnssCapabilities.
*/
public @NonNull GnssCapabilities build() {
- return new GnssCapabilities(mTopFlags, mMeasurementCorrectionsFlags, mPowerFlags,
- new ArrayList<>(mGnssSignalTypes));
+ return new GnssCapabilities(mTopFlags, mIsAdrCapabilityKnown,
+ mMeasurementCorrectionsFlags, mPowerFlags, new ArrayList<>(mGnssSignalTypes));
}
private static int setFlag(int value, int flag, boolean set) {
diff --git a/services/core/java/com/android/server/location/gnss/hal/GnssNative.java b/services/core/java/com/android/server/location/gnss/hal/GnssNative.java
index edb2e5bf3f97..7618419ab0e4 100644
--- a/services/core/java/com/android/server/location/gnss/hal/GnssNative.java
+++ b/services/core/java/com/android/server/location/gnss/hal/GnssNative.java
@@ -1127,13 +1127,14 @@ public class GnssNative {
}
@NativeEntryPoint
- void setTopHalCapabilities(@GnssCapabilities.TopHalCapabilityFlags int capabilities) {
+ void setTopHalCapabilities(@GnssCapabilities.TopHalCapabilityFlags int capabilities,
+ boolean isAdrCapabilityKnown) {
// Here the bits specified by 'capabilities' are turned on. It is handled differently from
// sub hal because top hal capabilities could be set by HIDL HAL and/or AIDL HAL. Each of
// them possesses a different set of capabilities.
mTopFlags |= capabilities;
GnssCapabilities oldCapabilities = mCapabilities;
- mCapabilities = oldCapabilities.withTopHalFlags(mTopFlags);
+ mCapabilities = oldCapabilities.withTopHalFlags(mTopFlags, isAdrCapabilityKnown);
onCapabilitiesChanged(oldCapabilities, mCapabilities);
}
diff --git a/services/core/jni/gnss/GnssCallback.cpp b/services/core/jni/gnss/GnssCallback.cpp
index 3c1ac1e4144e..60eed8e6d716 100644
--- a/services/core/jni/gnss/GnssCallback.cpp
+++ b/services/core/jni/gnss/GnssCallback.cpp
@@ -95,7 +95,7 @@ void Gnss_class_init_once(JNIEnv* env, jclass& clazz) {
method_reportSvStatus = env->GetMethodID(clazz, "reportSvStatus", "(I[I[F[F[F[F[F)V");
method_reportNmea = env->GetMethodID(clazz, "reportNmea", "(J)V");
- method_setTopHalCapabilities = env->GetMethodID(clazz, "setTopHalCapabilities", "(I)V");
+ method_setTopHalCapabilities = env->GetMethodID(clazz, "setTopHalCapabilities", "(IZ)V");
method_setSignalTypeCapabilities =
env->GetMethodID(clazz, "setSignalTypeCapabilities", "(Ljava/util/List;)V");
method_setGnssYearOfHardware = env->GetMethodID(clazz, "setGnssYearOfHardware", "(I)V");
@@ -120,8 +120,10 @@ void Gnss_class_init_once(JNIEnv* env, jclass& clazz) {
Status GnssCallbackAidl::gnssSetCapabilitiesCb(const int capabilities) {
ALOGD("%s: %du\n", __func__, capabilities);
+ bool isAdrCapabilityKnown = (getInterfaceVersion() >= 3) ? true : false;
JNIEnv* env = getJniEnv();
- env->CallVoidMethod(mCallbacksObj, method_setTopHalCapabilities, capabilities);
+ env->CallVoidMethod(mCallbacksObj, method_setTopHalCapabilities, capabilities,
+ isAdrCapabilityKnown);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
return Status::ok();
}
@@ -409,7 +411,8 @@ Return<void> GnssCallbackHidl::gnssSetCapabilitesCb(uint32_t capabilities) {
ALOGD("%s: %du\n", __func__, capabilities);
JNIEnv* env = getJniEnv();
- env->CallVoidMethod(mCallbacksObj, method_setTopHalCapabilities, capabilities);
+ env->CallVoidMethod(mCallbacksObj, method_setTopHalCapabilities, capabilities,
+ /* isAdrCapabilityKnown= */ false);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
return Void();
}