diff options
| author | 2017-06-23 14:05:04 -0700 | |
|---|---|---|
| committer | 2017-06-28 13:06:45 -0700 | |
| commit | e683f19c4939ce683c7a7d6fe4286b16e372324f (patch) | |
| tree | 8f32e4647a8da64264d6d7bf8f9a0e7522193c34 | |
| parent | eabf970559c6dd012fa675fad89963dce8118d16 (diff) | |
Allow ALL_USERS in setUserRestrictionForUser
This will be used e.g. by the permission granting UI.
Fixes: 35612487
Test: 1. Installed facebook messanger and enabled chat-heads in private
profile
2. Opened work-profile camera which asks for location
permission
3. Chat head disappered during permission check
4. Chat head re-appeared after permission check
Change-Id: Ie9a5e5379c20972f34945c9cb062cd8e3df483d4
| -rw-r--r-- | services/autofill/java/com/android/server/autofill/ui/OverlayControl.java | 9 | ||||
| -rw-r--r-- | services/core/java/com/android/server/AppOpsService.java | 107 |
2 files changed, 69 insertions, 47 deletions
diff --git a/services/autofill/java/com/android/server/autofill/ui/OverlayControl.java b/services/autofill/java/com/android/server/autofill/ui/OverlayControl.java index fe0611eef0a2..49f4b538448e 100644 --- a/services/autofill/java/com/android/server/autofill/ui/OverlayControl.java +++ b/services/autofill/java/com/android/server/autofill/ui/OverlayControl.java @@ -21,6 +21,7 @@ import android.app.AppOpsManager; import android.content.Context; import android.os.Binder; import android.os.IBinder; +import android.os.UserHandle; /** * This class controls showing/hiding overlays. We don't @@ -47,10 +48,10 @@ class OverlayControl { private void setOverlayAllowed(boolean allowed) { if (mAppOpsManager != null) { - mAppOpsManager.setUserRestriction( - AppOpsManager.OP_SYSTEM_ALERT_WINDOW, !allowed, mToken); - mAppOpsManager.setUserRestriction( - AppOpsManager.OP_TOAST_WINDOW, !allowed, mToken); + mAppOpsManager.setUserRestrictionForUser(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, !allowed, + mToken, null, UserHandle.USER_ALL); + mAppOpsManager.setUserRestrictionForUser(AppOpsManager.OP_TOAST_WINDOW, !allowed, + mToken, null, UserHandle.USER_ALL); } } } diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java index c8e6e2efb240..29f8a1130792 100644 --- a/services/core/java/com/android/server/AppOpsService.java +++ b/services/core/java/com/android/server/AppOpsService.java @@ -16,22 +16,6 @@ package com.android.server; -import java.io.File; -import java.io.FileDescriptor; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintWriter; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - import android.Manifest; import android.app.ActivityManager; import android.app.ActivityThread; @@ -42,6 +26,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; +import android.content.pm.UserInfo; import android.media.AudioAttributes; import android.os.AsyncTask; import android.os.Binder; @@ -55,6 +40,7 @@ import android.os.ServiceManager; import android.os.ShellCallback; import android.os.ShellCommand; import android.os.UserHandle; +import android.os.UserManager; import android.os.storage.StorageManagerInternal; import android.util.ArrayMap; import android.util.ArraySet; @@ -66,8 +52,8 @@ import android.util.SparseIntArray; import android.util.TimeUtils; import android.util.Xml; -import com.android.internal.app.IAppOpsService; import com.android.internal.app.IAppOpsCallback; +import com.android.internal.app.IAppOpsService; import com.android.internal.os.Zygote; import com.android.internal.util.ArrayUtils; import com.android.internal.util.DumpUtils; @@ -76,10 +62,27 @@ import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; import libcore.util.EmptyArray; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; +import java.io.File; +import java.io.FileDescriptor; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + public class AppOpsService extends IAppOpsService.Stub { static final String TAG = "AppOps"; static final boolean DEBUG = false; @@ -2526,38 +2529,56 @@ public class AppOpsService extends IAppOpsService.Stub { perUserRestrictions = new SparseArray<>(); } - if (perUserRestrictions != null) { - boolean[] userRestrictions = perUserRestrictions.get(userId); - if (userRestrictions == null && restricted) { - userRestrictions = new boolean[AppOpsManager._NUM_OP]; - perUserRestrictions.put(userId, userRestrictions); - } - if (userRestrictions != null && userRestrictions[code] != restricted) { - userRestrictions[code] = restricted; - if (!restricted && isDefault(userRestrictions)) { - perUserRestrictions.remove(userId); - userRestrictions = null; - } - changed = true; + int[] users; + if (userId == UserHandle.USER_ALL) { + List<UserInfo> liveUsers = UserManager.get(mContext).getUsers(false); + + users = new int[liveUsers.size()]; + for (int i = 0; i < liveUsers.size(); i++) { + users[i] = liveUsers.get(i).id; } + } else { + users = new int[]{userId}; + } - if (userRestrictions != null) { - final boolean noExcludedPackages = ArrayUtils.isEmpty(excludedPackages); - if (perUserExcludedPackages == null && !noExcludedPackages) { - perUserExcludedPackages = new SparseArray<>(); + if (perUserRestrictions != null) { + int numUsers = users.length; + + for (int i = 0; i < numUsers; i++) { + int thisUserId = users[i]; + + boolean[] userRestrictions = perUserRestrictions.get(thisUserId); + if (userRestrictions == null && restricted) { + userRestrictions = new boolean[AppOpsManager._NUM_OP]; + perUserRestrictions.put(thisUserId, userRestrictions); } - if (perUserExcludedPackages != null && !Arrays.equals(excludedPackages, - perUserExcludedPackages.get(userId))) { - if (noExcludedPackages) { - perUserExcludedPackages.remove(userId); - if (perUserExcludedPackages.size() <= 0) { - perUserExcludedPackages = null; - } - } else { - perUserExcludedPackages.put(userId, excludedPackages); + if (userRestrictions != null && userRestrictions[code] != restricted) { + userRestrictions[code] = restricted; + if (!restricted && isDefault(userRestrictions)) { + perUserRestrictions.remove(thisUserId); + userRestrictions = null; } changed = true; } + + if (userRestrictions != null) { + final boolean noExcludedPackages = ArrayUtils.isEmpty(excludedPackages); + if (perUserExcludedPackages == null && !noExcludedPackages) { + perUserExcludedPackages = new SparseArray<>(); + } + if (perUserExcludedPackages != null && !Arrays.equals(excludedPackages, + perUserExcludedPackages.get(thisUserId))) { + if (noExcludedPackages) { + perUserExcludedPackages.remove(thisUserId); + if (perUserExcludedPackages.size() <= 0) { + perUserExcludedPackages = null; + } + } else { + perUserExcludedPackages.put(thisUserId, excludedPackages); + } + changed = true; + } + } } } |