Add isAccumulatedDeltaRangeCapabilityKnown for backward compatibility (frameworks/base)

Bug: 260002331
Test: atest GnssCapabilitiesTest
Change-Id: I82356bc84abddf36b04da5576d34ba6d3f01f32f
This commit is contained in:
Yu-Han Yang
2022-12-22 22:26:25 +00:00
parent 0f5c1d9593
commit 17d08b8f02
4 changed files with 65 additions and 21 deletions

View File

@@ -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);

View File

@@ -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,15 +374,29 @@ 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,11 +792,21 @@ 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.
*/
@@ -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) {

View File

@@ -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);
}

View File

@@ -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();
}