Restrict appops when location is off

Bug: 187421886
Test: manual
Change-Id: Ib25e299b395ba99aa7c7c33f5a9beb49df3aa3da
This commit is contained in:
Soonil Nagarkar
2021-05-10 13:11:43 -07:00
parent ee5ca902e1
commit 8b56ce99da

View File

@@ -269,6 +269,13 @@ public class LocationManagerService extends ILocationManager.Stub {
mInjector.getSettingsHelper().addOnLocationEnabledChangedListener(
this::onLocationModeChanged);
mInjector.getSettingsHelper().addOnIgnoreSettingsPackageWhitelistChangedListener(
() -> refreshAppOpsRestrictions(UserHandle.USER_ALL));
mInjector.getUserInfoHelper().addListener((userId, change) -> {
if (change == UserInfoHelper.UserListener.USER_STARTED) {
refreshAppOpsRestrictions(userId);
}
});
// set up passive provider first since it will be required for all other location providers,
// which are loaded later once the system is ready.
@@ -482,6 +489,8 @@ public class LocationManagerService extends ILocationManager.Stub {
.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY)
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
mContext.sendBroadcastAsUser(intent, UserHandle.of(userId));
refreshAppOpsRestrictions(userId);
}
@Override
@@ -1347,6 +1356,43 @@ public class LocationManagerService extends ILocationManager.Stub {
ipw.decreaseIndent();
}
private void refreshAppOpsRestrictions(int userId) {
if (userId == UserHandle.USER_ALL) {
final int[] runningUserIds = mInjector.getUserInfoHelper().getRunningUserIds();
for (int i = 0; i < runningUserIds.length; i++) {
refreshAppOpsRestrictions(runningUserIds[i]);
}
return;
}
Preconditions.checkArgument(userId >= 0);
ArraySet<String> packages = new ArraySet<>();
for (LocationProviderManager manager : mProviderManagers) {
packages.add(manager.getIdentity().getPackageName());
}
packages.add(mContext.getPackageName());
packages.addAll(mInjector.getSettingsHelper().getIgnoreSettingsPackageWhitelist());
String[] allowedPackages = packages.toArray(new String[0]);
boolean enabled = mInjector.getSettingsHelper().isLocationEnabled(userId);
AppOpsManager appOpsManager = Objects.requireNonNull(
mContext.getSystemService(AppOpsManager.class));
appOpsManager.setUserRestrictionForUser(
AppOpsManager.OP_COARSE_LOCATION,
enabled,
LocationManagerService.this,
allowedPackages,
userId);
appOpsManager.setUserRestrictionForUser(
AppOpsManager.OP_FINE_LOCATION,
enabled,
LocationManagerService.this,
allowedPackages,
userId);
}
private class LocalService extends LocationManagerInternal {
LocalService() {}