diff options
author | Danny Baumann <dannybaumann@web.de> | 2015-03-31 09:01:56 +0200 |
---|---|---|
committer | Danny Baumann <dannybaumann@web.de> | 2015-04-07 13:47:12 +0200 |
commit | 553933c7399ef8a06cf9035b1781926bcf566cf5 (patch) | |
tree | 08154e22bcb3680a6b6bc9259ec27e1a8f0e85fe | |
parent | 0fae3aec011303b17530eb754cf6f428ac714ea4 (diff) | |
download | android_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
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) { |