Move all sms tables except raw into credential encrypted
storage.

BUG: 26232405
Change-Id: I478528ed8eea5013c79263d469b50ada44f647bd
diff --git a/src/com/android/providers/telephony/MmsProvider.java b/src/com/android/providers/telephony/MmsProvider.java
index 515ecad..2c59f75 100644
--- a/src/com/android/providers/telephony/MmsProvider.java
+++ b/src/com/android/providers/telephony/MmsProvider.java
@@ -70,7 +70,7 @@
     @Override
     public boolean onCreate() {
         setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_WRITE_SMS);
-        mOpenHelper = MmsSmsDatabaseHelper.getInstance(getContext());
+        mOpenHelper = MmsSmsDatabaseHelper.getInstanceForCe(getContext());
         return true;
     }
 
diff --git a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
index f2d12d3..983f68a 100644
--- a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
+++ b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
@@ -24,6 +24,7 @@
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteOpenHelper;
+import android.os.storage.StorageManager;
 import android.provider.BaseColumns;
 import android.provider.Telephony;
 import android.provider.Telephony.Mms;
@@ -48,6 +49,23 @@
 import java.util.HashSet;
 import java.util.Iterator;
 
+/**
+ * A {@link SQLiteOpenHelper} that handles DB management of SMS and MMS tables.
+ *
+ * From N, SMS and MMS tables are split into two groups with different levels of encryption.
+ *   - the raw table, which lives inside DE(Device Encrypted) storage.
+ *   - all other tables, which lives under CE(Credential Encrypted) storage.
+ *
+ * All tables are created by this class in the same database that can live either in DE or CE
+ * storage. But not all tables in the same database should be used. Only DE tables should be used
+ * in the database created in DE and only CE tables should be used in the database created in CE.
+ * The only exception is a non-FBE device migrating from M to N, in which case the DE and CE tables
+ * will actually live inside the same storage/database.
+ *
+ * This class provides methods to create instances that manage databases in different storage.
+ * It's the responsibility of the clients of this class to make sure the right instance is
+ * used to access tables that are supposed to live inside the intended storage.
+ */
 public class MmsSmsDatabaseHelper extends SQLiteOpenHelper {
     private static final String TAG = "MmsSmsDatabaseHelper";
 
@@ -211,7 +229,8 @@
                         "     AND part.mid = pdu._id);" +
                         " END";
 
-    private static MmsSmsDatabaseHelper sInstance = null;
+    private static MmsSmsDatabaseHelper sDeInstance = null;
+    private static MmsSmsDatabaseHelper sCeInstance = null;
     private static boolean sTriedAutoIncrement = false;
     private static boolean sFakeLowStorageTest = false;     // for testing only
 
@@ -228,14 +247,29 @@
     }
 
     /**
-     * Return a singleton helper for the combined MMS and SMS
-     * database.
+     * Returns a singleton helper for the combined MMS and SMS database in device encrypted storage.
      */
