From f5d831915dd11e77cdcf5669228c55fe17a21c5e Mon Sep 17 00:00:00 2001 From: David Braun Date: Mon, 16 Sep 2013 13:43:51 -0700 Subject: [PATCH] Implement new method for handling SMS/MMS on the platform Multi project change: The changes in this project add the new (hidden) default sms application setting to Settings.Secure and updates AppOps to support the concept of an op defaulting to something other than allowed. OP_WRITE_SMS is set to default to MODE_IGNORED. Bug: 10449618 Change-Id: I37619784ac70c27cf9fbcbfcac1b263398bc4e01 --- core/java/android/app/AppOpsManager.java | 59 ++++++++++++++++++- core/java/android/provider/Settings.java | 6 ++ .../com/android/server/AppOpsService.java | 14 ++--- 3 files changed, 71 insertions(+), 8 deletions(-) diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 3e4795c089572..bf2a1e485f414 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -65,7 +65,7 @@ public class AppOpsManager { // when adding one of these: // - increment _NUM_OP - // - add rows to sOpToSwitch, sOpNames, sOpPerms + // - add rows to sOpToSwitch, sOpNames, sOpPerms, sOpDefaultMode // - add descriptive strings to Settings/res/values/arrays.xml // - add the op to the appropriate template in AppOpsState.OpsTemplate (settings app) @@ -314,6 +314,55 @@ public class AppOpsManager { null, // no permission for high power location monitoring }; + /** + * This specifies the default mode for each operation. + */ + private static int[] sOpDefaultMode = new int[] { + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_IGNORED, // OP_WRITE_SMS + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + AppOpsManager.MODE_ALLOWED, + }; + /** * Retrieve the op switch that controls the given operation. * @hide @@ -338,6 +387,14 @@ public class AppOpsManager { return sOpPerms[op]; } + /** + * Retrieve the default mode for the operation. + * @hide + */ + public static int opToDefaultMode(int op) { + return sOpDefaultMode[op]; + } + /** * Class holding all of the operation information associated with an app. * @hide diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index c1c826c35f90f..00a1ab0daf8c9 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -4354,6 +4354,12 @@ public final class Settings { */ public static final String NFC_PAYMENT_DEFAULT_COMPONENT = "nfc_payment_default_component"; + /** + * Specifies the package name currently configured to be the primary sms application + * @hide + */ + public static final String SMS_DEFAULT_APPLICATION = "sms_default_application"; + /** * Name of a package that the current user has explicitly allowed to see all of that * user's notifications. diff --git a/services/java/com/android/server/AppOpsService.java b/services/java/com/android/server/AppOpsService.java index c6c4a94177b4a..67b2307c128cb 100644 --- a/services/java/com/android/server/AppOpsService.java +++ b/services/java/com/android/server/AppOpsService.java @@ -113,7 +113,7 @@ public class AppOpsService extends IAppOpsService.Stub { uid = _uid; packageName = _packageName; op = _op; - mode = AppOpsManager.MODE_ALLOWED; + mode = AppOpsManager.opToDefaultMode(op); } } @@ -191,7 +191,7 @@ public class AppOpsService extends IAppOpsService.Stub { mHandler = new Handler(); readState(); } - + public void publish(Context context) { mContext = context; ServiceManager.addService(Context.APP_OPS_SERVICE, asBinder()); @@ -379,7 +379,7 @@ public class AppOpsService extends IAppOpsService.Stub { } repCbs.addAll(cbs); } - if (mode == AppOpsManager.MODE_ALLOWED) { + if (mode == AppOpsManager.opToDefaultMode(op.op)) { // If going into the default mode, prune this op // if there is nothing else interesting in it. pruneOp(op, uid, packageName); @@ -435,8 +435,8 @@ public class AppOpsService extends IAppOpsService.Stub { Ops pkgOps = ent.getValue(); for (int j=pkgOps.size()-1; j>=0; j--) { Op curOp = pkgOps.valueAt(j); - if (curOp.mode != AppOpsManager.MODE_ALLOWED) { - curOp.mode = AppOpsManager.MODE_ALLOWED; + if (curOp.mode != AppOpsManager.opToDefaultMode(curOp.op)) { + curOp.mode = AppOpsManager.opToDefaultMode(curOp.op); changed = true; callbacks = addCallbacks(callbacks, packageName, curOp.op, mOpModeWatchers.get(curOp.op)); @@ -545,7 +545,7 @@ public class AppOpsService extends IAppOpsService.Stub { synchronized (this) { Op op = getOpLocked(AppOpsManager.opToSwitch(code), uid, packageName, false); if (op == null) { - return AppOpsManager.MODE_ALLOWED; + return AppOpsManager.opToDefaultMode(code); } return op.mode; } @@ -947,7 +947,7 @@ public class AppOpsService extends IAppOpsService.Stub { AppOpsManager.OpEntry op = ops.get(j); out.startTag(null, "op"); out.attribute(null, "n", Integer.toString(op.getOp())); - if (op.getMode() != AppOpsManager.MODE_ALLOWED) { + if (op.getMode() != AppOpsManager.opToDefaultMode(op.getOp())) { out.attribute(null, "m", Integer.toString(op.getMode())); } long time = op.getTime();