From 980b7c20d6a1370cf3280ed814d7aacf8ff60975 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Thu, 6 Dec 2018 17:53:00 -0800 Subject: [PATCH] Add APIs to set Location History package name. The package name will be used by Permission Controller to properly handle permissions for location history package. Bug: 119226131 Test: manually tested on device Change-Id: I522517272c132a054c44489d16626509cf2b42ee --- api/system-current.txt | 5 ++ core/java/android/provider/Settings.java | 17 ++++++ .../android/location/ILocationManager.aidl | 4 ++ .../android/location/LocationManager.java | 61 +++++++++++++++++++ .../server/LocationManagerService.java | 41 +++++++++++++ 5 files changed, 128 insertions(+) diff --git a/api/system-current.txt b/api/system-current.txt index 29089b3e908a0..bcdb6aeacefca 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -2784,7 +2784,9 @@ package android.location { method public deprecated boolean addGpsNavigationMessageListener(android.location.GpsNavigationMessageEvent.Listener); method public void flushGnssBatch(); method public int getGnssBatchSize(); + method public java.lang.String getLocationControllerExtraPackage(); method public java.lang.String getNetworkProviderPackage(); + method public boolean isLocationControllerExtraPackageEnabled(); method public boolean isLocationEnabledForUser(android.os.UserHandle); method public boolean isProviderEnabledForUser(java.lang.String, android.os.UserHandle); method public boolean registerGnssBatchedLocationCallback(long, boolean, android.location.BatchedLocationCallback, android.os.Handler); @@ -2792,6 +2794,8 @@ package android.location { method public deprecated void removeGpsNavigationMessageListener(android.location.GpsNavigationMessageEvent.Listener); method public void requestLocationUpdates(android.location.LocationRequest, android.location.LocationListener, android.os.Looper); method public void requestLocationUpdates(android.location.LocationRequest, android.app.PendingIntent); + method public void setLocationControllerExtraPackage(java.lang.String); + method public void setLocationControllerExtraPackageEnabled(boolean); method public void setLocationEnabledForUser(boolean, android.os.UserHandle); method public boolean setProviderEnabledForUser(java.lang.String, boolean, android.os.UserHandle); method public boolean unregisterGnssBatchedLocationCallback(android.location.BatchedLocationCallback); @@ -4672,6 +4676,7 @@ package android.provider { public final class Settings { field public static final java.lang.String ACTION_ENTERPRISE_PRIVACY_SETTINGS = "android.settings.ENTERPRISE_PRIVACY_SETTINGS"; + field public static final java.lang.String ACTION_LOCATION_CONTROLLER_EXTRA_PACKAGE_SETTINGS = "android.settings.LOCATION_CONTROLLER_EXTRA_PACKAGE_SETTINGS"; field public static final java.lang.String ACTION_SHOW_ADMIN_SUPPORT_DETAILS = "android.settings.SHOW_ADMIN_SUPPORT_DETAILS"; } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index de6afcbad9a63..6b086eb56d480 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -149,6 +149,23 @@ public final class Settings { public static final String ACTION_LOCATION_SOURCE_SETTINGS = "android.settings.LOCATION_SOURCE_SETTINGS"; + /** + * Activity Action: Show settings to allow configuration of location controller extra package. + *

+ * In some cases, a matching Activity may not exist, so ensure you + * safeguard against this. + *

+ * Input: Nothing. + *

+ * Output: Nothing. + * + * @hide + */ + @SystemApi + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_LOCATION_CONTROLLER_EXTRA_PACKAGE_SETTINGS = + "android.settings.LOCATION_CONTROLLER_EXTRA_PACKAGE_SETTINGS"; + /** * Activity Action: Show scanning settings to allow configuration of Wi-Fi * and Bluetooth scanning settings. diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl index 32c752064a69a..05d49e5927479 100644 --- a/location/java/android/location/ILocationManager.aidl +++ b/location/java/android/location/ILocationManager.aidl @@ -88,6 +88,10 @@ interface ILocationManager boolean providerMeetsCriteria(String provider, in Criteria criteria); ProviderProperties getProviderProperties(String provider); String getNetworkProviderPackage(); + void setLocationControllerExtraPackage(String packageName); + String getLocationControllerExtraPackage(); + void setLocationControllerExtraPackageEnabled(boolean enabled); + boolean isLocationControllerExtraPackageEnabled(); boolean isProviderEnabledForUser(String provider, int userId); boolean setProviderEnabledForUser(String provider, boolean enabled, int userId); diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 334170e5ce03c..1cd3d86a0c27d 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -2396,4 +2396,65 @@ public class LocationManager { return null; } } + + /** + * Set the extra location controller package for location services on the device. + * + * @hide + */ + @SystemApi + @RequiresPermission(Manifest.permission.LOCATION_HARDWARE) + public void setLocationControllerExtraPackage(String packageName) { + try { + mService.setLocationControllerExtraPackage(packageName); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + + /** + * Returns the extra location controller package on the device. + * + * @hide + */ + @SystemApi + public @Nullable String getLocationControllerExtraPackage() { + try { + return mService.getLocationControllerExtraPackage(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + return null; + } + } + + /** + * Set whether the extra location controller package is currently enabled on the device. + * + * @hide + */ + @SystemApi + @RequiresPermission(Manifest.permission.LOCATION_HARDWARE) + public void setLocationControllerExtraPackageEnabled(boolean enabled) { + try { + mService.setLocationControllerExtraPackageEnabled(enabled); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + + /** + * Returns whether extra location controller package is currently enabled on the device. + * + * @hide + */ + @SystemApi + public boolean isLocationControllerExtraPackageEnabled() { + try { + return mService.isLocationControllerExtraPackageEnabled(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + return false; + } + } + } diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index 8b992ebcf0597..9dbfe5fb9df0d 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -22,6 +22,7 @@ import static android.provider.Settings.Global.LOCATION_DISABLE_STATUS_CALLBACKS import static com.android.internal.util.Preconditions.checkState; +import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; @@ -189,6 +190,8 @@ public class LocationManagerService extends ILocationManager.Stub { private LocationBlacklist mBlacklist; private GnssMeasurementsProvider mGnssMeasurementsProvider; private GnssNavigationMessageProvider mGnssNavigationMessageProvider; + private String mLocationControllerExtraPackage; + private boolean mLocationControllerExtraPackageEnabled; private IGpsGeofenceHardware mGpsGeofenceProxy; // --- fields below are protected by mLock --- @@ -2717,6 +2720,39 @@ public class LocationManagerService extends ILocationManager.Stub { return null; } + @Override + public void setLocationControllerExtraPackage(String packageName) { + mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE, + Manifest.permission.LOCATION_HARDWARE + " permission required"); + synchronized (mLock) { + mLocationControllerExtraPackage = packageName; + } + } + + @Override + public String getLocationControllerExtraPackage() { + synchronized (mLock) { + return mLocationControllerExtraPackage; + } + } + + @Override + public void setLocationControllerExtraPackageEnabled(boolean enabled) { + mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE, + Manifest.permission.LOCATION_HARDWARE + " permission required"); + synchronized (mLock) { + mLocationControllerExtraPackageEnabled = enabled; + } + } + + @Override + public boolean isLocationControllerExtraPackageEnabled() { + synchronized (mLock) { + return mLocationControllerExtraPackageEnabled + && (mLocationControllerExtraPackage != null); + } + } + /** * Returns the current location enabled/disabled status for a user * @@ -3492,6 +3528,11 @@ public class LocationManagerService extends ILocationManager.Stub { } } + if (mLocationControllerExtraPackage != null) { + pw.println(" Location controller extra package: " + mLocationControllerExtraPackage + + " enabled: " + mLocationControllerExtraPackageEnabled); + } + if (!mBackgroundThrottlePackageWhitelist.isEmpty()) { pw.println(" Throttling Whitelisted Packages:"); for (String packageName : mBackgroundThrottlePackageWhitelist) {