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