Use SystemConfig to control background location throttling whitelist.
Test: manual
Change-Id: I51285f9a463381855f2bb3fa9af34af1930b8ebd
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 42eb958..ef7780c 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -19,6 +19,7 @@
import android.app.ActivityManager;
import android.annotation.NonNull;
import android.content.pm.PackageManagerInternal;
+import android.util.ArraySet;
import com.android.internal.content.PackageMonitor;
import com.android.internal.location.ProviderProperties;
import com.android.internal.location.ProviderRequest;
@@ -135,8 +136,6 @@
private static final String FUSED_LOCATION_SERVICE_ACTION =
"com.android.location.service.FusedLocationProvider";
- private static final String GMSCORE_PACKAGE = "com.android.google.gms";
-
private static final int MSG_LOCATION_CHANGED = 1;
private static final long NANOS_PER_MILLI = 1000000L;
@@ -224,7 +223,7 @@
private final ArrayList<LocationProviderProxy> mProxyProviders =
new ArrayList<>();
- private String[] mBackgroundThrottlePackageWhitelist = new String[]{};
+ private final ArraySet<String> mBackgroundThrottlePackageWhitelist = new ArraySet<>();
// current active user on the device - other users are denied location data
private int mCurrentUserId = UserHandle.USER_SYSTEM;
@@ -345,6 +344,8 @@
mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
updateUserProfiles(mCurrentUserId);
+ updateThrottlingWhitelistLocked();
+
// prepare providers
loadProvidersLocked();
updateProvidersLocked();
@@ -380,14 +381,7 @@
@Override
public void onChange(boolean selfChange) {
synchronized (mLock) {
- String setting = Settings.Global.getString(
- mContext.getContentResolver(),
- Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST);
- if (setting == null) {
- setting = "";
- }
-
- mBackgroundThrottlePackageWhitelist = setting.split(",");
+ updateThrottlingWhitelistLocked();
updateProvidersLocked();
}
}
@@ -1747,12 +1741,27 @@
p.setRequest(providerRequest, worksource);
}
+ private void updateThrottlingWhitelistLocked() {
+ String setting = Settings.Global.getString(
+ mContext.getContentResolver(),
+ Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST);
+ if (setting == null) {
+ setting = "";
+ }
+
+ mBackgroundThrottlePackageWhitelist.clear();
+ mBackgroundThrottlePackageWhitelist.addAll(
+ SystemConfig.getInstance().getAllowUnthrottledLocation());
+ mBackgroundThrottlePackageWhitelist.addAll(
+ Arrays.asList(setting.split(",")));
+ }
+
private boolean isThrottlingExemptLocked(Receiver receiver) {
if (receiver.mUid == Process.SYSTEM_UID) {
return true;
}
- if (receiver.mPackageName.equals(GMSCORE_PACKAGE)) {
+ if (mBackgroundThrottlePackageWhitelist.contains(receiver.mPackageName)) {
return true;
}
@@ -1762,12 +1771,6 @@
}
}
- for (String whitelistedPackage : mBackgroundThrottlePackageWhitelist) {
- if (receiver.mPackageName.equals(whitelistedPackage)) {
- return true;
- }
- }
-
return false;
}
@@ -2999,6 +3002,13 @@
}
}
+ if (!mBackgroundThrottlePackageWhitelist.isEmpty()) {
+ pw.println(" Throttling Whitelisted Packages:");
+ for (String packageName : mBackgroundThrottlePackageWhitelist) {
+ pw.println(" " + packageName);
+ }
+ }
+
pw.append(" fudger: ");
mLocationFudger.dump(fd, pw, args);