summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanny Baumann <dannybaumann@web.de>2015-03-31 09:01:56 +0200
committerDanny Baumann <dannybaumann@web.de>2015-04-07 13:47:12 +0200
commit553933c7399ef8a06cf9035b1781926bcf566cf5 (patch)
tree08154e22bcb3680a6b6bc9259ec27e1a8f0e85fe
parent0fae3aec011303b17530eb754cf6f428ac714ea4 (diff)
downloadandroid_packages_providers_TelephonyProvider-553933c7399ef8a06cf9035b1781926bcf566cf5.tar.gz
android_packages_providers_TelephonyProvider-553933c7399ef8a06cf9035b1781926bcf566cf5.tar.bz2
android_packages_providers_TelephonyProvider-553933c7399ef8a06cf9035b1781926bcf566cf5.zip
Add proper DB upgrade path.
Add back the CM11 upgrade path and a phone_id -> sub_id conversion. Change-Id: I1f26dca48ac1536a524177ff20e59d7242100861
-rw-r--r--src/com/android/providers/telephony/MmsSmsDatabaseHelper.java143
-rw-r--r--src/com/android/providers/telephony/MmsSmsProvider.java38
-rw-r--r--src/com/android/providers/telephony/TelephonyProvider.java12
3 files changed, 176 insertions, 17 deletions
diff --git a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
index c01f63d..6d9345d 100644
--- a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
+++ b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
@@ -29,8 +29,10 @@ import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;
import android.provider.Telephony;
@@ -166,7 +168,7 @@ public class MmsSmsDatabaseHelper extends SQLiteOpenHelper {
private static boolean sFakeLowStorageTest = false; // for testing only
static final String DATABASE_NAME = "mmssms.db";
- static final int DATABASE_VERSION = 62;
+ static final int DATABASE_VERSION = 64;
private final Context mContext;
private LowStorageMonitor mLowStorageMonitor;
@@ -452,6 +454,12 @@ public class MmsSmsDatabaseHelper extends SQLiteOpenHelper {
createMmsTriggers(db);
createWordsTables(db);
createIndices(db);
+
+ SharedPreferences prefs = mContext.getSharedPreferences("migration", Context.MODE_PRIVATE);
+ if (!prefs.getBoolean("mms_phoneid_subid_conversion_done", false)
+ && migratePhoneIdToSubIdIfPossible(db)) {
+ prefs.edit().putBoolean("mms_phoneid_subid_conversion_done", true).apply();
+ }
}
// When upgrading the database we need to populate the words
@@ -604,6 +612,7 @@ public class MmsSmsDatabaseHelper extends SQLiteOpenHelper {
Mms.DELIVERY_TIME + " INTEGER," +
Mms.DELIVERY_REPORT + " INTEGER," +
Mms.LOCKED + " INTEGER DEFAULT 0," +
+ Mms.SUBSCRIPTION_ID + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID + ", " +
Mms.PHONE_ID + " INTEGER DEFAULT -1, " +
Mms.SEEN + " INTEGER DEFAULT 0," +
Mms.CREATOR + " TEXT," +
@@ -830,6 +839,7 @@ public class MmsSmsDatabaseHelper extends SQLiteOpenHelper {
"body TEXT," +
"service_center TEXT," +
"locked INTEGER DEFAULT 0," +
+ "sub_id INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID + ", " +
"phone_id INTEGER DEFAULT -1, " +
"error_code INTEGER DEFAULT 0," +
"creator TEXT," +
@@ -849,6 +859,7 @@ public class MmsSmsDatabaseHelper extends SQLiteOpenHelper {
"sequence INTEGER," + // the part number of this message
"destination_port INTEGER," +
"address TEXT," +
+ "sub_id INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID + ", " +
"phone_id INTEGER DEFAULT -1, " +
"pdu TEXT);"); // the raw PDU for this part
@@ -917,6 +928,8 @@ public class MmsSmsDatabaseHelper extends SQLiteOpenHelper {
PendingMessages.ERROR_CODE + " INTEGER," +
PendingMessages.RETRY_INDEX + " INTEGER NOT NULL DEFAULT 0," +
PendingMessages.DUE_TIME + " INTEGER," +
+ PendingMessages.SUBSCRIPTION_ID + " INTEGER DEFAULT " +
+ SubscriptionManager.INVALID_SUBSCRIPTION_ID + ", " +
PendingMessages.PHONE_ID + " INTEGER DEFAULT 0, " +
PendingMessages.LAST_TRY + " INTEGER);");
@@ -1354,6 +1367,38 @@ public class MmsSmsDatabaseHelper extends SQLiteOpenHelper {
} finally {
db.endTransaction();
}
+ // fall through
+ case 62:
+ if (currentVersion <= 62) {
+ return;
+ }
+
+ db.beginTransaction();
+ try {
+ upgradeDatabaseToVersion63(db);
+ db.setTransactionSuccessful();
+ } catch (Throwable ex) {
+ Log.e(TAG, ex.getMessage(), ex);
+ break;
+ } finally {
+ db.endTransaction();
+ }
+ // fall through
+ case 63:
+ if (currentVersion <= 63) {
+ return;
+ }
+
+ db.beginTransaction();
+ try {
+ upgradeDatabaseToVersion64(db);
+ db.setTransactionSuccessful();
+ } catch (Throwable ex) {
+ Log.e(TAG, ex.getMessage(), ex);
+ break;
+ } finally {
+ db.endTransaction();
+ }
return;
}
@@ -1570,6 +1615,7 @@ public class MmsSmsDatabaseHelper extends SQLiteOpenHelper {
+ Mms.CREATOR + " TEXT");
db.execSQL("ALTER TABLE " + SmsProvider.TABLE_SMS +" ADD COLUMN "
+ Sms.CREATOR + " TEXT");
+
// If there is no "phone_id" column in sms table, this means the database
// may come from an KK platform, whose version is already 58.
if (!isColumnExist(db, SmsProvider.TABLE_SMS, Sms.PHONE_ID)) {
@@ -1599,12 +1645,58 @@ public class MmsSmsDatabaseHelper extends SQLiteOpenHelper {
}
private void upgradeDatabaseToVersion62(SQLiteDatabase db) {
+ if (isCM11DB(db)) {
+ // CM11 was 60, which means we skipped a few updates...
+ try {
+ upgradeDatabaseToVersion58(db);
+ } catch (Exception e) { }
+ try {
+ upgradeDatabaseToVersion59(db);
+ } catch (Exception e) { }
+ try {
+ upgradeDatabaseToVersion60(db);
+ } catch (Exception e) { }
+ try {
+ upgradeDatabaseToVersion61(db);
+ } catch (Exception e) { }
+ }
+ }
+
+ private void upgradeDatabaseToVersion63(SQLiteDatabase db) {
// Improve the performance of deleting Mms.
db.execSQL("DROP TRIGGER IF EXISTS update_threads_on_delete_part");
db.execSQL("DROP TRIGGER IF EXISTS mms_words_delete");
db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_on_delete");
}
+ private void upgradeDatabaseToVersion64(SQLiteDatabase db) {
+ try {
+ db.execSQL("ALTER TABLE " + MmsProvider.TABLE_PDU +" ADD COLUMN "
+ + Mms.SUBSCRIPTION_ID + " INTEGER DEFAULT -1");
+ } catch (SQLiteException e) {
+ // ignore (DB was older than version 58), we'll remove the data later
+ }
+ db.execSQL("ALTER TABLE " + MmsSmsProvider.TABLE_PENDING_MSG +" ADD COLUMN "
+ + "pending_sub_id" + " INTEGER DEFAULT 0");
+ try {
+ db.execSQL("ALTER TABLE " + SmsProvider.TABLE_SMS +" ADD COLUMN "
+ + Sms.SUBSCRIPTION_ID + " INTEGER DEFAULT -1");
+ } catch (SQLiteException e) {
+ // see above
+ }
+ try {
+ db.execSQL("ALTER TABLE " + SmsProvider.TABLE_RAW +" ADD COLUMN "
+ + Sms.SUBSCRIPTION_ID + " INTEGER DEFAULT -1");
+ } catch (SQLiteException e) {
+ // see above
+ }
+ // remove old data from the sub_id column (if present), it was already copied
+ // over to the phone_id column in upgradeDatabaseToVersion59
+ db.execSQL("UPDATE " + MmsProvider.TABLE_PDU + " SET " + Mms.SUBSCRIPTION_ID + " = -1");
+ db.execSQL("UPDATE " + SmsProvider.TABLE_SMS + " SET " + Sms.SUBSCRIPTION_ID + " = -1");
+ db.execSQL("UPDATE " + SmsProvider.TABLE_RAW + " SET " + Sms.SUBSCRIPTION_ID + " = -1");
+ }
+
// Try to copy data from existing src column to new column which supposed
// to be added before calling this functin.
// If src or dest column not exsit, it will just bail out.
@@ -1910,6 +2002,7 @@ public class MmsSmsDatabaseHelper extends SQLiteOpenHelper {
Mms.DELIVERY_TIME + " INTEGER," +
Mms.DELIVERY_REPORT + " INTEGER," +
Mms.LOCKED + " INTEGER DEFAULT 0," +
+ Mms.SUBSCRIPTION_ID + " INTEGER DEFAULT " + SubscriptionManager.INVALID_SUBSCRIPTION_ID + ", " +
Mms.PHONE_ID + " INTEGER DEFAULT -1, " +
Mms.SEEN + " INTEGER DEFAULT 0," +
Mms.TEXT_ONLY + " INTEGER DEFAULT 0" +
@@ -1947,4 +2040,52 @@ public class MmsSmsDatabaseHelper extends SQLiteOpenHelper {
" JOIN pdu ON pdu._id=part.mid " +
" WHERE part.ct != 'text/plain' AND part.ct != 'application/smil')");
}
+
+ // Determine whether this database has CM11 columns...
+ private boolean isCM11DB(SQLiteDatabase db) {
+ Cursor c = null;
+ try {
+ final String query = "SELECT sub_id, pri FROM sms";
+ c = db.rawQuery(query, null);
+ } catch (Exception e) {
+ } finally {
+ if (c != null) {
+ c.close();
+ }
+ }
+ return c != null;
+ }
+
+ private boolean migratePhoneIdToSubIdIfPossible(SQLiteDatabase db) {
+ boolean migratedAnyData = false;
+ Cursor simCursor = mContext.getContentResolver().query(SubscriptionManager.CONTENT_URI,
+ new String[] {
+ SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID,
+ SubscriptionManager.SIM_SLOT_INDEX
+ }, null, null, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + " ASC");
+ if (simCursor != null) {
+ try {
+ simCursor.moveToFirst();
+ while (!simCursor.isAfterLast()) {
+ int subId = simCursor.getInt(0);
+ int phoneId = simCursor.getInt(1);
+ db.execSQL("UPDATE " + MmsProvider.TABLE_PDU + " SET " + Mms.SUBSCRIPTION_ID
+ + " = " + subId + " WHERE " + Mms.PHONE_ID + " = " + phoneId + " AND "
+ + Mms.SUBSCRIPTION_ID + " <= 0");
+ db.execSQL("UPDATE " + SmsProvider.TABLE_SMS + " SET " + Sms.SUBSCRIPTION_ID
+ + " = " + subId + " WHERE " + Sms.PHONE_ID + " = " + phoneId + " AND "
+ + Sms.SUBSCRIPTION_ID + " <= 0");
+ db.execSQL("UPDATE " + SmsProvider.TABLE_RAW + " SET " + Sms.SUBSCRIPTION_ID
+ + " = " + subId + " WHERE " + Sms.PHONE_ID + " = " + phoneId + " AND "
+ + Sms.SUBSCRIPTION_ID + " <= 0");
+ migratedAnyData = true;
+ simCursor.moveToNext();
+ }
+ } finally {
+ simCursor.close();
+ }
+ }
+
+ return migratedAnyData;
+ }
}
diff --git a/src/com/android/providers/telephony/MmsSmsProvider.java b/src/com/android/providers/telephony/MmsSmsProvider.java
index 7c398aa..b23666f 100644
--- a/src/com/android/providers/telephony/MmsSmsProvider.java
+++ b/src/com/android/providers/telephony/MmsSmsProvider.java
@@ -143,7 +143,7 @@ public class MmsSmsProvider extends ContentProvider {
// SMS ("sms") message tables.
private static final String[] MMS_SMS_COLUMNS =
{ BaseColumns._ID, Mms.DATE, Mms.DATE_SENT, Mms.READ, Mms.THREAD_ID, Mms.LOCKED,
- Mms.PHONE_ID };
+ Mms.SUBSCRIPTION_ID, Mms.PHONE_ID };
// These are the columns that appear only in the MMS message
// table.
@@ -242,52 +242,51 @@ public class MmsSmsProvider extends ContentProvider {
" GROUP BY thread_id ORDER BY thread_id ASC, date DESC";
private static final String SMS_PROJECTION = "'sms' AS transport_type, _id, thread_id,"
- + "address, body, phone_id, date, date_sent, read, type,"
+ + "address, body, sub_id, phone_id, date, date_sent, read, type,"
+ "status, locked, NULL AS error_code,"
+ "NULL AS sub, NULL AS sub_cs, date, date_sent, read,"
+ "NULL as m_type,"
+ "NULL AS msg_box,"
+ "NULL AS d_rpt, NULL AS rr, NULL AS err_type,"
- + "locked, NULL AS st, NULL AS text_only,"
- + "phone_id, NULL AS recipient_ids";
+ + "locked, NULL AS st, NULL AS text_only, NULL AS recipient_ids";
private static final String MMS_PROJECTION = "'mms' AS transport_type, pdu._id, thread_id,"
- + "addr.address AS address, part.text as body, phone_id,"
+ + "addr.address AS address, part.text as body, sub_id, phone_id,"
+ "pdu.date * 1000 AS date, date_sent, read, NULL AS type,"
+ "NULL AS status, locked, NULL AS error_code,"
+ "sub, sub_cs, date, date_sent, read,"
+ "m_type,"
+ "pdu.msg_box AS msg_box,"
+ "d_rpt, rr, NULL AS err_type,"
- + "locked, NULL AS st, NULL AS text_only,"
- + "phone_id, NULL AS recipient_ids";
+ + "locked, NULL AS st, NULL AS text_only, NULL AS recipient_ids";
private static final String MMS_PROJECTION_FOR_SUBJECT_SEARCH =
"'mms' AS transport_type, pdu._id, thread_id,"
- + "addr.address AS address, pdu.sub as body, phone_id,"
+ + "addr.address AS address, pdu.sub as body, sub_id, phone_id,"
+ "pdu.date * 1000 AS date, date_sent, read, NULL AS type,"
+ "NULL AS status, locked, NULL AS error_code,"
+ "sub, sub_cs, date, date_sent, read,"
+ "m_type,"
+ "pdu.msg_box AS msg_box,"
+ "d_rpt, rr, NULL AS err_type,"
- + "locked, NULL AS st, NULL AS text_only,"
- + "phone_id, NULL AS recipient_ids";
+ + "locked, NULL AS st, NULL AS text_only, NULL AS recipient_ids";
private static final String MMS_PROJECTION_FOR_NUMBER_SEARCH =
"'mms' AS transport_type, pdu._id, thread_id,"
- + "addr.address AS address, NULL AS body, phone_id,"
+ + "addr.address AS address, NULL AS body, sub_id, phone_id,"
+ "pdu.date * 1000 AS date, date_sent, read, NULL AS type,"
+ "NULL AS status, locked, NULL AS error_code,"
+ "sub, sub_cs, date, date_sent, read,"
+ "m_type,"
+ "pdu.msg_box AS msg_box,"
+ "d_rpt, rr, NULL AS err_type,"
- + "locked, NULL AS st, NULL AS text_only,"
- + "phone_id, NULL AS recipient_ids";
+ + "locked, NULL AS st, NULL AS text_only, NULL AS recipient_ids";
private static final String THREADS_BY_PHONE_ID_WHERE =
"_id in (select thread_id from sms where phone_id=? " +
"union select thread_id from pdu where phone_id=?)";
+ private static final String THREADS_BY_SUB_ID_WHERE =
+ "_id in (select thread_id from sms where sub_id=? " +
+ "union select thread_id from pdu where sub_id=?)";
private static final String AUTHORITY = "mms-sms";
@@ -410,6 +409,13 @@ public class MmsSmsProvider extends ContentProvider {
selectionArgs = appendSelectionArgs(selectionArgs, phoneId, phoneId);
}
+ String subId = uri.getQueryParameter("sub_id");
+ if (!TextUtils.isEmpty(subId)) {
+ selection = concatSelections(selection,
+ THREADS_BY_SUB_ID_WHERE);
+ selectionArgs = appendSelectionArgs(selectionArgs, subId, subId);
+ }
+
cursor = getSimpleConversations(
projection, selection, selectionArgs, sortOrder);
} else {
@@ -1161,6 +1167,7 @@ public class MmsSmsProvider extends ContentProvider {
columnsPresentInTable.add("pdu.date AS date");
columnsPresentInTable.add("pdu.read AS read");
columnsPresentInTable.add("pdu.phone_id AS phone_id");
+ columnsPresentInTable.add("pdu.sub_id AS sub_id");
columnsPresentInTable.add("recipient_ids");
columnsPresentInTable.add(PendingMessages.ERROR_TYPE);
@@ -1191,6 +1198,7 @@ public class MmsSmsProvider extends ContentProvider {
columnsPresentInSmsTable.add("sms.read AS read");
columnsPresentInSmsTable.add("sms.type AS type");
columnsPresentInSmsTable.add("sms.phone_id AS phone_id");
+ columnsPresentInSmsTable.add("sms.sub_id AS sub_id");
columnsPresentInSmsTable.add("recipient_ids");
String smsSubQuery = smsQueryBuilder.buildUnionSubQuery(
@@ -1351,6 +1359,8 @@ public class MmsSmsProvider extends ContentProvider {
newProjection[i] = "pdu.read AS read";
} else if (old[i].equals("phone_id")) {
newProjection[i] = "pdu.phone_id AS phone_id";
+ } else if (old[i].equals("sub_id")) {
+ newProjection[i] = "pdu.sub_id AS sub_id";
} else {
newProjection[i] = old[i];
}
@@ -1376,6 +1386,8 @@ public class MmsSmsProvider extends ContentProvider {
newProjection[i] = "sms.type AS type";
} else if (old[i].equals("phone_id")) {
newProjection[i] = "sms.phone_id AS phone_id";
+ } else if (old[i].equals("sub_id")) {
+ newProjection[i] = "sms.sub_id AS sub_id";
} else {
newProjection[i] = old[i];
}
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index fa498a9..bc5baf9 100644
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
@@ -437,9 +437,15 @@ public class TelephonyProvider extends ContentProvider
" The table will get created in onOpen.");
}
}
- // Update carriers table to add read_only column
- db.execSQL("ALTER TABLE " + CARRIERS_TABLE +
- " ADD COLUMN read_only BOOLEAN DEFAULT 0;");
+ try {
+ // read_only was present in CM11, but not in CM12. Add it if it's missing.
+ db.execSQL("ALTER TABLE " + CARRIERS_TABLE +
+ " ADD COLUMN read_only BOOLEAN DEFAULT 0;");
+ } catch (SQLiteException e) {
+ if (DBG) {
+ log("onUpgrade " + CARRIERS_TABLE + ": read_only already present.");
+ }
+ }
oldVersion = 17 << 16 | 6;
}
if (DBG) {