From 8828d3a153e28fe631edcd5145e6cc706e0b34c8 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Wed, 25 Sep 2013 16:47:10 -0700 Subject: Fix issue #10919261: Don't clear OP_WRITE_SMS when resetting app prefs Add a new array indicating whether each op allows itself to be reset, and use it. Change-Id: I494f630bda170e061196a380563512e9e77b51a8 --- core/java/android/app/AppOpsManager.java | 75 +++++++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 5 deletions(-) (limited to 'core/java/android') diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 055044b..dce8cab 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -453,27 +453,84 @@ public class AppOpsManager { AppOpsManager.MODE_ALLOWED, }; + /** + * This specifies whether each option is allowed to be reset + * when resetting all app preferences. Disable reset for + * app ops that are under strong control of some part of the + * system (such as OP_WRITE_SMS, which should be allowed only + * for whichever app is selected as the current SMS app). + */ + private static boolean[] sOpDisableReset = new boolean[] { + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, // OP_WRITE_SMS + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + }; + private static HashMap sOpStrToOp = new HashMap(); static { if (sOpToSwitch.length != _NUM_OP) { - throw new IllegalStateException("sOpStringLength " + sOpToSwitch.length + throw new IllegalStateException("sOpToSwitch length " + sOpToSwitch.length + " should be " + _NUM_OP); } if (sOpToString.length != _NUM_OP) { - throw new IllegalStateException("sOpStringLength " + sOpToString.length + throw new IllegalStateException("sOpToString length " + sOpToString.length + " should be " + _NUM_OP); } if (sOpNames.length != _NUM_OP) { - throw new IllegalStateException("sOpStringLength " + sOpNames.length + throw new IllegalStateException("sOpNames length " + sOpNames.length + " should be " + _NUM_OP); } if (sOpPerms.length != _NUM_OP) { - throw new IllegalStateException("sOpStringLength " + sOpPerms.length + throw new IllegalStateException("sOpPerms length " + sOpPerms.length + " should be " + _NUM_OP); } if (sOpDefaultMode.length != _NUM_OP) { - throw new IllegalStateException("sOpStringLength " + sOpDefaultMode.length + throw new IllegalStateException("sOpDefaultMode length " + sOpDefaultMode.length + + " should be " + _NUM_OP); + } + if (sOpDisableReset.length != _NUM_OP) { + throw new IllegalStateException("sOpDisableReset length " + sOpDisableReset.length + " should be " + _NUM_OP); } for (int i=0; i<_NUM_OP; i++) { @@ -517,6 +574,14 @@ public class AppOpsManager { } /** + * Retrieve whether the op allows itself to be reset. + * @hide + */ + public static boolean opAllowsReset(int op) { + return !sOpDisableReset[op]; + } + + /** * Class holding all of the operation information associated with an app. * @hide */ -- cgit v1.1