diff options
| -rw-r--r-- | services/core/java/com/android/server/location/LocationManagerService.java | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java index 172a68a27571..c55cf51ed15c 100644 --- a/services/core/java/com/android/server/location/LocationManagerService.java +++ b/services/core/java/com/android/server/location/LocationManagerService.java @@ -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() {} |