diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index ccce9ba6a709a..9c2643b164ef1 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1828,6 +1828,14 @@
config_enableFusedLocationOverlay is false. -->
com.android.location.fused
+
+ true
+
+ @null
+
false
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index ae033cab0807b..cd93932065fa4 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1963,6 +1963,7 @@
+
@@ -2125,6 +2126,7 @@
+
diff --git a/location/java/android/location/provider/LocationProviderBase.java b/location/java/android/location/provider/LocationProviderBase.java
index 529edddf4cf09..5acec79a2d3b2 100644
--- a/location/java/android/location/provider/LocationProviderBase.java
+++ b/location/java/android/location/provider/LocationProviderBase.java
@@ -101,6 +101,15 @@ public abstract class LocationProviderBase {
public static final String ACTION_FUSED_PROVIDER =
"com.android.location.service.FusedLocationProvider";
+ /**
+ * The action the wrapping service should have in its intent filter to implement the
+ * {@link android.location.LocationManager#GPS_PROVIDER}.
+ *
+ * @hide
+ */
+ public static final String ACTION_GNSS_PROVIDER =
+ "android.location.provider.action.GNSS_PROVIDER";
+
final String mTag;
final @Nullable String mAttributionTag;
final IBinder mBinder;
diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java
index 8d247f6a89e37..3ce51c3d1412b 100644
--- a/services/core/java/com/android/server/location/LocationManagerService.java
+++ b/services/core/java/com/android/server/location/LocationManagerService.java
@@ -28,6 +28,7 @@ import static android.location.LocationManager.GPS_PROVIDER;
import static android.location.LocationManager.NETWORK_PROVIDER;
import static android.location.LocationRequest.LOW_POWER_EXCEPTIONS;
import static android.location.provider.LocationProviderBase.ACTION_FUSED_PROVIDER;
+import static android.location.provider.LocationProviderBase.ACTION_GNSS_PROVIDER;
import static android.location.provider.LocationProviderBase.ACTION_NETWORK_PROVIDER;
import static com.android.server.location.LocationPermissions.PERMISSION_COARSE;
@@ -439,9 +440,24 @@ public class LocationManagerService extends ILocationManager.Stub implements
mGnssManagerService = new GnssManagerService(mContext, mInjector, gnssNative);
mGnssManagerService.onSystemReady();
+ boolean useGnssHardwareProvider = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_useGnssHardwareProvider);
+ AbstractLocationProvider gnssProvider = null;
+ if (!useGnssHardwareProvider) {
+ gnssProvider = ProxyLocationProvider.create(
+ mContext,
+ GPS_PROVIDER,
+ ACTION_GNSS_PROVIDER,
+ com.android.internal.R.bool.config_useGnssHardwareProvider,
+ com.android.internal.R.string.config_gnssLocationProviderPackageName);
+ }
+ if (gnssProvider == null) {
+ gnssProvider = mGnssManagerService.getGnssLocationProvider();
+ }
+
LocationProviderManager gnssManager = new LocationProviderManager(mContext, mInjector,
GPS_PROVIDER, mPassiveManager);
- addLocationProviderManager(gnssManager, mGnssManagerService.getGnssLocationProvider());
+ addLocationProviderManager(gnssManager, gnssProvider);
}
// bind to geocoder provider