Messaging auto persist switch (3/4)

b/14095333

Change-Id: I77d33a177fadba482c1571b59a10d6ebf1863a43
diff --git a/src/com/android/providers/telephony/MmsProvider.java b/src/com/android/providers/telephony/MmsProvider.java
index ed5ea8d..2d801e0 100644
--- a/src/com/android/providers/telephony/MmsProvider.java
+++ b/src/com/android/providers/telephony/MmsProvider.java
@@ -65,11 +65,10 @@
 
     @Override
     public boolean onCreate() {
-        if (!Telephony.AUTO_PERSIST) {
-            // TODO(ywen): Temporarily enable this so not to break existing apps
-            setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_WRITE_SMS);
-        }
-        mOpenHelper = MmsSmsDatabaseHelper.getInstance(getContext());
+        setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_NONE);
+        final Context context = getContext();
+        mOpenHelper = MmsSmsDatabaseHelper.getInstance(context);
+        mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
         return true;
     }
 
@@ -277,7 +276,10 @@
 
     @Override
     public Uri insert(Uri uri, ContentValues values) {
-        SmsWritePermission.enforce();
+        if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+            Log.e(TAG, "insert: rejected");
+            return rejectInsert(uri, values);
+        }
         // Don't let anyone insert anything with the _data column
         if (values != null && values.containsKey(Part._DATA)) {
             return null;
@@ -543,7 +545,10 @@
     @Override
     public int delete(Uri uri, String selection,
             String[] selectionArgs) {
-        SmsWritePermission.enforce();
+        if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+            Log.e(TAG, "delete: rejected");
+            return 0;
+        }
         int match = sURLMatcher.match(uri);
         if (LOCAL_LOGV) {
             Log.v(TAG, "Delete uri=" + uri + ", match=" + match);
@@ -697,7 +702,10 @@
     @Override
     public int update(Uri uri, ContentValues values,
             String selection, String[] selectionArgs) {
-        SmsWritePermission.enforce();
+        if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+            Log.e(TAG, "update: rejected");
+            return 0;
+        }
         // Don't let anyone update the _data column
         if (values != null && values.containsKey(Part._DATA)) {
             return 0;
@@ -941,6 +949,8 @@
 
     private SQLiteOpenHelper mOpenHelper;
 
+    private AppOpsManager mAppOps;
+
     private static String concatSelections(String selection1, String selection2) {
         if (TextUtils.isEmpty(selection1)) {
             return selection2;
diff --git a/src/com/android/providers/telephony/MmsSmsProvider.java b/src/com/android/providers/telephony/MmsSmsProvider.java
index 3c6fae9..57ac277 100644
--- a/src/com/android/providers/telephony/MmsSmsProvider.java
+++ b/src/com/android/providers/telephony/MmsSmsProvider.java
@@ -281,15 +281,16 @@
 
     private SQLiteOpenHelper mOpenHelper;
 
+    private AppOpsManager mAppOps;
+
     private boolean mUseStrictPhoneNumberComparation;
 
     @Override
     public boolean onCreate() {
-        if (!Telephony.AUTO_PERSIST) {
-            // TODO(ywen): Temporarily enable this so not to break existing apps
-            setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_WRITE_SMS);
-        }
-        mOpenHelper = MmsSmsDatabaseHelper.getInstance(getContext());
+        setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_NONE);
+        final Context context = getContext();
+        mOpenHelper = MmsSmsDatabaseHelper.getInstance(context);
+        mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
         mUseStrictPhoneNumberComparation =
             getContext().getResources().getBoolean(
                     com.android.internal.R.bool.config_use_strict_phone_number_comparation);
@@ -1174,7 +1175,10 @@
     @Override
     public int delete(Uri uri, String selection,
             String[] selectionArgs) {
-        SmsWritePermission.enforce();
+        if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+            Log.e(LOG_TAG, "delete: rejected");
+            return 0;
+        }
         SQLiteDatabase db = mOpenHelper.getWritableDatabase();
         Context context = getContext();
         int affectedRows = 0;
@@ -1230,7 +1234,10 @@
 
     @Override
     public Uri insert(Uri uri, ContentValues values) {
-        SmsWritePermission.enforce();
+        if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+            Log.e(LOG_TAG, "insert: rejected");
+            return rejectInsert(uri, values);
+        }
         if (URI_MATCHER.match(uri) == URI_PENDING_MSG) {
             SQLiteDatabase db = mOpenHelper.getWritableDatabase();
             long rowId = db.insert(TABLE_PENDING_MSG, null, values);
@@ -1242,7 +1249,10 @@
     @Override
     public int update(Uri uri, ContentValues values,
             String selection, String[] selectionArgs) {
-        SmsWritePermission.enforce();
+        if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+            Log.e(LOG_TAG, "update: rejected");
+            return 0;
+        }
         SQLiteDatabase db = mOpenHelper.getWritableDatabase();
         int affectedRows = 0;
         switch(URI_MATCHER.match(uri)) {
diff --git a/src/com/android/providers/telephony/SmsProvider.java b/src/com/android/providers/telephony/SmsProvider.java
index 89736e5..74ff103 100644
--- a/src/com/android/providers/telephony/SmsProvider.java
+++ b/src/com/android/providers/telephony/SmsProvider.java
@@ -20,6 +20,7 @@
 import android.content.ContentProvider;
 import android.content.ContentResolver;
 import android.content.ContentValues;
+import android.content.Context;
 import android.content.UriMatcher;
 
 import android.database.Cursor;
@@ -84,11 +85,10 @@
 
     @Override
     public boolean onCreate() {
-        if (!Telephony.AUTO_PERSIST) {
-            // TODO(ywen): Temporarily enable this so not to break existing apps
-            setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_WRITE_SMS);
-        }
-        mOpenHelper = MmsSmsDatabaseHelper.getInstance(getContext());
+        setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_NONE);
+        final Context context = getContext();
+        mOpenHelper = MmsSmsDatabaseHelper.getInstance(context);
+        mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
         return true;
     }
 
@@ -350,7 +350,10 @@
 
     @Override
     public Uri insert(Uri url, ContentValues initialValues) {
-        SmsWritePermission.enforce();
+        if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+            Log.e(TAG, "insert: rejected");
+            return rejectInsert(url, initialValues);
+        }
         long token = Binder.clearCallingIdentity();
         try {
             return insertInner(url, initialValues);
@@ -543,7 +546,10 @@
 
     @Override
     public int delete(Uri url, String where, String[] whereArgs) {
-        SmsWritePermission.enforce();
+        if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+            Log.e(TAG, "delete: rejected");
+            return 0;
+        }
         int count;
         int match = sURLMatcher.match(url);
         SQLiteDatabase db = mOpenHelper.getWritableDatabase();
@@ -629,7 +635,10 @@
 
     @Override
     public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
-        SmsWritePermission.enforce();
+        if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+            Log.e(TAG, "update: rejected");
+            return 0;
+        }
         int count = 0;
         String table = TABLE_SMS;
         String extraWhere = null;
@@ -710,6 +719,8 @@
 
     private SQLiteOpenHelper mOpenHelper;
 
+    private AppOpsManager mAppOps;
+
     private final static String TAG = "SmsProvider";
     private final static String VND_ANDROID_SMS = "vnd.android.cursor.item/sms";
     private final static String VND_ANDROID_SMSCHAT =
diff --git a/src/com/android/providers/telephony/SmsWritePermission.java b/src/com/android/providers/telephony/SmsWritePermission.java
index 186a75f..6229673 100644
--- a/src/com/android/providers/telephony/SmsWritePermission.java
+++ b/src/com/android/providers/telephony/SmsWritePermission.java
@@ -16,9 +16,10 @@
 
 package com.android.providers.telephony;
 
+import android.app.AppOpsManager;
+import android.content.Context;
 import android.os.Binder;
 import android.os.Process;
-import android.provider.Telephony;
 import android.util.Log;
 
 /**
@@ -27,15 +28,18 @@
 public class SmsWritePermission {
     public static final String TAG = "SmsWritePermission";
 
-    public static void enforce() {
-        if (!Telephony.AUTO_PERSIST) {
-            // TODO(ywen): Temporarily disable this so not to break existing apps
-            return;
+    public static boolean permit(AppOpsManager appOpsManager, String callingPkg) {
+        final int uid = Binder.getCallingUid();
+        Log.d(TAG, "SmsWritePermission.permit: calling UID " + uid);
+        if (uid == Process.SYSTEM_UID || uid == Process.PHONE_UID) {
+            // Allow system or phone process to access anyway
+            return true;
         }
-        final long uid = Binder.getCallingUid();
-        Log.d(TAG, "Calling UID " + uid);
-        if (uid != Process.SYSTEM_UID && uid != Process.PHONE_UID) {
-            throw new SecurityException("Only system or phone can access");
+        if (appOpsManager.noteOp(AppOpsManager.OP_WRITE_SMS, uid, callingPkg) ==
+                AppOpsManager.MODE_ALLOWED) {
+            // Or we allow the default SMS app to access
+            return true;
         }
+        return false;
     }
 }