-    /* package */ static synchronized MmsSmsDatabaseHelper getInstance(Context context) {
-        if (sInstance == null) {
-            sInstance = new MmsSmsDatabaseHelper(context);
+    /* package */ static synchronized MmsSmsDatabaseHelper getInstanceForDe(Context context) {
+        if (sDeInstance == null) {
+            sDeInstance = new MmsSmsDatabaseHelper(ProviderUtil.getDeviceEncryptedContext(context));
         }
-        return sInstance;
+        return sDeInstance;
+    }
+
+    /**
+     * Returns a singleton helper for the combined MMS and SMS database in credential encrypted
+     * storage. If FBE is not available, use the device encrypted storage instead.
+     */
+    /* package */ static synchronized MmsSmsDatabaseHelper getInstanceForCe(Context context) {
+        if (sCeInstance == null) {
+            if (StorageManager.isFileBasedEncryptionEnabled()) {
+                sCeInstance = new MmsSmsDatabaseHelper(
+                    ProviderUtil.getCredentialEncryptedContext(context));
+            } else {
+                sCeInstance = getInstanceForDe(context);
+            }
+        }
+        return sCeInstance;
     }
 
     /**
diff --git a/src/com/android/providers/telephony/MmsSmsProvider.java b/src/com/android/providers/telephony/MmsSmsProvider.java
index 0e4e447..b2fa117 100644
--- a/src/com/android/providers/telephony/MmsSmsProvider.java
+++ b/src/com/android/providers/telephony/MmsSmsProvider.java
@@ -308,7 +308,7 @@
     @Override
     public boolean onCreate() {
         setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_WRITE_SMS);
-        mOpenHelper = MmsSmsDatabaseHelper.getInstance(getContext());
+        mOpenHelper = MmsSmsDatabaseHelper.getInstanceForCe(getContext());
         mUseStrictPhoneNumberComparation =
             getContext().getResources().getBoolean(
                     com.android.internal.R.bool.config_use_strict_phone_number_comparation);
diff --git a/src/com/android/providers/telephony/ProviderUtil.java b/src/com/android/providers/telephony/ProviderUtil.java
index 34c6da9..7f5a2bd 100644
--- a/src/com/android/providers/telephony/ProviderUtil.java
+++ b/src/com/android/providers/telephony/ProviderUtil.java
@@ -23,7 +23,6 @@
 import android.net.Uri;
 import android.os.Process;
 import android.provider.Telephony;
-import android.provider.Telephony.Sms;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -112,4 +111,17 @@
         context.sendBroadcast(intent);
     }
 
+    public static Context getCredentialEncryptedContext(Context context) {
+        if (context.isCredentialEncryptedStorage()) {
+            return context;
+        }
+        return context.createCredentialEncryptedStorageContext();
+    }
+
+    public static Context getDeviceEncryptedContext(Context context) {
+        if (context.isDeviceEncryptedStorage()) {
+            return context;
+        }
+        return context.createDeviceEncryptedStorageContext();
+    }
 }
diff --git a/src/com/android/providers/telephony/SmsProvider.java b/src/com/android/providers/telephony/SmsProvider.java
index c282a7f..7032fda 100644
--- a/src/com/android/providers/telephony/SmsProvider.java
+++ b/src/com/android/providers/telephony/SmsProvider.java
@@ -17,12 +17,10 @@
 package com.android.providers.telephony;
 
 import android.app.AppOpsManager;
-import android.content.ComponentName;
 import android.content.ContentProvider;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
-import android.content.Intent;
 import android.content.UriMatcher;
 import android.database.Cursor;
 import android.database.DatabaseUtils;
@@ -44,8 +42,6 @@
 import android.text.TextUtils;
 import android.util.Log;
 
-import com.android.internal.telephony.SmsApplication;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 
@@ -90,7 +86,8 @@
     @Override
     public boolean onCreate() {
         setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_WRITE_SMS);
-        mOpenHelper = MmsSmsDatabaseHelper.getInstance(getContext());
+        mDeOpenHelper = MmsSmsDatabaseHelper.getInstanceForDe(getContext());
+        mCeOpenHelper = MmsSmsDatabaseHelper.getInstanceForCe(getContext());
         return true;
     }
 
@@ -256,7 +253,7 @@
             orderBy = Sms.DEFAULT_SORT_ORDER;
         }
 
-        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
+        SQLiteDatabase db = getDBOpenHelper(match).getReadableDatabase();
         Cursor ret = qb.query(db, projectionIn, selection, selectionArgs,
                               null, null, orderBy);
 
@@ -266,6 +263,13 @@
         return ret;
     }
 
+    private SQLiteOpenHelper getDBOpenHelper(int match) {
+        if (match == SMS_RAW_MESSAGE) {
+            return mDeOpenHelper;
+        }
+        return mCeOpenHelper;
+    }
+
     private Object[] convertIccToSms(SmsMessage message, int id) {
         // N.B.: These calls must appear in the same order as the
         // columns appear in ICC_COLUMNS.
@@ -469,7 +473,7 @@
                 return null;
         }
 
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        SQLiteDatabase db = getDBOpenHelper(match).getWritableDatabase();
 
         if (table.equals(TABLE_SMS)) {
             boolean addDate = false;
@@ -598,7 +602,7 @@
     public int delete(Uri url, String where, String[] whereArgs) {
         int count;
         int match = sURLMatcher.match(url);
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        SQLiteDatabase db = getDBOpenHelper(match).getWritableDatabase();
         boolean notifyIfNotDefault = true;
         switch (match) {
             case SMS_ALL:
@@ -691,9 +695,10 @@
         String table = TABLE_SMS;
         String extraWhere = null;
         boolean notifyIfNotDefault = true;
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        int match = sURLMatcher.match(url);
+        SQLiteDatabase db = getDBOpenHelper(match).getWritableDatabase();
 
-        switch (sURLMatcher.match(url)) {
+        switch (match) {
             case SMS_RAW_MESSAGE:
                 table = TABLE_RAW;
                 notifyIfNotDefault = false;
@@ -778,7 +783,10 @@
         }
     }
 
-    private SQLiteOpenHelper mOpenHelper;
+    // Db open helper for tables stored in CE(Credential Encrypted) storage.
+    private SQLiteOpenHelper mCeOpenHelper;
+    // Db open helper for tables stored in DE(Device Encrypted) storage.
+    private SQLiteOpenHelper mDeOpenHelper;
 
     private final static String TAG = "SmsProvider";
     private final static String VND_ANDROID_SMS = "vnd.android.cursor.item/sms";