| /* | |
| * Copyright (C) 2019 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| package android.location; | |
| import android.annotation.IntDef; | |
| import android.annotation.NonNull; | |
| import android.annotation.SystemApi; | |
| import android.os.Parcel; | |
| import android.os.Parcelable; | |
| import java.lang.annotation.Retention; | |
| import java.lang.annotation.RetentionPolicy; | |
| import java.util.ArrayList; | |
| import java.util.Collections; | |
| import java.util.List; | |
| import java.util.Objects; | |
| import java.util.concurrent.Executor; | |
| /** | |
| * GNSS chipset capabilities. | |
| */ | |
| public final class GnssCapabilities implements Parcelable { | |
| // IMPORTANT - must match the Capabilities enum in IGnssCallback.hal | |
| /** @hide */ | |
| public static final int TOP_HAL_CAPABILITY_SCHEDULING = 1; | |
| /** @hide */ | |
| public static final int TOP_HAL_CAPABILITY_MSB = 1 << 1; | |
| /** @hide */ | |
| public static final int TOP_HAL_CAPABILITY_MSA = 1 << 2; | |
| /** @hide */ | |
| public static final int TOP_HAL_CAPABILITY_SINGLE_SHOT = 1 << 3; | |
| /** @hide */ | |
| public static final int TOP_HAL_CAPABILITY_ON_DEMAND_TIME = 1 << 4; | |
| /** @hide */ | |
| public static final int TOP_HAL_CAPABILITY_GEOFENCING = 1 << 5; | |
| /** @hide */ | |
| public static final int TOP_HAL_CAPABILITY_MEASUREMENTS = 1 << 6; | |
| /** @hide */ | |
| public static final int TOP_HAL_CAPABILITY_NAV_MESSAGES = 1 << 7; | |
| /** @hide */ | |
| public static final int TOP_HAL_CAPABILITY_LOW_POWER_MODE = 1 << 8; | |
| /** @hide */ | |
| public static final int TOP_HAL_CAPABILITY_SATELLITE_BLOCKLIST = 1 << 9; | |
| /** @hide */ | |
| public static final int TOP_HAL_CAPABILITY_MEASUREMENT_CORRECTIONS = 1 << 10; | |
| /** @hide */ | |
| public static final int TOP_HAL_CAPABILITY_ANTENNA_INFO = 1 << 11; | |
| /** @hide */ | |
| public static final int TOP_HAL_CAPABILITY_CORRELATION_VECTOR = 1 << 12; | |
| /** @hide */ | |
| public static final int TOP_HAL_CAPABILITY_SATELLITE_PVT = 1 << 13; | |
| /** @hide */ | |
| public static final int TOP_HAL_CAPABILITY_MEASUREMENT_CORRECTIONS_FOR_DRIVING = 1 << 14; | |
| /** @hide */ | |
| public static final int TOP_HAL_CAPABILITY_ACCUMULATED_DELTA_RANGE = 1 << 15; | |
| /** @hide */ | |
| @IntDef(flag = true, prefix = {"TOP_HAL_CAPABILITY_"}, value = {TOP_HAL_CAPABILITY_SCHEDULING, | |
| TOP_HAL_CAPABILITY_MSB, TOP_HAL_CAPABILITY_MSA, TOP_HAL_CAPABILITY_SINGLE_SHOT, | |
| TOP_HAL_CAPABILITY_ON_DEMAND_TIME, TOP_HAL_CAPABILITY_GEOFENCING, | |
| TOP_HAL_CAPABILITY_MEASUREMENTS, TOP_HAL_CAPABILITY_NAV_MESSAGES, | |
| TOP_HAL_CAPABILITY_LOW_POWER_MODE, TOP_HAL_CAPABILITY_SATELLITE_BLOCKLIST, | |
| TOP_HAL_CAPABILITY_MEASUREMENT_CORRECTIONS, TOP_HAL_CAPABILITY_ANTENNA_INFO, | |
| TOP_HAL_CAPABILITY_CORRELATION_VECTOR, TOP_HAL_CAPABILITY_SATELLITE_PVT, | |
| TOP_HAL_CAPABILITY_MEASUREMENT_CORRECTIONS_FOR_DRIVING, | |
| TOP_HAL_CAPABILITY_ACCUMULATED_DELTA_RANGE}) | |
| @Retention(RetentionPolicy.SOURCE) | |
| public @interface TopHalCapabilityFlags {} | |
| // IMPORTANT - must match the Capabilities enum in IMeasurementCorrectionsCallback.hal | |
| /** @hide */ | |
| public static final int SUB_HAL_MEASUREMENT_CORRECTIONS_CAPABILITY_LOS_SATS = 1; | |
| /** @hide */ | |
| public static final int SUB_HAL_MEASUREMENT_CORRECTIONS_CAPABILITY_EXCESS_PATH_LENGTH = 2; | |
| /** @hide */ | |
| public static final int SUB_HAL_MEASUREMENT_CORRECTIONS_CAPABILITY_REFLECTING_PLANE = 4; | |
| /** @hide */ | |
| @IntDef(flag = true, prefix = {"SUB_HAL_MEASUREMENT_CORRECTIONS_CAPABILITY_"}, value = { | |
| SUB_HAL_MEASUREMENT_CORRECTIONS_CAPABILITY_LOS_SATS, | |
| SUB_HAL_MEASUREMENT_CORRECTIONS_CAPABILITY_EXCESS_PATH_LENGTH, | |
| SUB_HAL_MEASUREMENT_CORRECTIONS_CAPABILITY_REFLECTING_PLANE}) | |
| @Retention(RetentionPolicy.SOURCE) | |
| public @interface SubHalMeasurementCorrectionsCapabilityFlags {} | |
| // IMPORATANT - must match values in IGnssPowerIndicationCallback.aidl | |
| /** @hide */ | |
| public static final int SUB_HAL_POWER_CAPABILITY_TOTAL = 1; | |
| /** @hide */ | |
| public static final int SUB_HAL_POWER_CAPABILITY_SINGLEBAND_TRACKING = 2; | |
| /** @hide */ | |
| public static final int SUB_HAL_POWER_CAPABILITY_MULTIBAND_TRACKING = 4; | |
| /** @hide */ | |
| public static final int SUB_HAL_POWER_CAPABILITY_SINGLEBAND_ACQUISITION = 8; | |
| /** @hide */ | |
| public static final int SUB_HAL_POWER_CAPABILITY_MULTIBAND_ACQUISITION = 16; | |
| /** @hide */ | |
| public static final int SUB_HAL_POWER_CAPABILITY_OTHER_MODES = 32; | |
| /** @hide */ | |
| @IntDef(flag = true, prefix = {"SUB_HAL_POWER_CAPABILITY_"}, value = { | |
| SUB_HAL_POWER_CAPABILITY_TOTAL, SUB_HAL_POWER_CAPABILITY_SINGLEBAND_TRACKING, | |
| SUB_HAL_POWER_CAPABILITY_MULTIBAND_TRACKING, | |
| SUB_HAL_POWER_CAPABILITY_SINGLEBAND_ACQUISITION, | |
| SUB_HAL_POWER_CAPABILITY_MULTIBAND_ACQUISITION, | |
| SUB_HAL_POWER_CAPABILITY_OTHER_MODES}) | |
| @Retention(RetentionPolicy.SOURCE) | |
| public @interface SubHalPowerCapabilityFlags {} | |
| /** The capability is unknown to be supported or not. */ | |
| public static final int CAPABILITY_UNKNOWN = 0; | |
| /** The capability is supported. */ | |
| public static final int CAPABILITY_SUPPORTED = 1; | |
| /** The capability is not supported. */ | |
| public static final int CAPABILITY_UNSUPPORTED = 2; | |
| /** @hide */ | |
| @IntDef(flag = true, prefix = {"CAPABILITY_"}, value = {CAPABILITY_UNKNOWN, | |
| CAPABILITY_SUPPORTED, | |
| CAPABILITY_UNSUPPORTED}) | |
| @Retention(RetentionPolicy.SOURCE) | |
| public @interface CapabilitySupportType {} | |
| /** | |
| * Returns an empty GnssCapabilities object. | |
| * | |
| * @hide | |
| */ | |
| public static GnssCapabilities empty() { | |
| 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); | |
| } | |
| /** | |
| * Returns a new GnssCapabilities object with top hal values set from the given flags. | |
| * | |
| * @hide | |
| */ | |
| public GnssCapabilities withTopHalFlags(@TopHalCapabilityFlags int flags, | |
| boolean isAdrCapabilityKnown) { | |
| if (mTopFlags == flags && mIsAdrCapabilityKnown == isAdrCapabilityKnown) { | |
| return this; | |
| } else { | |
| return new GnssCapabilities(flags, isAdrCapabilityKnown, | |
| mMeasurementCorrectionsFlags, mPowerFlags, mGnssSignalTypes); | |
| } | |
| } | |
| /** | |
| * Returns a new GnssCapabilities object with gnss measurement corrections sub hal values set | |
| * from the given flags. | |
| * | |
| * @hide | |
| */ | |
| public GnssCapabilities withSubHalMeasurementCorrectionsFlags( | |
| @SubHalMeasurementCorrectionsCapabilityFlags int flags) { | |
| if (mMeasurementCorrectionsFlags == flags) { | |
| return this; | |
| } else { | |
| return new GnssCapabilities(mTopFlags, mIsAdrCapabilityKnown, flags, mPowerFlags, | |
| mGnssSignalTypes); | |
| } | |
| } | |
| /** | |
| * Returns a new GnssCapabilities object with gnss measurement corrections sub hal values set | |
| * from the given flags. | |
| * | |
| * @hide | |
| */ | |
| public GnssCapabilities withSubHalPowerFlags(@SubHalPowerCapabilityFlags int flags) { | |
| if (mPowerFlags == flags) { | |
| return this; | |
| } else { | |
| return new GnssCapabilities(mTopFlags, mIsAdrCapabilityKnown, | |
| mMeasurementCorrectionsFlags, flags, mGnssSignalTypes); | |
| } | |
| } | |
| /** | |
| * Returns a new GnssCapabilities object with a list of GnssSignalType. | |
| * | |
| * @hide | |
| */ | |
| public GnssCapabilities withSignalTypes(@NonNull List<GnssSignalType> gnssSignalTypes) { | |
| Objects.requireNonNull(gnssSignalTypes); | |
| if (mGnssSignalTypes.equals(gnssSignalTypes)) { | |
| return this; | |
| } else { | |
| return new GnssCapabilities(mTopFlags, mIsAdrCapabilityKnown, | |
| mMeasurementCorrectionsFlags, mPowerFlags, new ArrayList<>(gnssSignalTypes)); | |
| } | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports scheduling, {@code false} otherwise. | |
| */ | |
| public boolean hasScheduling() { | |
| return (mTopFlags & TOP_HAL_CAPABILITY_SCHEDULING) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports Mobile Station Based assistance, {@code false} | |
| * otherwise. | |
| */ | |
| public boolean hasMsb() { | |
| return (mTopFlags & TOP_HAL_CAPABILITY_MSB) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports Mobile Station Assisted assitance, | |
| * {@code false} otherwise. | |
| */ | |
| public boolean hasMsa() { | |
| return (mTopFlags & TOP_HAL_CAPABILITY_MSA) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports single shot locating, {@code false} otherwise. | |
| */ | |
| public boolean hasSingleShotFix() { | |
| return (mTopFlags & TOP_HAL_CAPABILITY_SINGLE_SHOT) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset requests periodic time signal injection from the | |
| * platform in addition to on-demand and occasional time updates, {@code false} otherwise. | |
| * | |
| * <p><em>Note: The naming of this capability and the behavior it controls differ substantially. | |
| * This is the result of a historic implementation bug, b/73893222.</em> | |
| */ | |
| public boolean hasOnDemandTime() { | |
| return (mTopFlags & TOP_HAL_CAPABILITY_ON_DEMAND_TIME) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports geofencing, {@code false} otherwise. | |
| */ | |
| public boolean hasGeofencing() { | |
| return (mTopFlags & TOP_HAL_CAPABILITY_GEOFENCING) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports measurements, {@code false} otherwise. | |
| * | |
| * @see LocationManager#registerGnssMeasurementsCallback(Executor, GnssMeasurementsEvent.Callback) | |
| */ | |
| public boolean hasMeasurements() { | |
| return (mTopFlags & TOP_HAL_CAPABILITY_MEASUREMENTS) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports navigation messages, {@code false} otherwise. | |
| * | |
| * @deprecated Use {@link #hasNavigationMessages()} instead. | |
| * | |
| * @hide | |
| */ | |
| @Deprecated | |
| @SystemApi | |
| public boolean hasNavMessages() { | |
| return hasNavigationMessages(); | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports navigation messages, {@code false} otherwise. | |
| * | |
| * @see LocationManager#registerGnssNavigationMessageCallback(Executor, GnssNavigationMessage.Callback) | |
| */ | |
| public boolean hasNavigationMessages() { | |
| return (mTopFlags & TOP_HAL_CAPABILITY_NAV_MESSAGES) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports low power mode, {@code false} otherwise. | |
| * | |
| * <p>The low power mode is defined in GNSS HAL. When the low power mode is active, the GNSS | |
| * hardware must make strong tradeoffs to substantially restrict power use. | |
| */ | |
| public boolean hasLowPowerMode() { | |
| return (mTopFlags & TOP_HAL_CAPABILITY_LOW_POWER_MODE) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports satellite blocklists, {@code false} otherwise. | |
| * | |
| * @deprecated Use {@link #hasSatelliteBlocklist} instead. | |
| * | |
| * @hide | |
| */ | |
| @SystemApi | |
| @Deprecated | |
| public boolean hasSatelliteBlacklist() { | |
| return (mTopFlags & TOP_HAL_CAPABILITY_SATELLITE_BLOCKLIST) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports satellite blocklists, {@code false} otherwise. | |
| */ | |
| public boolean hasSatelliteBlocklist() { | |
| return (mTopFlags & TOP_HAL_CAPABILITY_SATELLITE_BLOCKLIST) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports satellite PVT, {@code false} otherwise. | |
| */ | |
| public boolean hasSatellitePvt() { | |
| return (mTopFlags & TOP_HAL_CAPABILITY_SATELLITE_PVT) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports measurement corrections, {@code false} | |
| * otherwise. | |
| */ | |
| public boolean hasMeasurementCorrections() { | |
| return (mTopFlags & TOP_HAL_CAPABILITY_MEASUREMENT_CORRECTIONS) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports antenna info, {@code false} otherwise. | |
| * | |
| * @deprecated Use {@link #hasAntennaInfo()} instead. | |
| */ | |
| @Deprecated | |
| public boolean hasGnssAntennaInfo() { | |
| return hasAntennaInfo(); | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports antenna info, {@code false} otherwise. | |
| * | |
| * @see LocationManager#registerAntennaInfoListener(Executor, GnssAntennaInfo.Listener) | |
| */ | |
| public boolean hasAntennaInfo() { | |
| return (mTopFlags & TOP_HAL_CAPABILITY_ANTENNA_INFO) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports correlation vectors as part of measurements | |
| * outputs, {@code false} otherwise. | |
| */ | |
| public boolean hasMeasurementCorrelationVectors() { | |
| return (mTopFlags & TOP_HAL_CAPABILITY_CORRELATION_VECTOR) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset will benefit from measurement corrections for driving | |
| * use case if provided, {@code false} otherwise. | |
| */ | |
| public boolean hasMeasurementCorrectionsForDriving() { | |
| return (mTopFlags & TOP_HAL_CAPABILITY_MEASUREMENT_CORRECTIONS_FOR_DRIVING) != 0; | |
| } | |
| /** | |
| * Returns {@link #CAPABILITY_SUPPORTED} if GNSS chipset supports accumulated delta | |
| * range, {@link #CAPABILITY_UNSUPPORTED} if GNSS chipset does not support accumulated | |
| * delta range, and {@link #CAPABILITY_UNKNOWN} if it is unknown, which means GNSS | |
| * chipset may or may not support accumulated delta range. | |
| * | |
| * <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 @CapabilitySupportType int hasAccumulatedDeltaRange() { | |
| if (!mIsAdrCapabilityKnown) { | |
| return CAPABILITY_UNKNOWN; | |
| } | |
| if ((mTopFlags & TOP_HAL_CAPABILITY_ACCUMULATED_DELTA_RANGE) != 0) { | |
| return CAPABILITY_SUPPORTED; | |
| } else { | |
| return CAPABILITY_UNSUPPORTED; | |
| } | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports line-of-sight satellite identification | |
| * measurement corrections, {@code false} otherwise. | |
| */ | |
| public boolean hasMeasurementCorrectionsLosSats() { | |
| return (mMeasurementCorrectionsFlags & SUB_HAL_MEASUREMENT_CORRECTIONS_CAPABILITY_LOS_SATS) | |
| != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports per satellite excess-path-length measurement | |
| * corrections, {@code false} otherwise. | |
| */ | |
| public boolean hasMeasurementCorrectionsExcessPathLength() { | |
| return (mMeasurementCorrectionsFlags | |
| & SUB_HAL_MEASUREMENT_CORRECTIONS_CAPABILITY_EXCESS_PATH_LENGTH) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports reflecting plane measurement corrections, | |
| * {@code false} otherwise. | |
| * | |
| * @deprecated Use {@link #hasMeasurementCorrectionsReflectingPlane()} instead. | |
| * | |
| * @hide | |
| */ | |
| @SystemApi | |
| public boolean hasMeasurementCorrectionsReflectingPane() { | |
| return hasMeasurementCorrectionsReflectingPlane(); | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports reflecting plane measurement corrections, | |
| * {@code false} otherwise. | |
| */ | |
| public boolean hasMeasurementCorrectionsReflectingPlane() { | |
| return (mMeasurementCorrectionsFlags | |
| & SUB_HAL_MEASUREMENT_CORRECTIONS_CAPABILITY_REFLECTING_PLANE) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports measuring power totals, {@code false} | |
| * otherwise. | |
| */ | |
| public boolean hasPowerTotal() { | |
| return (mPowerFlags & SUB_HAL_POWER_CAPABILITY_TOTAL) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports measuring single-band tracking power, | |
| * {@code false} otherwise. | |
| */ | |
| public boolean hasPowerSinglebandTracking() { | |
| return (mPowerFlags & SUB_HAL_POWER_CAPABILITY_SINGLEBAND_TRACKING) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports measuring multi-band tracking power, | |
| * {@code false} otherwise. | |
| */ | |
| public boolean hasPowerMultibandTracking() { | |
| return (mPowerFlags & SUB_HAL_POWER_CAPABILITY_MULTIBAND_TRACKING) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports measuring single-band acquisition power, | |
| * {@code false} otherwise. | |
| */ | |
| public boolean hasPowerSinglebandAcquisition() { | |
| return (mPowerFlags & SUB_HAL_POWER_CAPABILITY_SINGLEBAND_ACQUISITION) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports measuring multi-band acquisition power, | |
| * {@code false} otherwise. | |
| */ | |
| public boolean hasPowerMultibandAcquisition() { | |
| return (mPowerFlags & SUB_HAL_POWER_CAPABILITY_MULTIBAND_ACQUISITION) != 0; | |
| } | |
| /** | |
| * Returns {@code true} if GNSS chipset supports measuring OEM defined mode power, {@code false} | |
| * otherwise. | |
| */ | |
| public boolean hasPowerOtherModes() { | |
| return (mPowerFlags & SUB_HAL_POWER_CAPABILITY_OTHER_MODES) != 0; | |
| } | |
| /** | |
| * Returns the list of {@link GnssSignalType}s that the GNSS chipset supports. | |
| */ | |
| @NonNull | |
| public List<GnssSignalType> getGnssSignalTypes() { | |
| return mGnssSignalTypes; | |
| } | |
| @Override | |
| public boolean equals(Object o) { | |
| if (this == o) { | |
| return true; | |
| } | |
| if (!(o instanceof GnssCapabilities)) { | |
| return false; | |
| } | |
| GnssCapabilities that = (GnssCapabilities) o; | |
| return mTopFlags == that.mTopFlags | |
| && mIsAdrCapabilityKnown == that.mIsAdrCapabilityKnown | |
| && mMeasurementCorrectionsFlags == that.mMeasurementCorrectionsFlags | |
| && mPowerFlags == that.mPowerFlags | |
| && mGnssSignalTypes.equals(that.mGnssSignalTypes); | |
| } | |
| @Override | |
| public int hashCode() { | |
| 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.readBoolean(), in.readInt(), | |
| in.readInt(), in.createTypedArrayList(GnssSignalType.CREATOR)); | |
| } | |
| @Override | |
| public GnssCapabilities[] newArray(int size) { | |
| return new GnssCapabilities[size]; | |
| } | |
| }; | |
| @Override | |
| public int describeContents() { | |
| return 0; | |
| } | |
| @Override | |
| public void writeToParcel(@NonNull Parcel parcel, int flags) { | |
| parcel.writeInt(mTopFlags); | |
| parcel.writeBoolean(mIsAdrCapabilityKnown); | |
| parcel.writeInt(mMeasurementCorrectionsFlags); | |
| parcel.writeInt(mPowerFlags); | |
| parcel.writeTypedList(mGnssSignalTypes); | |
| } | |
| @Override | |
| public String toString() { | |
| StringBuilder builder = new StringBuilder(); | |
| builder.append("["); | |
| if (hasScheduling()) { | |
| builder.append("SCHEDULING "); | |
| } | |
| if (hasMsb()) { | |
| builder.append("MSB "); | |
| } | |
| if (hasMsa()) { | |
| builder.append("MSA "); | |
| } | |
| if (hasSingleShotFix()) { | |
| builder.append("SINGLE_SHOT "); | |
| } | |
| if (hasOnDemandTime()) { | |
| builder.append("ON_DEMAND_TIME "); | |
| } | |
| if (hasGeofencing()) { | |
| builder.append("GEOFENCING "); | |
| } | |
| if (hasMeasurementCorrections()) { | |
| builder.append("MEASUREMENTS "); | |
| } | |
| if (hasNavigationMessages()) { | |
| builder.append("NAVIGATION_MESSAGES "); | |
| } | |
| if (hasLowPowerMode()) { | |
| builder.append("LOW_POWER_MODE "); | |
| } | |
| if (hasSatelliteBlocklist()) { | |
| builder.append("SATELLITE_BLOCKLIST "); | |
| } | |
| if (hasSatellitePvt()) { | |
| builder.append("SATELLITE_PVT "); | |
| } | |
| if (hasMeasurementCorrections()) { | |
| builder.append("MEASUREMENT_CORRECTIONS "); | |
| } | |
| if (hasAntennaInfo()) { | |
| builder.append("ANTENNA_INFO "); | |
| } | |
| if (hasMeasurementCorrelationVectors()) { | |
| builder.append("MEASUREMENT_CORRELATION_VECTORS "); | |
| } | |
| if (hasMeasurementCorrectionsForDriving()) { | |
| builder.append("MEASUREMENT_CORRECTIONS_FOR_DRIVING "); | |
| } | |
| if (hasAccumulatedDeltaRange() == CAPABILITY_SUPPORTED) { | |
| builder.append("ACCUMULATED_DELTA_RANGE "); | |
| } else if (hasAccumulatedDeltaRange() == CAPABILITY_UNKNOWN) { | |
| builder.append("ACCUMULATED_DELTA_RANGE(unknown) "); | |
| } | |
| if (hasMeasurementCorrectionsLosSats()) { | |
| builder.append("LOS_SATS "); | |
| } | |
| if (hasMeasurementCorrectionsExcessPathLength()) { | |
| builder.append("EXCESS_PATH_LENGTH "); | |
| } | |
| if (hasMeasurementCorrectionsReflectingPlane()) { | |
| builder.append("REFLECTING_PLANE "); | |
| } | |
| if (hasPowerTotal()) { | |
| builder.append("TOTAL_POWER "); | |
| } | |
| if (hasPowerSinglebandTracking()) { | |
| builder.append("SINGLEBAND_TRACKING_POWER "); | |
| } | |
| if (hasPowerMultibandTracking()) { | |
| builder.append("MULTIBAND_TRACKING_POWER "); | |
| } | |
| if (hasPowerSinglebandAcquisition()) { | |
| builder.append("SINGLEBAND_ACQUISITION_POWER "); | |
| } | |
| if (hasPowerMultibandAcquisition()) { | |
| builder.append("MULTIBAND_ACQUISITION_POWER "); | |
| } | |
| if (hasPowerOtherModes()) { | |
| builder.append("OTHER_MODES_POWER "); | |
| } | |
| if (!mGnssSignalTypes.isEmpty()) { | |
| builder.append("signalTypes=").append(mGnssSignalTypes).append(" "); | |
| } | |
| if (builder.length() > 1) { | |
| builder.setLength(builder.length() - 1); | |
| } else { | |
| builder.append("NONE"); | |
| } | |
| builder.append("]"); | |
| return builder.toString(); | |
| } | |
| /** | |
| * Builder for GnssCapabilities. | |
| */ | |
| 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(); | |
| } | |
| public Builder(@NonNull GnssCapabilities capabilities) { | |
| mTopFlags = capabilities.mTopFlags; | |
| mIsAdrCapabilityKnown = capabilities.mIsAdrCapabilityKnown; | |
| mMeasurementCorrectionsFlags = capabilities.mMeasurementCorrectionsFlags; | |
| mPowerFlags = capabilities.mPowerFlags; | |
| mGnssSignalTypes = capabilities.mGnssSignalTypes; | |
| } | |
| /** | |
| * Sets scheduling capability. | |
| */ | |
| public @NonNull Builder setHasScheduling(boolean capable) { | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_SCHEDULING, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets Mobile Station Based capability. | |
| */ | |
| public @NonNull Builder setHasMsb(boolean capable) { | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_MSB, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets Mobile Station Assisted capability. | |
| */ | |
| public @NonNull Builder setHasMsa(boolean capable) { | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_MSA, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets single shot locating capability. | |
| */ | |
| public @NonNull Builder setHasSingleShotFix(boolean capable) { | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_SINGLE_SHOT, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets on demand time capability. | |
| */ | |
| public @NonNull Builder setHasOnDemandTime(boolean capable) { | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_ON_DEMAND_TIME, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets geofencing capability. | |
| */ | |
| public @NonNull Builder setHasGeofencing(boolean capable) { | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_GEOFENCING, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets measurements capability. | |
| */ | |
| public @NonNull Builder setHasMeasurements(boolean capable) { | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_MEASUREMENTS, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets navigation messages capability. | |
| */ | |
| public @NonNull Builder setHasNavigationMessages(boolean capable) { | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_NAV_MESSAGES, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets low power mode capability. | |
| * | |
| * <p>The low power mode is defined in GNSS HAL. When the low power mode is active, the GNSS | |
| * hardware must make strong tradeoffs to substantially restrict power use. | |
| */ | |
| public @NonNull Builder setHasLowPowerMode(boolean capable) { | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_LOW_POWER_MODE, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets satellite blocklist capability. | |
| */ | |
| public @NonNull Builder setHasSatelliteBlocklist(boolean capable) { | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_SATELLITE_BLOCKLIST, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets satellite PVT capability. | |
| */ | |
| public @NonNull Builder setHasSatellitePvt(boolean capable) { | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_SATELLITE_PVT, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets measurement corrections capability. | |
| */ | |
| public @NonNull Builder setHasMeasurementCorrections(boolean capable) { | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_MEASUREMENT_CORRECTIONS, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets antenna info capability. | |
| */ | |
| public @NonNull Builder setHasAntennaInfo(boolean capable) { | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_ANTENNA_INFO, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets correlation vector capability. | |
| */ | |
| public @NonNull Builder setHasMeasurementCorrelationVectors(boolean capable) { | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_CORRELATION_VECTOR, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets measurement corrections for driving capability. | |
| */ | |
| public @NonNull Builder setHasMeasurementCorrectionsForDriving(boolean capable) { | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_MEASUREMENT_CORRECTIONS_FOR_DRIVING, | |
| capable); | |
| return this; | |
| } | |
| /** | |
| * Sets accumulated delta range capability. | |
| */ | |
| public @NonNull Builder setHasAccumulatedDeltaRange(@CapabilitySupportType int capable) { | |
| if (capable == CAPABILITY_UNKNOWN) { | |
| mIsAdrCapabilityKnown = false; | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_ACCUMULATED_DELTA_RANGE, false); | |
| } else if (capable == CAPABILITY_SUPPORTED) { | |
| mIsAdrCapabilityKnown = true; | |
| mTopFlags = setFlag(mTopFlags, TOP_HAL_CAPABILITY_ACCUMULATED_DELTA_RANGE, true); | |
| } else if (capable == CAPABILITY_UNSUPPORTED) { | |
| mIsAdrCapabilityKnown = true; | |
| 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) { | |
| mMeasurementCorrectionsFlags = setFlag(mMeasurementCorrectionsFlags, | |
| SUB_HAL_MEASUREMENT_CORRECTIONS_CAPABILITY_LOS_SATS, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets measurement corrections excess path length capability. | |
| */ | |
| public @NonNull Builder setHasMeasurementCorrectionsExcessPathLength(boolean capable) { | |
| mMeasurementCorrectionsFlags = setFlag(mMeasurementCorrectionsFlags, | |
| SUB_HAL_MEASUREMENT_CORRECTIONS_CAPABILITY_EXCESS_PATH_LENGTH, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets measurement corrections reflecting plane capability. | |
| */ | |
| public @NonNull Builder setHasMeasurementCorrectionsReflectingPlane(boolean capable) { | |
| mMeasurementCorrectionsFlags = setFlag(mMeasurementCorrectionsFlags, | |
| SUB_HAL_MEASUREMENT_CORRECTIONS_CAPABILITY_REFLECTING_PLANE, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets power totals capability. | |
| */ | |
| public @NonNull Builder setHasPowerTotal(boolean capable) { | |
| mPowerFlags = setFlag(mPowerFlags, SUB_HAL_POWER_CAPABILITY_TOTAL, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets power single-band tracking capability. | |
| */ | |
| public @NonNull Builder setHasPowerSinglebandTracking(boolean capable) { | |
| mPowerFlags = setFlag(mPowerFlags, SUB_HAL_POWER_CAPABILITY_SINGLEBAND_TRACKING, | |
| capable); | |
| return this; | |
| } | |
| /** | |
| * Sets power multi-band tracking capability. | |
| */ | |
| public @NonNull Builder setHasPowerMultibandTracking(boolean capable) { | |
| mPowerFlags = setFlag(mPowerFlags, SUB_HAL_POWER_CAPABILITY_MULTIBAND_TRACKING, | |
| capable); | |
| return this; | |
| } | |
| /** | |
| * Sets power single-band acquisition capability. | |
| */ | |
| public @NonNull Builder setHasPowerSinglebandAcquisition(boolean capable) { | |
| mPowerFlags = setFlag(mPowerFlags, SUB_HAL_POWER_CAPABILITY_SINGLEBAND_ACQUISITION, | |
| capable); | |
| return this; | |
| } | |
| /** | |
| * Sets power multi-band acquisition capability. | |
| */ | |
| public @NonNull Builder setHasPowerMultibandAcquisition(boolean capable) { | |
| mPowerFlags = setFlag(mPowerFlags, SUB_HAL_POWER_CAPABILITY_MULTIBAND_ACQUISITION, | |
| capable); | |
| return this; | |
| } | |
| /** | |
| * Sets OEM-defined power modes capability. | |
| */ | |
| public @NonNull Builder setHasPowerOtherModes(boolean capable) { | |
| mPowerFlags = setFlag(mPowerFlags, SUB_HAL_POWER_CAPABILITY_OTHER_MODES, capable); | |
| return this; | |
| } | |
| /** | |
| * Sets a list of {@link GnssSignalType}. | |
| */ | |
| public @NonNull Builder setGnssSignalTypes(@NonNull List<GnssSignalType> gnssSignalTypes) { | |
| mGnssSignalTypes = gnssSignalTypes; | |
| return this; | |
| } | |
| /** | |
| * Builds a new GnssCapabilities. | |
| */ | |
| public @NonNull GnssCapabilities build() { | |
| return new GnssCapabilities(mTopFlags, mIsAdrCapabilityKnown, | |
| mMeasurementCorrectionsFlags, mPowerFlags, new ArrayList<>(mGnssSignalTypes)); | |
| } | |
| private static int setFlag(int value, int flag, boolean set) { | |
| if (set) { | |
| return value | flag; | |
| } else { | |
| return value & ~flag; | |
| } | |
| } | |
| } | |
| } |