summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/current.txt10
-rw-r--r--location/java/android/location/GnssAntennaInfo.java4
-rw-r--r--location/java/android/location/IGnssAntennaInfoListener.aidl26
-rw-r--r--location/java/android/location/ILocationManager.aidl4
-rw-r--r--location/java/android/location/LocationManager.java76
-rw-r--r--services/core/java/com/android/server/location/LocationManagerService.java17
-rw-r--r--services/core/java/com/android/server/location/gnss/GnssAntennaInfoProvider.java144
-rw-r--r--services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java10
-rw-r--r--services/core/java/com/android/server/location/gnss/GnssManagerService.java114
-rw-r--r--services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java2
-rw-r--r--services/core/java/com/android/server/location/gnss/GnssNavigationMessageProvider.java2
-rw-r--r--services/core/java/com/android/server/location/gnss/hal/GnssNative.java8
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java2
13 files changed, 279 insertions, 140 deletions
diff --git a/core/api/current.txt b/core/api/current.txt
index 57fa277b61da..c8a2851f84d8 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -19290,8 +19290,8 @@ package android.location {
method @NonNull public android.location.GnssAntennaInfo.Builder setSignalGainCorrections(@Nullable android.location.GnssAntennaInfo.SphericalCorrections);
}
- @Deprecated public static interface GnssAntennaInfo.Listener {
- method @Deprecated public void onGnssAntennaInfoReceived(@NonNull java.util.List<android.location.GnssAntennaInfo>);
+ public static interface GnssAntennaInfo.Listener {
+ method public void onGnssAntennaInfoReceived(@NonNull java.util.List<android.location.GnssAntennaInfo>);
}
public static final class GnssAntennaInfo.PhaseCenterOffset implements android.os.Parcelable {
@@ -19680,7 +19680,7 @@ package android.location {
method public boolean hasProvider(@NonNull String);
method public boolean isLocationEnabled();
method public boolean isProviderEnabled(@NonNull String);
- method @Deprecated public boolean registerAntennaInfoListener(@NonNull java.util.concurrent.Executor, @NonNull android.location.GnssAntennaInfo.Listener);
+ method public boolean registerAntennaInfoListener(@NonNull java.util.concurrent.Executor, @NonNull android.location.GnssAntennaInfo.Listener);
method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean registerGnssMeasurementsCallback(@NonNull android.location.GnssMeasurementsEvent.Callback);
method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean registerGnssMeasurementsCallback(@NonNull android.location.GnssMeasurementsEvent.Callback, @Nullable android.os.Handler);
method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean registerGnssMeasurementsCallback(@NonNull java.util.concurrent.Executor, @NonNull android.location.GnssMeasurementsEvent.Callback);
@@ -19717,13 +19717,11 @@ package android.location {
method public void setTestProviderEnabled(@NonNull String, boolean);
method public void setTestProviderLocation(@NonNull String, @NonNull android.location.Location);
method @Deprecated public void setTestProviderStatus(@NonNull String, int, @Nullable android.os.Bundle, long);
- method @Deprecated public void unregisterAntennaInfoListener(@NonNull android.location.GnssAntennaInfo.Listener);
+ method public void unregisterAntennaInfoListener(@NonNull android.location.GnssAntennaInfo.Listener);
method public void unregisterGnssMeasurementsCallback(@NonNull android.location.GnssMeasurementsEvent.Callback);
method public void unregisterGnssNavigationMessageCallback(@NonNull android.location.GnssNavigationMessage.Callback);
method public void unregisterGnssStatusCallback(@NonNull android.location.GnssStatus.Callback);
- field public static final String ACTION_GNSS_ANTENNA_INFOS_CHANGED = "android.location.action.GNSS_ANTENNA_INFOS_CHANGED";
field public static final String ACTION_GNSS_CAPABILITIES_CHANGED = "android.location.action.GNSS_CAPABILITIES_CHANGED";
- field public static final String EXTRA_GNSS_ANTENNA_INFOS = "android.location.extra.GNSS_ANTENNA_INFOS";
field public static final String EXTRA_GNSS_CAPABILITIES = "android.location.extra.GNSS_CAPABILITIES";
field public static final String EXTRA_LOCATION_ENABLED = "android.location.extra.LOCATION_ENABLED";
field public static final String EXTRA_PROVIDER_ENABLED = "android.location.extra.PROVIDER_ENABLED";
diff --git a/location/java/android/location/GnssAntennaInfo.java b/location/java/android/location/GnssAntennaInfo.java
index f1eb8fccdd3c..6633d24ebc35 100644
--- a/location/java/android/location/GnssAntennaInfo.java
+++ b/location/java/android/location/GnssAntennaInfo.java
@@ -39,11 +39,7 @@ public final class GnssAntennaInfo implements Parcelable {
/**
* Used for receiving GNSS antenna info from the GNSS engine.
- *
- * @deprecated Prefer to use a broadcast receiver for
- * {@link LocationManager#ACTION_GNSS_ANTENNA_INFOS_CHANGED}.
*/
- @Deprecated
public interface Listener {
/**
* Invoked on a change to GNSS antenna info.
diff --git a/location/java/android/location/IGnssAntennaInfoListener.aidl b/location/java/android/location/IGnssAntennaInfoListener.aidl
new file mode 100644
index 000000000000..3cceea3e6d26
--- /dev/null
+++ b/location/java/android/location/IGnssAntennaInfoListener.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2020, 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.location.GnssAntennaInfo;
+
+/**
+ * {@hide}
+ */
+oneway interface IGnssAntennaInfoListener {
+ void onGnssAntennaInfoChanged(in List<GnssAntennaInfo> antennaInfos);
+}
diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl
index 38b48e97771a..6fa6536997c4 100644
--- a/location/java/android/location/ILocationManager.aidl
+++ b/location/java/android/location/ILocationManager.aidl
@@ -26,6 +26,7 @@ import android.location.GnssCapabilities;
import android.location.GnssMeasurementCorrections;
import android.location.GnssMeasurementRequest;
import android.location.IGeocodeListener;
+import android.location.IGnssAntennaInfoListener;
import android.location.IGnssMeasurementsListener;
import android.location.IGnssStatusListener;
import android.location.IGnssNavigationMessageListener;
@@ -92,6 +93,9 @@ interface ILocationManager
void addGnssNavigationMessageListener(in IGnssNavigationMessageListener listener, String packageName, @nullable String attributionTag, String listenerId);
void removeGnssNavigationMessageListener(in IGnssNavigationMessageListener listener);
+ void addGnssAntennaInfoListener(in IGnssAntennaInfoListener listener, String packageName, @nullable String attributionTag, String listenerId);
+ void removeGnssAntennaInfoListener(in IGnssAntennaInfoListener listener);
+
void addProviderRequestListener(in IProviderRequestListener listener);
void removeProviderRequestListener(in IProviderRequestListener listener);
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 95bae5ae7aab..f88ddb8034b6 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -43,10 +43,8 @@ import android.app.PropertyInvalidatedCache;
import android.compat.Compatibility;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledAfter;
-import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.location.provider.IProviderRequestListener;
import android.location.provider.ProviderProperties;
@@ -349,28 +347,6 @@ public class LocationManager {
public static final String EXTRA_GNSS_CAPABILITIES = "android.location.extra.GNSS_CAPABILITIES";
/**
- * Broadcast intent action when GNSS antenna infos change. Includes an intent extra,
- * {@link #EXTRA_GNSS_ANTENNA_INFOS}, with an ArrayList of the new {@link GnssAntennaInfo}. This
- * may be read via {@link android.content.Intent#getParcelableArrayListExtra(String)}.
- *
- * @see #EXTRA_GNSS_ANTENNA_INFOS
- * @see #getGnssAntennaInfos()
- */
- @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
- public static final String ACTION_GNSS_ANTENNA_INFOS_CHANGED =
- "android.location.action.GNSS_ANTENNA_INFOS_CHANGED";
-
- /**
- * Intent extra included with {@link #ACTION_GNSS_ANTENNA_INFOS_CHANGED} broadcasts, containing
- * the new ArrayList of {@link GnssAntennaInfo}. This may be read via
- * {@link android.content.Intent#getParcelableArrayListExtra(String)}.
- *
- * @see #ACTION_GNSS_ANTENNA_INFOS_CHANGED
- */
- public static final String EXTRA_GNSS_ANTENNA_INFOS =
- "android.location.extra.GNSS_ANTENNA_INFOS";
-
- /**
* Broadcast intent action for Settings app to inject a footer at the bottom of location
* settings. This is for use only by apps that are included in the system image.
*
@@ -2659,10 +2635,11 @@ public class LocationManager {
}
/**
- * Registers a GNSS antenna info listener. GNSS antenna info updates will only be received while
- * the {@link #GPS_PROVIDER} is enabled, and while the client app is in the foreground.
+ * Registers a GNSS antenna info listener that will receive all changes to antenna info. Use
+ * {@link #getGnssAntennaInfos()} to get current antenna info.
*
- * <p>Not all GNSS chipsets support antenna info updates, see {@link #getGnssCapabilities()}.
+ * <p>Not all GNSS chipsets support antenna info updates, see {@link #getGnssCapabilities()}. If
+ * unsupported, the listener will never be invoked.
*
* <p>Prior to Android S, this requires the {@link Manifest.permission#ACCESS_FINE_LOCATION}
* permission.
@@ -2673,10 +2650,7 @@ public class LocationManager {
*
* @throws IllegalArgumentException if executor is null
* @throws IllegalArgumentException if listener is null
- *
- * @deprecated Prefer to use a receiver for {@link #ACTION_GNSS_ANTENNA_INFOS_CHANGED}.
*/
- @Deprecated
public boolean registerAntennaInfoListener(
@NonNull @CallbackExecutor Executor executor,
@NonNull GnssAntennaInfo.Listener listener) {
@@ -2686,13 +2660,10 @@ public class LocationManager {
}
/**
- * Unregisters a GNSS Antenna Info listener.
+ * Unregisters a GNSS antenna info listener.
*
* @param listener a {@link GnssAntennaInfo.Listener} object to remove
- *
- * @deprecated Prefer to use a receiver for {@link #ACTION_GNSS_ANTENNA_INFOS_CHANGED}.
*/
- @Deprecated
public void unregisterAntennaInfoListener(@NonNull GnssAntennaInfo.Listener listener) {
GnssLazyLoader.sGnssAntennaInfoListeners.removeListener(listener);
}
@@ -3009,14 +2980,17 @@ public class LocationManager {
}
@Override
- protected void registerTransport(GnssAntennaInfoTransport transport) {
- transport.getContext().registerReceiver(transport,
- new IntentFilter(ACTION_GNSS_ANTENNA_INFOS_CHANGED));
+ protected void registerTransport(GnssAntennaInfoTransport transport)
+ throws RemoteException {
+ getService().addGnssAntennaInfoListener(transport, transport.getPackage(),
+ transport.getAttributionTag(),
+ AppOpsManager.toReceiverId(transport.getListener()));
}
@Override
- protected void unregisterTransport(GnssAntennaInfoTransport transport) {
- transport.getContext().unregisterReceiver(transport);
+ protected void unregisterTransport(GnssAntennaInfoTransport transport)
+ throws RemoteException {
+ getService().removeGnssAntennaInfoListener(transport);
}
}
@@ -3376,11 +3350,12 @@ public class LocationManager {
}
}
- private static class GnssAntennaInfoTransport extends BroadcastReceiver implements
+ private static class GnssAntennaInfoTransport extends IGnssAntennaInfoListener.Stub implements
ListenerTransport<GnssAntennaInfo.Listener> {
private final Executor mExecutor;
- private final Context mContext;
+ private final String mPackageName;
+ private final String mAttributionTag;
private volatile @Nullable GnssAntennaInfo.Listener mListener;
@@ -3389,12 +3364,17 @@ public class LocationManager {
Preconditions.checkArgument(executor != null, "invalid null executor");
Preconditions.checkArgument(listener != null, "invalid null listener");
mExecutor = executor;
- mContext = context;
+ mPackageName = context.getPackageName();
+ mAttributionTag = context.getAttributionTag();
mListener = listener;
}
- public Context getContext() {
- return mContext;
+ public String getPackage() {
+ return mPackageName;
+ }
+
+ public String getAttributionTag() {
+ return mAttributionTag;
}
@Override
@@ -3408,12 +3388,8 @@ public class LocationManager {
}
@Override
- public void onReceive(Context context, Intent intent) {
- ArrayList<GnssAntennaInfo> infos = intent.getParcelableArrayListExtra(
- EXTRA_GNSS_ANTENNA_INFOS);
- if (infos != null) {
- execute(mExecutor, callback -> callback.onGnssAntennaInfoReceived(infos));
- }
+ public void onGnssAntennaInfoChanged(List<GnssAntennaInfo> antennaInfos) {
+ execute(mExecutor, callback -> callback.onGnssAntennaInfoReceived(antennaInfos));
}
}
diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java
index 57e9fc9cb719..cdaffb757311 100644
--- a/services/core/java/com/android/server/location/LocationManagerService.java
+++ b/services/core/java/com/android/server/location/LocationManagerService.java
@@ -52,6 +52,7 @@ import android.location.GnssCapabilities;
import android.location.GnssMeasurementCorrections;
import android.location.GnssMeasurementRequest;
import android.location.IGeocodeListener;
+import android.location.IGnssAntennaInfoListener;
import android.location.IGnssMeasurementsListener;
import android.location.IGnssNavigationMessageListener;
import android.location.IGnssNmeaListener;
@@ -930,6 +931,22 @@ public class LocationManagerService extends ILocationManager.Stub {
}
@Override
+ public void addGnssAntennaInfoListener(IGnssAntennaInfoListener listener, String packageName,
+ @Nullable String attributionTag, String listenerId) {
+ if (mGnssManagerService != null) {
+ mGnssManagerService.addGnssAntennaInfoListener(listener, packageName, attributionTag,
+ listenerId);
+ }
+ }
+
+ @Override
+ public void removeGnssAntennaInfoListener(IGnssAntennaInfoListener listener) {
+ if (mGnssManagerService != null) {
+ mGnssManagerService.removeGnssAntennaInfoListener(listener);
+ }
+ }
+
+ @Override
public void addProviderRequestListener(IProviderRequestListener listener) {
for (LocationProviderManager manager : mProviderManagers) {
manager.addProviderRequestListener(listener);
diff --git a/services/core/java/com/android/server/location/gnss/GnssAntennaInfoProvider.java b/services/core/java/com/android/server/location/gnss/GnssAntennaInfoProvider.java
new file mode 100644
index 000000000000..1967e026e46c
--- /dev/null
+++ b/services/core/java/com/android/server/location/gnss/GnssAntennaInfoProvider.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2021 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 com.android.server.location.gnss;
+
+import static com.android.server.location.gnss.GnssManagerService.TAG;
+
+import android.annotation.Nullable;
+import android.location.GnssAntennaInfo;
+import android.location.IGnssAntennaInfoListener;
+import android.location.util.identity.CallerIdentity;
+import android.os.Binder;
+import android.os.IBinder;
+
+import com.android.server.location.gnss.hal.GnssNative;
+import com.android.server.location.listeners.BinderListenerRegistration;
+import com.android.server.location.listeners.ListenerMultiplexer;
+import com.android.server.location.listeners.ListenerRegistration;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Antenna info HAL module and listener multiplexer.
+ */
+public class GnssAntennaInfoProvider extends
+ ListenerMultiplexer<IBinder, IGnssAntennaInfoListener,
+ ListenerRegistration<IGnssAntennaInfoListener>, Void> implements
+ GnssNative.BaseCallbacks, GnssNative.AntennaInfoCallbacks {
+
+ /**
+ * Registration object for GNSS listeners.
+ */
+ protected class AntennaInfoListenerRegistration extends
+ BinderListenerRegistration<Void, IGnssAntennaInfoListener> {
+
+ protected AntennaInfoListenerRegistration(CallerIdentity callerIdentity,
+ IGnssAntennaInfoListener listener) {
+ super(null, callerIdentity, listener);
+ }
+
+ @Override
+ protected GnssAntennaInfoProvider getOwner() {
+ return GnssAntennaInfoProvider.this;
+ }
+ }
+
+ private final GnssNative mGnssNative;
+
+ private volatile @Nullable List<GnssAntennaInfo> mAntennaInfos;
+
+ GnssAntennaInfoProvider(GnssNative gnssNative) {
+ mGnssNative = gnssNative;
+ mGnssNative.addBaseCallbacks(this);
+ mGnssNative.addAntennaInfoCallbacks(this);
+ }
+
+ @Nullable List<GnssAntennaInfo> getAntennaInfos() {
+ return mAntennaInfos;
+ }
+
+ @Override
+ public String getTag() {
+ return TAG;
+ }
+
+ public boolean isSupported() {
+ return mGnssNative.isAntennaInfoSupported();
+ }
+
+ public void addListener(CallerIdentity callerIdentity, IGnssAntennaInfoListener listener) {
+ long identity = Binder.clearCallingIdentity();
+ try {
+ putRegistration(listener.asBinder(),
+ new AntennaInfoListenerRegistration(callerIdentity, listener));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ public void removeListener(IGnssAntennaInfoListener listener) {
+ long identity = Binder.clearCallingIdentity();
+ try {
+ removeRegistration(listener.asBinder());
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ protected boolean registerWithService(Void merged,
+ Collection<ListenerRegistration<IGnssAntennaInfoListener>> listenerRegistrations) {
+ return true;
+ }
+
+ @Override
+ protected void unregisterWithService() {}
+
+ @Override
+ protected boolean isActive(ListenerRegistration<IGnssAntennaInfoListener> registration) {
+ return true;
+ }
+
+ @Override
+ protected Void mergeRegistrations(
+ Collection<ListenerRegistration<IGnssAntennaInfoListener>> listenerRegistrations) {
+ return null;
+ }
+
+ @Override
+ public void onHalStarted() {
+ mGnssNative.startAntennaInfoListening();
+ }
+
+ @Override
+ public void onHalRestarted() {
+ mGnssNative.startAntennaInfoListening();
+ }
+
+ @Override
+ public void onReportAntennaInfo(List<GnssAntennaInfo> antennaInfos) {
+ if (antennaInfos.equals(mAntennaInfos)) {
+ return;
+ }
+
+ mAntennaInfos = antennaInfos;
+ deliverToListeners(listener -> {
+ listener.onGnssAntennaInfoChanged(antennaInfos);
+ });
+ }
+}
diff --git a/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java b/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java
index 87e6ef4110ee..5e6ae68c02f2 100644
--- a/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java
+++ b/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java
@@ -229,7 +229,7 @@ public abstract class GnssListenerMultiplexer<TRequest, TListener extends IInter
* registrations will be treated as inactive and the backing service will never be registered.
*
*/
- protected boolean isServiceSupported() {
+ public boolean isSupported() {
return true;
}
@@ -276,7 +276,7 @@ public abstract class GnssListenerMultiplexer<TRequest, TListener extends IInter
@Override
protected boolean isActive(GnssListenerRegistration registration) {
- if (!isServiceSupported()) {
+ if (!isSupported()) {
return false;
}
@@ -339,7 +339,7 @@ public abstract class GnssListenerMultiplexer<TRequest, TListener extends IInter
@Override
protected void onRegister() {
- if (!isServiceSupported()) {
+ if (!isSupported()) {
return;
}
@@ -356,7 +356,7 @@ public abstract class GnssListenerMultiplexer<TRequest, TListener extends IInter
@Override
protected void onUnregister() {
- if (!isServiceSupported()) {
+ if (!isSupported()) {
return;
}
@@ -404,7 +404,7 @@ public abstract class GnssListenerMultiplexer<TRequest, TListener extends IInter
@Override
protected String getServiceState() {
- if (!isServiceSupported()) {
+ if (!isSupported()) {
return "unsupported";
} else {
return super.getServiceState();
diff --git a/services/core/java/com/android/server/location/gnss/GnssManagerService.java b/services/core/java/com/android/server/location/gnss/GnssManagerService.java
index 8312c6361835..bcdfed45bd9c 100644
--- a/services/core/java/com/android/server/location/gnss/GnssManagerService.java
+++ b/services/core/java/com/android/server/location/gnss/GnssManagerService.java
@@ -27,6 +27,7 @@ import android.location.GnssAntennaInfo;
import android.location.GnssCapabilities;
import android.location.GnssMeasurementCorrections;
import android.location.GnssMeasurementRequest;
+import android.location.IGnssAntennaInfoListener;
import android.location.IGnssMeasurementsListener;
import android.location.IGnssNavigationMessageListener;
import android.location.IGnssNmeaListener;
@@ -49,7 +50,6 @@ import com.android.server.location.gnss.hal.GnssNative;
import com.android.server.location.injector.Injector;
import java.io.FileDescriptor;
-import java.util.ArrayList;
import java.util.List;
/** Manages Gnss providers and related Gnss functions for LocationManagerService. */
@@ -68,11 +68,11 @@ public class GnssManagerService {
private final GnssNmeaProvider mGnssNmeaProvider;
private final GnssMeasurementsProvider mGnssMeasurementsProvider;
private final GnssNavigationMessageProvider mGnssNavigationMessageProvider;
+ private final GnssAntennaInfoProvider mGnssAntennaInfoProvider;
private final IGpsGeofenceHardware mGnssGeofenceProxy;
private final GnssGeofenceHalModule mGeofenceHalModule;
private final GnssCapabilitiesHalModule mCapabilitiesHalModule;
- private final GnssAntennaInfoHalModule mAntennaInfoHalModule;
private final GnssMetrics mGnssMetrics;
@@ -89,11 +89,11 @@ public class GnssManagerService {
mGnssNmeaProvider = new GnssNmeaProvider(injector, mGnssNative);
mGnssMeasurementsProvider = new GnssMeasurementsProvider(injector, mGnssNative);
mGnssNavigationMessageProvider = new GnssNavigationMessageProvider(injector, mGnssNative);
+ mGnssAntennaInfoProvider = new GnssAntennaInfoProvider(mGnssNative);
mGnssGeofenceProxy = new GnssGeofenceProxy(mGnssNative);
mGeofenceHalModule = new GnssGeofenceHalModule(mGnssNative);
mCapabilitiesHalModule = new GnssCapabilitiesHalModule(mGnssNative);
- mAntennaInfoHalModule = new GnssAntennaInfoHalModule(mGnssNative);
// allow gnss access to begin - we must assume that callbacks can start immediately
mGnssNative.register();
@@ -140,7 +140,7 @@ public class GnssManagerService {
* Get GNSS antenna information.
*/
public @Nullable List<GnssAntennaInfo> getGnssAntennaInfos() {
- return mAntennaInfoHalModule.getAntennaInfos();
+ return mGnssAntennaInfoProvider.getAntennaInfos();
}
/**
@@ -242,6 +242,24 @@ public class GnssManagerService {
}
/**
+ * Adds a GNSS antenna info listener.
+ */
+ public void addGnssAntennaInfoListener(IGnssAntennaInfoListener listener, String packageName,
+ @Nullable String attributionTag, String listenerId) {
+
+ CallerIdentity identity = CallerIdentity.fromBinder(mContext, packageName, attributionTag,
+ listenerId);
+ mGnssAntennaInfoProvider.addListener(identity, listener);
+ }
+
+ /**
+ * Removes a GNSS antenna info listener.
+ */
+ public void removeGnssAntennaInfoListener(IGnssAntennaInfoListener listener) {
+ mGnssAntennaInfoProvider.removeListener(listener);
+ }
+
+ /**
* Send Ni Response, indicating a location request initiated by a network carrier.
*/
public void sendNiResponse(int notifId, int userResponse) {
@@ -263,25 +281,34 @@ public class GnssManagerService {
ipw.println("Capabilities: " + mGnssNative.getCapabilities());
- List<GnssAntennaInfo> infos = mAntennaInfoHalModule.getAntennaInfos();
- if (infos != null) {
- ipw.println("Antenna Infos: " + infos);
+ if (mGnssStatusProvider.isSupported()) {
+ ipw.println("Status Provider:");
+ ipw.increaseIndent();
+ mGnssStatusProvider.dump(fd, ipw, args);
+ ipw.decreaseIndent();
}
- ipw.println("Measurements Provider:");
- ipw.increaseIndent();
- mGnssMeasurementsProvider.dump(fd, ipw, args);
- ipw.decreaseIndent();
+ if (mGnssMeasurementsProvider.isSupported()) {
+ ipw.println("Measurements Provider:");
+ ipw.increaseIndent();
+ mGnssMeasurementsProvider.dump(fd, ipw, args);
+ ipw.decreaseIndent();
+ }
- ipw.println("Navigation Message Provider:");
- ipw.increaseIndent();
- mGnssNavigationMessageProvider.dump(fd, ipw, args);
- ipw.decreaseIndent();
+ if (mGnssNavigationMessageProvider.isSupported()) {
+ ipw.println("Navigation Message Provider:");
+ ipw.increaseIndent();
+ mGnssNavigationMessageProvider.dump(fd, ipw, args);
+ ipw.decreaseIndent();
+ }
- ipw.println("Status Provider:");
- ipw.increaseIndent();
- mGnssStatusProvider.dump(fd, ipw, args);
- ipw.decreaseIndent();
+ if (mGnssAntennaInfoProvider.isSupported()) {
+ ipw.println("Navigation Message Provider:");
+ ipw.increaseIndent();
+ ipw.println("Antenna Infos: " + mGnssAntennaInfoProvider.getAntennaInfos());
+ mGnssAntennaInfoProvider.dump(fd, ipw, args);
+ ipw.decreaseIndent();
+ }
GnssPowerStats powerStats = mGnssNative.getPowerStats();
if (powerStats != null) {
@@ -399,53 +426,4 @@ public class GnssManagerService {
}
}
}
-
- private class GnssAntennaInfoHalModule implements GnssNative.BaseCallbacks,
- GnssNative.AntennaInfoCallbacks {
-
- private final GnssNative mGnssNative;
-
- private volatile @Nullable List<GnssAntennaInfo> mAntennaInfos;
-
- GnssAntennaInfoHalModule(GnssNative gnssNative) {
- mGnssNative = gnssNative;
- mGnssNative.addBaseCallbacks(this);
- mGnssNative.addAntennaInfoCallbacks(this);
- }
-
- @Nullable List<GnssAntennaInfo> getAntennaInfos() {
- return mAntennaInfos;
- }
-
- @Override
- public void onHalStarted() {
- mGnssNative.startAntennaInfoListening();
- }
-
- @Override
- public void onHalRestarted() {
- mGnssNative.startAntennaInfoListening();
- }
-
- @Override
- public void onReportAntennaInfo(List<GnssAntennaInfo> antennaInfos) {
- if (antennaInfos.equals(mAntennaInfos)) {
- return;
- }
-
- mAntennaInfos = antennaInfos;
-
- long ident = Binder.clearCallingIdentity();
- try {
- Intent intent = new Intent(LocationManager.ACTION_GNSS_ANTENNA_INFOS_CHANGED)
- .putParcelableArrayListExtra(LocationManager.EXTRA_GNSS_ANTENNA_INFOS,
- new ArrayList<>(antennaInfos))
- .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY)
- .addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
- }
}
diff --git a/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java b/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java
index 305bc9b69e39..b3119d7aa53e 100644
--- a/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java
+++ b/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java
@@ -99,7 +99,7 @@ public final class GnssMeasurementsProvider extends
}
@Override
- protected boolean isServiceSupported() {
+ public boolean isSupported() {
return mGnssNative.isMeasurementSupported();
}
diff --git a/services/core/java/com/android/server/location/gnss/GnssNavigationMessageProvider.java b/services/core/java/com/android/server/location/gnss/GnssNavigationMessageProvider.java
index ff9ad65b4ca5..e9fce0514a18 100644
--- a/services/core/java/com/android/server/location/gnss/GnssNavigationMessageProvider.java
+++ b/services/core/java/com/android/server/location/gnss/GnssNavigationMessageProvider.java
@@ -70,7 +70,7 @@ public class GnssNavigationMessageProvider extends
}
@Override
- protected boolean isServiceSupported() {
+ public boolean isSupported() {
return mGnssNative.isNavigationMessageCollectionSupported();
}
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 7e2f089d32c9..f275663a1309 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
@@ -699,11 +699,11 @@ public class GnssNative {
}
/**
- * Returns true if antenna info listening is supported.
+ * Returns true if antenna info is supported.
*/
- public boolean isAntennaInfoListeningSupported() {
+ public boolean isAntennaInfoSupported() {
Preconditions.checkState(mRegistered);
- return mGnssHal.isAntennaInfoListeningSupported();
+ return mGnssHal.isAntennaInfoSupported();
}
/**
@@ -1259,7 +1259,7 @@ public class GnssNative {
return native_stop_navigation_message_collection();
}
- protected boolean isAntennaInfoListeningSupported() {
+ protected boolean isAntennaInfoSupported() {
return native_is_antenna_info_supported();
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java b/services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java
index 69fe140a7863..e0c8b09aae88 100644
--- a/services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java
+++ b/services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java
@@ -500,7 +500,7 @@ public final class FakeGnssHal extends GnssNative.GnssHal {
}
@Override
- protected boolean isAntennaInfoListeningSupported() {
+ protected boolean isAntennaInfoSupported() {
return mIsAntennaInfoListeningSupported;
}