diff options
| author | 2019-03-19 18:58:42 -0700 | |
|---|---|---|
| committer | 2019-03-20 09:51:39 -0700 | |
| commit | 993497864e4acfa248d45eedcd3aadbafa12c1b7 (patch) | |
| tree | 1608bac8d4c036ea36bdd6fb0f6c43e64bb3ac33 /location/java/android | |
| parent | d4f39bcee6221d93fe6581c3eafd830247f8ac23 (diff) | |
Update getGnssCapabilities() in LMS to include sub-HAL capabilities
The GNSS capabilities in the gnss@2.0 HAL have been refactored
(b/128028791, b/127434062, b/128309220). The sub-HAL capabilities
in the top level IGnssCallback.hal have been moved into their
respective sub-HALs. Consequently, the getGnssCapabilities()
method in LocationManagerService is hereby modified to include
the capabilities from all sub-HALs and the top level HAL.
A new GnssCapabilities class needs to be added so that we don't
expose the implementation details of the capabilities (a Java
int bitmask of capability flags) to the LocationManager client.
Bug: 128913861
Test: TBD
Change-Id: I5ed90332c7c0e783de771f573a58f79d1d6d89ff
Diffstat (limited to 'location/java/android')
4 files changed, 163 insertions, 6 deletions
diff --git a/location/java/android/location/GnssCapabilities.java b/location/java/android/location/GnssCapabilities.java new file mode 100644 index 000000000000..6a35920e7fa2 --- /dev/null +++ b/location/java/android/location/GnssCapabilities.java @@ -0,0 +1,153 @@ +/* + * 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.SystemApi; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * A container of supported GNSS chipset capabilities. + * + * @hide + */ +@SystemApi +public final class GnssCapabilities { + /** The GNSS chipset supports low power mode. */ + public static final int LOW_POWER_MODE = 0; + + /** The GNSS chipset supports blacklisting satellites. */ + public static final int SATELLITE_BLACKLIST = 1; + + /** The GNSS chipset supports geofencing. */ + public static final int GEOFENCING = 2; + + /** The GNSS chipset supports measurements.*/ + public static final int MEASUREMENTS = 3; + + /** The GNSS chipset supports navigation messages. */ + public static final int NAV_MESSAGES = 4; + + /** The GNSS chipset supports measurement corrections. */ + public static final int MEASUREMENT_CORRECTIONS = 5; + + /** The GNSS chipset supports line-of-sight satellite identification measurement corrections. */ + public static final int MEASUREMENT_CORRECTIONS_LOS_SATS = 6; + + /** The GNSS chipset supports per satellite excess-path-length measurement corrections. */ + public static final int MEASUREMENT_CORRECTIONS_EXCESS_PATH_LENGTH = 7; + + /** The GNSS chipset supports reflecting planes measurement corrections. */ + public static final int MEASUREMENT_CORRECTIONS_REFLECTING_PLANE = 8; + + private static final int MIN_CAPABILITY = 0; + private static final int MAX_CAPABILITY = MEASUREMENT_CORRECTIONS_REFLECTING_PLANE; + + /** + * GNSS capability. + * @hide + */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + LOW_POWER_MODE, + SATELLITE_BLACKLIST, + GEOFENCING, + MEASUREMENTS, + NAV_MESSAGES, + MEASUREMENT_CORRECTIONS, + MEASUREMENT_CORRECTIONS_LOS_SATS, + MEASUREMENT_CORRECTIONS_EXCESS_PATH_LENGTH, + MEASUREMENT_CORRECTIONS_REFLECTING_PLANE + }) + public @interface Capability {} + + /** + * @hide + */ + public static final long INVALID_CAPABILITIES = -1; + + /** A bitmask of supported GNSS capabilities. */ + private final long mGnssCapabilities; + + static GnssCapabilities of(long gnssCapabilities) { + return new GnssCapabilities(gnssCapabilities); + } + + private GnssCapabilities(long gnssCapabilities) { + mGnssCapabilities = gnssCapabilities; + } + + /** + * Returns {@code true} if the {@code capability} is supported by the GNSS implementation. + */ + public boolean hasCapability(@Capability int capability) { + return isValidCapability(capability) && (mGnssCapabilities & (1 << capability)) != 0; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("GnssCapabilities: ("); + int capability = 0; + boolean addSeparator = false; + long gnssCapabilities = mGnssCapabilities; + while (gnssCapabilities != 0) { + if ((gnssCapabilities & 1) != 0) { + if (addSeparator) { + sb.append(' '); + } else { + addSeparator = true; + } + sb.append(toStringCapability(capability)); + } + gnssCapabilities >>= 1; + ++capability; + } + sb.append(")"); + return sb.toString(); + } + + private boolean isValidCapability(@Capability int capability) { + return capability >= MIN_CAPABILITY && capability <= MAX_CAPABILITY; + } + + private static String toStringCapability(@Capability int capability) { + switch (capability) { + case LOW_POWER_MODE: + return "LOW_POWER_MODE"; + case SATELLITE_BLACKLIST: + return "SATELLITE_BLACKLIST"; + case GEOFENCING: + return "GEOFENCING"; + case MEASUREMENTS: + return "MEASUREMENTS"; + case NAV_MESSAGES: + return "NAV_MESSAGES"; + case MEASUREMENT_CORRECTIONS: + return "MEASUREMENT_CORRECTIONS"; + case MEASUREMENT_CORRECTIONS_LOS_SATS: + return "MEASUREMENT_CORRECTIONS_LOS_SATS"; + case MEASUREMENT_CORRECTIONS_EXCESS_PATH_LENGTH: + return "MEASUREMENT_CORRECTIONS_EXCESS_PATH_LENGTH"; + case MEASUREMENT_CORRECTIONS_REFLECTING_PLANE: + return "MEASUREMENT_CORRECTIONS_REFLECTING_PLANE"; + default: + return "Unknown(" + capability + ")"; + } + } +} diff --git a/location/java/android/location/GnssMeasurementCallbackTransport.java b/location/java/android/location/GnssMeasurementCallbackTransport.java index 1188b13b7841..8cb8c0b78da1 100644 --- a/location/java/android/location/GnssMeasurementCallbackTransport.java +++ b/location/java/android/location/GnssMeasurementCallbackTransport.java @@ -63,7 +63,7 @@ class GnssMeasurementCallbackTransport measurementCorrections, getContext().getPackageName()); } - protected int getGnssCapabilities() throws RemoteException { + protected long getGnssCapabilities() throws RemoteException { return mLocationManager.getGnssCapabilities(getContext().getPackageName()); } diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl index c371c5fa0448..a4582b7ece92 100644 --- a/location/java/android/location/ILocationManager.aidl +++ b/location/java/android/location/ILocationManager.aidl @@ -66,7 +66,7 @@ interface ILocationManager boolean addGnssMeasurementsListener(in IGnssMeasurementsListener listener, in String packageName); void injectGnssMeasurementCorrections(in GnssMeasurementCorrections corrections, in String packageName); - int getGnssCapabilities(in String packageName); + long getGnssCapabilities(in String packageName); void removeGnssMeasurementsListener(in IGnssMeasurementsListener listener); boolean addGnssNavigationMessageListener( diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 050b2ec26c8d..c6391918dcf3 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -1986,15 +1986,19 @@ public class LocationManager { } /** - * Returns the integer capability flags of the GNSS chipset as defined in {@code - * IGnssCallback.hal} + * Returns the supported capabilities of the GNSS chipset or {@code null} if there is an error + * in obtaining the capabilities. * * @hide */ @SystemApi - public int getGnssCapabilities() { + public @Nullable GnssCapabilities getGnssCapabilities() { try { - return mGnssMeasurementCallbackTransport.getGnssCapabilities(); + long gnssCapabilities = mGnssMeasurementCallbackTransport.getGnssCapabilities(); + if (gnssCapabilities == GnssCapabilities.INVALID_CAPABILITIES) { + return null; + } + return GnssCapabilities.of(gnssCapabilities); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } |