merge in nyc-release history after reset to nyc-dev
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";