diff options
-rw-r--r-- | core/api/current.txt | 2 | ||||
-rw-r--r-- | location/java/android/location/GnssCapabilities.java | 70 | ||||
-rw-r--r-- | services/core/java/com/android/server/location/gnss/hal/GnssNative.java | 5 | ||||
-rw-r--r-- | services/core/jni/gnss/GnssCallback.cpp | 9 |
4 files changed, 65 insertions, 21 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index deb4b7ce0618..53e671da4372 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -20181,6 +20181,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; } @@ -20189,6 +20190,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 11b5833e35b3..c6f32c2cd387 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)); } } @@ -372,16 +378,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. */ @@ -488,6 +508,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); @@ -495,15 +516,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 @@ -520,6 +542,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); @@ -574,8 +597,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 "); @@ -622,12 +647,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(); @@ -635,6 +662,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; @@ -768,12 +796,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) { @@ -864,8 +902,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(); } |