MmsSmsDatabaseHelper.java revision 1a45ce5c6e417fee13c55221a97c3d36b4bea846
17236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project/* 27236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 37236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * 47236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 57236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * you may not use this file except in compliance with the License. 67236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * You may obtain a copy of the License at 77236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * 87236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 97236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * 107236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 117236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 127236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * See the License for the specific language governing permissions and 147236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * limitations under the License. 157236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project */ 167236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 177236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectpackage com.android.providers.telephony; 187236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 19f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagnerimport java.io.IOException; 20f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagnerimport java.io.InputStream; 21f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagnerimport java.io.FileInputStream; 22f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagnerimport java.io.File; 23f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagnerimport java.util.ArrayList; 24f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylorimport java.util.HashSet; 25f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylorimport java.util.Iterator; 26f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner 2710faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylorimport android.content.BroadcastReceiver; 288e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagnerimport android.content.ContentValues; 297236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.content.Context; 3010faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylorimport android.content.Intent; 3110faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylorimport android.content.IntentFilter; 327236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.database.Cursor; 337236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase; 347236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.database.sqlite.SQLiteOpenHelper; 357236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.provider.BaseColumns; 368e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagnerimport android.provider.Telephony; 377236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.provider.Telephony.Mms; 387236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.provider.Telephony.MmsSms; 397236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.provider.Telephony.Sms; 407236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.provider.Telephony.Threads; 417236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.provider.Telephony.Mms.Addr; 427236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.provider.Telephony.Mms.Part; 437236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.provider.Telephony.Mms.Rate; 447236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.provider.Telephony.MmsSms.PendingMessages; 457236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.util.Log; 467236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 47b1bae65bf18dc22762cf7b8210fdad836b3e4ee5Tom Taylorimport com.google.android.mms.pdu.EncodedStringValue; 48b1bae65bf18dc22762cf7b8210fdad836b3e4ee5Tom Taylorimport com.google.android.mms.pdu.PduHeaders; 49c71e770495e0b4597b4b3d947cbc68a0d35051beTom Taylor 507236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectpublic class MmsSmsDatabaseHelper extends SQLiteOpenHelper { 517236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final String TAG = "MmsSmsDatabaseHelper"; 527236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 537236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final String SMS_UPDATE_THREAD_READ_BODY = 547236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " UPDATE threads SET read = " + 557236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " CASE (SELECT COUNT(*)" + 567236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " FROM sms" + 577236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE " + Sms.READ + " = 0" + 587236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " AND " + Sms.THREAD_ID + " = threads._id)" + 597236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHEN 0 THEN 1" + 607236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " ELSE 0" + 617236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " END" + 627236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE threads._id = new." + Sms.THREAD_ID + "; "; 637236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 647236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final String UPDATE_THREAD_COUNT_ON_NEW = 657236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " UPDATE threads SET message_count = " + 667236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " + 677236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " ON threads._id = " + Sms.THREAD_ID + 687236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE " + Sms.THREAD_ID + " = new.thread_id" + 697236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " AND sms." + Sms.TYPE + " != 3) + " + 707236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " + 717236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " ON threads._id = " + Mms.THREAD_ID + 727236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE " + Mms.THREAD_ID + " = new.thread_id" + 737236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " AND (m_type=132 OR m_type=130 OR m_type=128)" + 747236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " AND " + Mms.MESSAGE_BOX + " != 3) " + 757236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE threads._id = new.thread_id; "; 767236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 777236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final String UPDATE_THREAD_COUNT_ON_OLD = 787236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " UPDATE threads SET message_count = " + 797236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " + 807236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " ON threads._id = " + Sms.THREAD_ID + 817236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE " + Sms.THREAD_ID + " = old.thread_id" + 827236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " AND sms." + Sms.TYPE + " != 3) + " + 837236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " + 847236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " ON threads._id = " + Mms.THREAD_ID + 857236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE " + Mms.THREAD_ID + " = old.thread_id" + 867236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " AND (m_type=132 OR m_type=130 OR m_type=128)" + 877236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " AND " + Mms.MESSAGE_BOX + " != 3) " + 887236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE threads._id = old.thread_id; "; 897236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 907236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final String SMS_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE = 917236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "BEGIN" + 927236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " UPDATE threads SET" + 937236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " date = (strftime('%s','now') * 1000), " + 947236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " snippet = new." + Sms.BODY + ", " + 957236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " snippet_cs = 0" + 967236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE threads._id = new." + Sms.THREAD_ID + "; " + 977236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project UPDATE_THREAD_COUNT_ON_NEW + 987236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project SMS_UPDATE_THREAD_READ_BODY + 997236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "END;"; 1007236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 1017236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final String PDU_UPDATE_THREAD_CONSTRAINTS = 102c71e770495e0b4597b4b3d947cbc68a0d35051beTom Taylor " WHEN new." + Mms.MESSAGE_TYPE + "=" + 103c71e770495e0b4597b4b3d947cbc68a0d35051beTom Taylor PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF + 104c71e770495e0b4597b4b3d947cbc68a0d35051beTom Taylor " OR new." + Mms.MESSAGE_TYPE + "=" + 105c71e770495e0b4597b4b3d947cbc68a0d35051beTom Taylor PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND + 106c71e770495e0b4597b4b3d947cbc68a0d35051beTom Taylor " OR new." + Mms.MESSAGE_TYPE + "=" + 107c71e770495e0b4597b4b3d947cbc68a0d35051beTom Taylor PduHeaders.MESSAGE_TYPE_SEND_REQ + " "; 1087236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 1091e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor // When looking in the pdu table for unread messages, only count messages that 1101e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor // are displayed to the user. The constants are defined in PduHeaders and could be used 1111e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor // here, but the string "(m_type=132 OR m_type=130 OR m_type=128)" is used throughout this 1121e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor // file and so it is used here to be consistent. 1131e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor // m_type=128 = MESSAGE_TYPE_SEND_REQ 1141e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor // m_type=130 = MESSAGE_TYPE_NOTIFICATION_IND 1151e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor // m_type=132 = MESSAGE_TYPE_RETRIEVE_CONF 1167236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final String PDU_UPDATE_THREAD_READ_BODY = 1177236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " UPDATE threads SET read = " + 1187236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " CASE (SELECT COUNT(*)" + 1197236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " FROM " + MmsProvider.TABLE_PDU + 1207236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE " + Mms.READ + " = 0" + 1211e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor " AND " + Mms.THREAD_ID + " = threads._id " + 1221e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor " AND (m_type=132 OR m_type=130 OR m_type=128)) " + 1237236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHEN 0 THEN 1" + 1247236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " ELSE 0" + 1257236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " END" + 1267236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE threads._id = new." + Mms.THREAD_ID + "; "; 1277236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 1287236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final String PDU_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE = 1297236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "BEGIN" + 1307236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " UPDATE threads SET" + 1317236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " date = (strftime('%s','now') * 1000), " + 1327236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " snippet = new." + Mms.SUBJECT + ", " + 1337236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " snippet_cs = new." + Mms.SUBJECT_CHARSET + 1347236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE threads._id = new." + Mms.THREAD_ID + "; " + 1357236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project UPDATE_THREAD_COUNT_ON_NEW + 1367236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project PDU_UPDATE_THREAD_READ_BODY + 1377236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "END;"; 1387236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 1397236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final String UPDATE_THREAD_SNIPPET_SNIPPET_CS_ON_DELETE = 1407236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " UPDATE threads SET snippet = " + 1417236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " (SELECT snippet FROM" + 1427236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " (SELECT date * 1000 AS date, sub AS snippet, thread_id FROM pdu" + 1437236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " UNION SELECT date, body AS snippet, thread_id FROM sms)" + 1447236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE thread_id = OLD.thread_id ORDER BY date DESC LIMIT 1) " + 1457236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE threads._id = OLD.thread_id; " + 1467236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " UPDATE threads SET snippet_cs = " + 1477236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " (SELECT snippet_cs FROM" + 1487236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " (SELECT date * 1000 AS date, sub_cs AS snippet_cs, thread_id FROM pdu" + 1497236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " UNION SELECT date, 0 AS snippet_cs, thread_id FROM sms)" + 1507236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE thread_id = OLD.thread_id ORDER BY date DESC LIMIT 1) " + 1517236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE threads._id = OLD.thread_id; "; 1527236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 1535f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project 1545f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project // When a part is inserted, if it is not text/plain or application/smil 1555f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project // (which both can exist with text-only MMSes), then there is an attachment. 1565f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project // Set has_attachment=1 in the threads table for the thread in question. 1575f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project private static final String PART_UPDATE_THREADS_ON_INSERT_TRIGGER = 1585f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project "CREATE TRIGGER update_threads_on_insert_part " + 1595f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " AFTER INSERT ON part " + 1605f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " WHEN new.ct != 'text/plain' AND new.ct != 'application/smil' " + 1615f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " BEGIN " + 1625f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " UPDATE threads SET has_attachment=1 WHERE _id IN " + 1635f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " (SELECT pdu.thread_id FROM part JOIN pdu ON pdu._id=part.mid " + 1645f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " WHERE part._id=new._id LIMIT 1); " + 1655f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " END"; 1662ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang 1672ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang // When the 'mid' column in the part table is updated, we need to run the trigger to update 1682ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang // the threads table's has_attachment column, if the part is an attachment. 1692ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang private static final String PART_UPDATE_THREADS_ON_UPDATE_TRIGGER = 1702ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang "CREATE TRIGGER update_threads_on_update_part " + 1712ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang " AFTER UPDATE of " + Part.MSG_ID + " ON part " + 1722ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang " WHEN new.ct != 'text/plain' AND new.ct != 'application/smil' " + 1732ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang " BEGIN " + 1742ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang " UPDATE threads SET has_attachment=1 WHERE _id IN " + 1752ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang " (SELECT pdu.thread_id FROM part JOIN pdu ON pdu._id=part.mid " + 1762ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang " WHERE part._id=new._id LIMIT 1); " + 1772ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang " END"; 1782ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang 1792ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang 1805f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project // When a part is deleted (with the same non-text/SMIL constraint as when 1815f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project // we set has_attachment), update the threads table for all threads. 1825f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project // Unfortunately we cannot update only the thread that the part was 1835f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project // attached to, as it is possible that the part has been orphaned and 1845f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project // the message it was attached to is already gone. 1855f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project private static final String PART_UPDATE_THREADS_ON_DELETE_TRIGGER = 1865f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project "CREATE TRIGGER update_threads_on_delete_part " + 1875f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " AFTER DELETE ON part " + 1885f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " WHEN old.ct != 'text/plain' AND old.ct != 'application/smil' " + 1895f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " BEGIN " + 1905f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " UPDATE threads SET has_attachment = " + 1915f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " CASE " + 19294489f821be2401e4a9045901d9112d42273b362Tom Taylor " (SELECT COUNT(*) FROM part JOIN pdu " + 1935f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " WHERE pdu.thread_id = threads._id " + 19494489f821be2401e4a9045901d9112d42273b362Tom Taylor " AND part.ct != 'text/plain' AND part.ct != 'application/smil' " + 19594489f821be2401e4a9045901d9112d42273b362Tom Taylor " AND part.mid = pdu._id)" + 1965f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " WHEN 0 THEN 0 " + 1975f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " ELSE 1 " + 1985f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " END; " + 1995f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project " END"; 200f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner 2011047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang // When the 'thread_id' column in the pdu table is updated, we need to run the trigger to update 2021047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang // the threads table's has_attachment column, if the message has an attachment in 'part' table 2031047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang private static final String PDU_UPDATE_THREADS_ON_UPDATE_TRIGGER = 2041047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang "CREATE TRIGGER update_threads_on_update_pdu " + 2051047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang " AFTER UPDATE of thread_id ON pdu " + 2061047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang " BEGIN " + 2071047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang " UPDATE threads SET has_attachment=1 WHERE _id IN " + 20894489f821be2401e4a9045901d9112d42273b362Tom Taylor " (SELECT pdu.thread_id FROM part JOIN pdu " + 20994489f821be2401e4a9045901d9112d42273b362Tom Taylor " WHERE part.ct != 'text/plain' AND part.ct != 'application/smil' " + 21094489f821be2401e4a9045901d9112d42273b362Tom Taylor " AND part.mid = pdu._id);" + 2111047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang " END"; 2121047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang 21310faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor private static MmsSmsDatabaseHelper sInstance = null; 21410faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor private static boolean sTriedAutoIncrement = false; 21510faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor private static boolean sFakeLowStorageTest = false; // for testing only 2167236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 2177236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project static final String DATABASE_NAME = "mmssms.db"; 2181a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor static final int DATABASE_VERSION = 57; 21910faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor private final Context mContext; 22010faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor private LowStorageMonitor mLowStorageMonitor; 2211ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor 2227236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 2237236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private MmsSmsDatabaseHelper(Context context) { 2247236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project super(context, DATABASE_NAME, null, DATABASE_VERSION); 22510faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor 22610faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor mContext = context; 2277236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 2287236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 2297236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project /** 2307236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * Return a singleton helper for the combined MMS and SMS 2317236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * database. 2327236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project */ 2337236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project /* package */ static synchronized MmsSmsDatabaseHelper getInstance(Context context) { 23410faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor if (sInstance == null) { 23510faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor sInstance = new MmsSmsDatabaseHelper(context); 2367236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 23710faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor return sInstance; 2387236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 2397236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 240f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor /** 241f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor * Look through all the recipientIds referenced by the threads and then delete any 242f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor * unreferenced rows from the canonical_addresses table. 243f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor */ 244f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor private static void removeUnferencedCanonicalAddresses(SQLiteDatabase db) { 245f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor Cursor c = db.query("threads", new String[] { "recipient_ids" }, 246f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor null, null, null, null, null); 247f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor if (c != null) { 248f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor try { 249f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor if (c.getCount() == 0) { 250f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor // no threads, delete all addresses 251f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor int rows = db.delete("canonical_addresses", null, null); 252f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor } else { 253f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor // Find all the referenced recipient_ids from the threads. recipientIds is 254f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor // a space-separated list of recipient ids: "1 14 21" 255f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor HashSet<Integer> recipientIds = new HashSet<Integer>(); 256f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor while (c.moveToNext()) { 257f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor String[] recips = c.getString(0).split(" "); 258f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor for (String recip : recips) { 259f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor try { 260f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor int recipientId = Integer.parseInt(recip); 261f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor recipientIds.add(recipientId); 262f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor } catch (Exception e) { 263f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor } 264f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor } 265f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor } 266f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor // Now build a selection string of all the unique recipient ids 267f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor StringBuilder sb = new StringBuilder(); 268f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor Iterator<Integer> iter = recipientIds.iterator(); 269f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor while (iter.hasNext()) { 270f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor sb.append("_id != " + iter.next()); 271f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor if (iter.hasNext()) { 272f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor sb.append(" AND "); 273f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor } 274f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor } 275f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor if (sb.length() > 0) { 276f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor int rows = db.delete("canonical_addresses", sb.toString(), null); 277f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor } 278f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor } 279f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor } finally { 280f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor c.close(); 281f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor } 282f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor } 283f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor } 284f409b0e23a37080c3b8c501671c4ea436a1e6346Tom Taylor 2857236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project public static void updateThread(SQLiteDatabase db, long thread_id) { 2867236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (thread_id < 0) { 2877236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project updateAllThreads(db, null, null); 2887236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return; 2897236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 290f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner 291842e3110ccca88661d06c733b56ead009f90b988Tom Taylor db.beginTransaction(); 292842e3110ccca88661d06c733b56ead009f90b988Tom Taylor try { 293842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // Delete the row for this thread in the threads table if 294842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // there are no more messages attached to it in either 295842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // the sms or pdu tables. 296842e3110ccca88661d06c733b56ead009f90b988Tom Taylor int rows = db.delete("threads", 297842e3110ccca88661d06c733b56ead009f90b988Tom Taylor "_id = ? AND _id NOT IN" + 298842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " (SELECT thread_id FROM sms " + 299842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " UNION SELECT thread_id FROM pdu)", 300842e3110ccca88661d06c733b56ead009f90b988Tom Taylor new String[] { String.valueOf(thread_id) }); 301842e3110ccca88661d06c733b56ead009f90b988Tom Taylor if (rows > 0) { 302842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // If this deleted a row, let's remove orphaned canonical_addresses and get outta here 303842e3110ccca88661d06c733b56ead009f90b988Tom Taylor removeUnferencedCanonicalAddresses(db); 304842e3110ccca88661d06c733b56ead009f90b988Tom Taylor } else { 305842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // Update the message count in the threads table as the sum 306842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // of all messages in both the sms and pdu tables. 307842e3110ccca88661d06c733b56ead009f90b988Tom Taylor db.execSQL( 308842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " UPDATE threads SET message_count = " + 309842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " + 310842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " ON threads._id = " + Sms.THREAD_ID + 311842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " WHERE " + Sms.THREAD_ID + " = " + thread_id + 312842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " AND sms." + Sms.TYPE + " != 3) + " + 313842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " + 314842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " ON threads._id = " + Mms.THREAD_ID + 315842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " WHERE " + Mms.THREAD_ID + " = " + thread_id + 316842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " AND (m_type=132 OR m_type=130 OR m_type=128)" + 317842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " AND " + Mms.MESSAGE_BOX + " != 3) " + 318842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " WHERE threads._id = " + thread_id + ";"); 319842e3110ccca88661d06c733b56ead009f90b988Tom Taylor 320842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // Update the date and the snippet (and its character set) in 321842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // the threads table to be that of the most recent message in 322842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // the thread. 323842e3110ccca88661d06c733b56ead009f90b988Tom Taylor db.execSQL( 324842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " UPDATE threads" + 325842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " SET" + 326842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " date =" + 327842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " (SELECT date FROM" + 328842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " (SELECT date * 1000 AS date, thread_id FROM pdu" + 329842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " UNION SELECT date, thread_id FROM sms)" + 330842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " WHERE thread_id = " + thread_id + " ORDER BY date DESC LIMIT 1)," + 331842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " snippet =" + 332842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " (SELECT snippet FROM" + 333842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " (SELECT date * 1000 AS date, sub AS snippet, thread_id FROM pdu" + 334842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " UNION SELECT date, body AS snippet, thread_id FROM sms)" + 335842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " WHERE thread_id = " + thread_id + " ORDER BY date DESC LIMIT 1)," + 336842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " snippet_cs =" + 337842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " (SELECT snippet_cs FROM" + 338842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " (SELECT date * 1000 AS date, sub_cs AS snippet_cs, thread_id FROM pdu" + 339842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " UNION SELECT date, 0 AS snippet_cs, thread_id FROM sms)" + 340842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " WHERE thread_id = " + thread_id + " ORDER BY date DESC LIMIT 1)" + 341842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " WHERE threads._id = " + thread_id + ";"); 342842e3110ccca88661d06c733b56ead009f90b988Tom Taylor 343842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // Update the error column of the thread to indicate if there 344842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // are any messages in it that have failed to send. 345842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // First check to see if there are any messages with errors in this thread. 346842e3110ccca88661d06c733b56ead009f90b988Tom Taylor String query = "SELECT thread_id FROM sms WHERE type=" + 347842e3110ccca88661d06c733b56ead009f90b988Tom Taylor Telephony.TextBasedSmsColumns.MESSAGE_TYPE_FAILED + 348842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " AND thread_id = " + thread_id + 349842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " LIMIT 1"; 350842e3110ccca88661d06c733b56ead009f90b988Tom Taylor int setError = 0; 351842e3110ccca88661d06c733b56ead009f90b988Tom Taylor Cursor c = db.rawQuery(query, null); 352842e3110ccca88661d06c733b56ead009f90b988Tom Taylor if (c != null) { 353842e3110ccca88661d06c733b56ead009f90b988Tom Taylor try { 354842e3110ccca88661d06c733b56ead009f90b988Tom Taylor setError = c.getCount(); // Because of the LIMIT 1, count will be 1 or 0. 355842e3110ccca88661d06c733b56ead009f90b988Tom Taylor } finally { 356842e3110ccca88661d06c733b56ead009f90b988Tom Taylor c.close(); 357842e3110ccca88661d06c733b56ead009f90b988Tom Taylor } 358842e3110ccca88661d06c733b56ead009f90b988Tom Taylor } 359842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // What's the current state of the error flag in the threads table? 360842e3110ccca88661d06c733b56ead009f90b988Tom Taylor String errorQuery = "SELECT error FROM threads WHERE _id = " + thread_id; 361842e3110ccca88661d06c733b56ead009f90b988Tom Taylor c = db.rawQuery(errorQuery, null); 362842e3110ccca88661d06c733b56ead009f90b988Tom Taylor if (c != null) { 363842e3110ccca88661d06c733b56ead009f90b988Tom Taylor try { 364842e3110ccca88661d06c733b56ead009f90b988Tom Taylor if (c.moveToNext()) { 365842e3110ccca88661d06c733b56ead009f90b988Tom Taylor int curError = c.getInt(0); 366842e3110ccca88661d06c733b56ead009f90b988Tom Taylor if (curError != setError) { 367842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // The current thread error column differs, update it. 368842e3110ccca88661d06c733b56ead009f90b988Tom Taylor db.execSQL("UPDATE threads SET error=" + setError + 369842e3110ccca88661d06c733b56ead009f90b988Tom Taylor " WHERE _id = " + thread_id); 370842e3110ccca88661d06c733b56ead009f90b988Tom Taylor } 371842e3110ccca88661d06c733b56ead009f90b988Tom Taylor } 372842e3110ccca88661d06c733b56ead009f90b988Tom Taylor } finally { 373842e3110ccca88661d06c733b56ead009f90b988Tom Taylor c.close(); 3749565e7f07472931ccefbe6804234d3543f96c9b8Tom Taylor } 3759565e7f07472931ccefbe6804234d3543f96c9b8Tom Taylor } 3769565e7f07472931ccefbe6804234d3543f96c9b8Tom Taylor } 377842e3110ccca88661d06c733b56ead009f90b988Tom Taylor db.setTransactionSuccessful(); 378842e3110ccca88661d06c733b56ead009f90b988Tom Taylor } catch (Throwable ex) { 379842e3110ccca88661d06c733b56ead009f90b988Tom Taylor Log.e(TAG, ex.getMessage(), ex); 380842e3110ccca88661d06c733b56ead009f90b988Tom Taylor } finally { 381842e3110ccca88661d06c733b56ead009f90b988Tom Taylor db.endTransaction(); 3829565e7f07472931ccefbe6804234d3543f96c9b8Tom Taylor } 3837236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 384f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner 3857236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project public static void updateAllThreads(SQLiteDatabase db, String where, String[] whereArgs) { 386842e3110ccca88661d06c733b56ead009f90b988Tom Taylor db.beginTransaction(); 387842e3110ccca88661d06c733b56ead009f90b988Tom Taylor try { 388842e3110ccca88661d06c733b56ead009f90b988Tom Taylor if (where == null) { 389842e3110ccca88661d06c733b56ead009f90b988Tom Taylor where = ""; 390842e3110ccca88661d06c733b56ead009f90b988Tom Taylor } else { 391842e3110ccca88661d06c733b56ead009f90b988Tom Taylor where = "WHERE (" + where + ")"; 392842e3110ccca88661d06c733b56ead009f90b988Tom Taylor } 393842e3110ccca88661d06c733b56ead009f90b988Tom Taylor String query = "SELECT _id FROM threads WHERE _id IN " + 394842e3110ccca88661d06c733b56ead009f90b988Tom Taylor "(SELECT DISTINCT thread_id FROM sms " + where + ")"; 395842e3110ccca88661d06c733b56ead009f90b988Tom Taylor Cursor c = db.rawQuery(query, whereArgs); 396842e3110ccca88661d06c733b56ead009f90b988Tom Taylor if (c != null) { 397842e3110ccca88661d06c733b56ead009f90b988Tom Taylor try { 398842e3110ccca88661d06c733b56ead009f90b988Tom Taylor while (c.moveToNext()) { 399842e3110ccca88661d06c733b56ead009f90b988Tom Taylor updateThread(db, c.getInt(0)); 400842e3110ccca88661d06c733b56ead009f90b988Tom Taylor } 401842e3110ccca88661d06c733b56ead009f90b988Tom Taylor } finally { 402842e3110ccca88661d06c733b56ead009f90b988Tom Taylor c.close(); 4039565e7f07472931ccefbe6804234d3543f96c9b8Tom Taylor } 4047236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 405842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // TODO: there are several db operations in this function. Lets wrap them in a 406842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // transaction to make it faster. 407842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // remove orphaned threads 408842e3110ccca88661d06c733b56ead009f90b988Tom Taylor db.delete("threads", 409842e3110ccca88661d06c733b56ead009f90b988Tom Taylor "_id NOT IN (SELECT DISTINCT thread_id FROM sms where thread_id NOT NULL " + 410842e3110ccca88661d06c733b56ead009f90b988Tom Taylor "UNION SELECT DISTINCT thread_id FROM pdu where thread_id NOT NULL)", null); 411842e3110ccca88661d06c733b56ead009f90b988Tom Taylor 412842e3110ccca88661d06c733b56ead009f90b988Tom Taylor // remove orphaned canonical_addresses 413842e3110ccca88661d06c733b56ead009f90b988Tom Taylor removeUnferencedCanonicalAddresses(db); 414842e3110ccca88661d06c733b56ead009f90b988Tom Taylor 415842e3110ccca88661d06c733b56ead009f90b988Tom Taylor db.setTransactionSuccessful(); 416842e3110ccca88661d06c733b56ead009f90b988Tom Taylor } catch (Throwable ex) { 417842e3110ccca88661d06c733b56ead009f90b988Tom Taylor Log.e(TAG, ex.getMessage(), ex); 418842e3110ccca88661d06c733b56ead009f90b988Tom Taylor } finally { 419842e3110ccca88661d06c733b56ead009f90b988Tom Taylor db.endTransaction(); 4207236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 4217236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 422f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner 4237236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project public static int deleteOneSms(SQLiteDatabase db, int message_id) { 4247236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project int thread_id = -1; 4257236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Find the thread ID that the specified SMS belongs to. 4267236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Cursor c = db.query("sms", new String[] { "thread_id" }, 4277236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "_id=" + message_id, null, null, null, null); 4287236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (c != null) { 4297236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (c.moveToFirst()) { 4307236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project thread_id = c.getInt(0); 4317236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 4327236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project c.close(); 4337236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 4347236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 4357236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Delete the specified message. 4367236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project int rows = db.delete("sms", "_id=" + message_id, null); 4377236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (thread_id > 0) { 4387236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Update its thread. 4397236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project updateThread(db, thread_id); 4407236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 4417236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return rows; 4427236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 4437236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 4447236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project @Override 4457236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project public void onCreate(SQLiteDatabase db) { 4467236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project createMmsTables(db); 4477236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project createSmsTables(db); 4487236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project createCommonTables(db); 4497236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project createCommonTriggers(db); 4507236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project createMmsTriggers(db); 4518e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner createWordsTables(db); 452a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor createIndices(db); 4538e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } 4548e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner 4558e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner // When upgrading the database we need to populate the words 4568e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner // table with the rows out of sms and part. 4578e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner private void populateWordsTable(SQLiteDatabase db) { 4588e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner final String TABLE_WORDS = "words"; 4598e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner { 4608e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner Cursor smsRows = db.query( 4618e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner "sms", 4628e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner new String[] { Sms._ID, Sms.BODY }, 4638e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner null, 4648e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner null, 4658e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner null, 4668e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner null, 4678e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner null); 4688e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner try { 4698e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner if (smsRows != null) { 4708e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner smsRows.moveToPosition(-1); 4718e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner ContentValues cv = new ContentValues(); 4728e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner while (smsRows.moveToNext()) { 4738e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner cv.clear(); 4748e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner 4758e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner long id = smsRows.getLong(0); // 0 for Sms._ID 4768e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner String body = smsRows.getString(1); // 1 for Sms.BODY 4778e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner 4788e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner cv.put(Telephony.MmsSms.WordsTable.ID, id); 4798e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner cv.put(Telephony.MmsSms.WordsTable.INDEXED_TEXT, body); 4808e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner cv.put(Telephony.MmsSms.WordsTable.SOURCE_ROW_ID, id); 4818e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner cv.put(Telephony.MmsSms.WordsTable.TABLE_ID, 1); 4828e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner db.insert(TABLE_WORDS, Telephony.MmsSms.WordsTable.INDEXED_TEXT, cv); 4838e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } 4848e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } 4858e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } finally { 4868e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner if (smsRows != null) { 4878e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner smsRows.close(); 4888e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } 4898e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } 4908e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } 4918e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner 4928e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner { 4938e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner Cursor mmsRows = db.query( 4948e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner "part", 4958e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner new String[] { Part._ID, Part.TEXT }, 4968e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner "ct = 'text/plain'", 4978e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner null, 4988e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner null, 4998e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner null, 5008e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner null); 5018e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner try { 5028e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner if (mmsRows != null) { 5038e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner mmsRows.moveToPosition(-1); 5048e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner ContentValues cv = new ContentValues(); 5058e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner while (mmsRows.moveToNext()) { 5068e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner cv.clear(); 5078e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner 5088e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner long id = mmsRows.getLong(0); // 0 for Part._ID 5098e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner String body = mmsRows.getString(1); // 1 for Part.TEXT 5108e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner 5118e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner cv.put(Telephony.MmsSms.WordsTable.ID, id); 5128e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner cv.put(Telephony.MmsSms.WordsTable.INDEXED_TEXT, body); 5138e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner cv.put(Telephony.MmsSms.WordsTable.SOURCE_ROW_ID, id); 5148e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner cv.put(Telephony.MmsSms.WordsTable.TABLE_ID, 1); 5158e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner db.insert(TABLE_WORDS, Telephony.MmsSms.WordsTable.INDEXED_TEXT, cv); 5168e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } 5178e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } 5188e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } finally { 5198e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner if (mmsRows != null) { 5208e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner mmsRows.close(); 5218e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } 5228e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } 5238e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } 5248e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } 5258e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner 5268e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner private void createWordsTables(SQLiteDatabase db) { 5278e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner try { 5288e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner db.execSQL("CREATE VIRTUAL TABLE words USING FTS3 (_id INTEGER PRIMARY KEY, index_text TEXT, source_id INTEGER, table_to_use INTEGER);"); 5298e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner 5308e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner // monitor the sms table 5318e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner // NOTE don't handle inserts using a trigger because it has an unwanted 5328e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner // side effect: the value returned for the last row ends up being the 5338e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner // id of one of the trigger insert not the original row insert. 5348e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner // Handle inserts manually in the provider. 5358e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner db.execSQL("CREATE TRIGGER sms_words_update AFTER UPDATE ON sms BEGIN UPDATE words " + 5368e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner " SET index_text = NEW.body WHERE (source_id=NEW._id AND table_to_use=1); " + 5378e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner " END;"); 5388e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner db.execSQL("CREATE TRIGGER sms_words_delete AFTER DELETE ON sms BEGIN DELETE FROM " + 5398e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner " words WHERE source_id = OLD._id AND table_to_use = 1; END;"); 5408e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner 5418e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner populateWordsTable(db); 5428e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } catch (Exception ex) { 5438e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner Log.e(TAG, "got exception creating words table: " + ex.toString()); 5448e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } 5457236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 5467236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 547a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor private void createIndices(SQLiteDatabase db) { 548a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor createThreadIdIndex(db); 549a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor } 550a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor 551a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor private void createThreadIdIndex(SQLiteDatabase db) { 552a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor try { 553a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor db.execSQL("CREATE INDEX IF NOT EXISTS typeThreadIdIndex ON sms" + 554a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor " (type, thread_id);"); 555a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor } catch (Exception ex) { 556a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor Log.e(TAG, "got exception creating indices: " + ex.toString()); 557a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor } 558a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor } 559a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor 5607236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private void createMmsTables(SQLiteDatabase db) { 5617236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // N.B.: Whenever the columns here are changed, the columns in 5627236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // {@ref MmsSmsProvider} must be changed to match. 5637236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TABLE " + MmsProvider.TABLE_PDU + " (" + 56449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 5657236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.THREAD_ID + " INTEGER," + 5667236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.DATE + " INTEGER," + 567ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert Mms.DATE_SENT + " INTEGER DEFAULT 0," + 5687236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.MESSAGE_BOX + " INTEGER," + 5697236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.READ + " INTEGER DEFAULT 0," + 5707236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.MESSAGE_ID + " TEXT," + 5717236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.SUBJECT + " TEXT," + 5727236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.SUBJECT_CHARSET + " INTEGER," + 5737236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.CONTENT_TYPE + " TEXT," + 5747236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.CONTENT_LOCATION + " TEXT," + 5757236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.EXPIRY + " INTEGER," + 5767236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.MESSAGE_CLASS + " TEXT," + 5777236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.MESSAGE_TYPE + " INTEGER," + 5787236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.MMS_VERSION + " INTEGER," + 5797236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.MESSAGE_SIZE + " INTEGER," + 5807236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.PRIORITY + " INTEGER," + 5817236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.READ_REPORT + " INTEGER," + 5827236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.REPORT_ALLOWED + " INTEGER," + 5837236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.RESPONSE_STATUS + " INTEGER," + 5847236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.STATUS + " INTEGER," + 5857236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.TRANSACTION_ID + " TEXT," + 5867236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.RETRIEVE_STATUS + " INTEGER," + 5877236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.RETRIEVE_TEXT + " TEXT," + 5887236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.RETRIEVE_TEXT_CHARSET + " INTEGER," + 5897236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.READ_STATUS + " INTEGER," + 5907236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.CONTENT_CLASS + " INTEGER," + 5917236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.RESPONSE_TEXT + " TEXT," + 5927236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Mms.DELIVERY_TIME + " INTEGER," + 593a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor Mms.DELIVERY_REPORT + " INTEGER," + 594dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang Mms.LOCKED + " INTEGER DEFAULT 0," + 59549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.SEEN + " INTEGER DEFAULT 0," + 596f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor Mms.TEXT_ONLY + " INTEGER DEFAULT 0" + 597a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor ");"); 5987236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 5997236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TABLE " + MmsProvider.TABLE_ADDR + " (" + 6007236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Addr._ID + " INTEGER PRIMARY KEY," + 6017236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Addr.MSG_ID + " INTEGER," + 6027236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Addr.CONTACT_ID + " INTEGER," + 6037236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Addr.ADDRESS + " TEXT," + 6047236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Addr.TYPE + " INTEGER," + 6057236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Addr.CHARSET + " INTEGER);"); 6067236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6077236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TABLE " + MmsProvider.TABLE_PART + " (" + 60849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Part._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 6097236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Part.MSG_ID + " INTEGER," + 6107236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Part.SEQ + " INTEGER DEFAULT 0," + 6117236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Part.CONTENT_TYPE + " TEXT," + 6127236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Part.NAME + " TEXT," + 6137236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Part.CHARSET + " INTEGER," + 6147236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Part.CONTENT_DISPOSITION + " TEXT," + 6157236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Part.FILENAME + " TEXT," + 6167236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Part.CONTENT_ID + " TEXT," + 6177236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Part.CONTENT_LOCATION + " TEXT," + 6187236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Part.CT_START + " INTEGER," + 6197236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Part.CT_TYPE + " TEXT," + 620f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner Part._DATA + " TEXT," + 621f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner Part.TEXT + " TEXT);"); 6227236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6237236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TABLE " + MmsProvider.TABLE_RATE + " (" + 6247236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Rate.SENT_TIME + " INTEGER);"); 6257236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6267236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TABLE " + MmsProvider.TABLE_DRM + " (" + 6277236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project BaseColumns._ID + " INTEGER PRIMARY KEY," + 6287236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "_data TEXT);"); 6297236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6307236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 63149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // Unlike the other trigger-creating functions, this function can be called multiple times 63249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // without harm. 6337236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private void createMmsTriggers(SQLiteDatabase db) { 6347236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Cleans up parts when a MM is deleted. 63549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS part_cleanup"); 6367236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TRIGGER part_cleanup DELETE ON " + MmsProvider.TABLE_PDU + " " + 63749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "BEGIN " + 63849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " DELETE FROM " + MmsProvider.TABLE_PART + 63949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " WHERE " + Part.MSG_ID + "=old._id;" + 64049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "END;"); 6417236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6427236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Cleans up address info when a MM is deleted. 64349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS addr_cleanup"); 6447236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TRIGGER addr_cleanup DELETE ON " + MmsProvider.TABLE_PDU + " " + 64549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "BEGIN " + 64649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " DELETE FROM " + MmsProvider.TABLE_ADDR + 64749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " WHERE " + Addr.MSG_ID + "=old._id;" + 64849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "END;"); 6497236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6507236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Delete obsolete delivery-report, read-report while deleting their 6517236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // associated Send.req. 65249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS cleanup_delivery_and_read_report"); 6537236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TRIGGER cleanup_delivery_and_read_report " + 65449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "AFTER DELETE ON " + MmsProvider.TABLE_PDU + " " + 65549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "WHEN old." + Mms.MESSAGE_TYPE + "=" + PduHeaders.MESSAGE_TYPE_SEND_REQ + " " + 65649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "BEGIN " + 65749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " DELETE FROM " + MmsProvider.TABLE_PDU + 65849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " WHERE (" + Mms.MESSAGE_TYPE + "=" + PduHeaders.MESSAGE_TYPE_DELIVERY_IND + 65949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " OR " + Mms.MESSAGE_TYPE + "=" + PduHeaders.MESSAGE_TYPE_READ_ORIG_IND + 66049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor ")" + 66149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " AND " + Mms.MESSAGE_ID + "=old." + Mms.MESSAGE_ID + "; " + 66249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "END;"); 66349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 66449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS update_threads_on_insert_part"); 6655f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project db.execSQL(PART_UPDATE_THREADS_ON_INSERT_TRIGGER); 66649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 66749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS update_threads_on_update_part"); 6682ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang db.execSQL(PART_UPDATE_THREADS_ON_UPDATE_TRIGGER); 66949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 67049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS update_threads_on_delete_part"); 6715f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project db.execSQL(PART_UPDATE_THREADS_ON_DELETE_TRIGGER); 67249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 67349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS update_threads_on_update_pdu"); 6741047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang db.execSQL(PDU_UPDATE_THREADS_ON_UPDATE_TRIGGER); 67549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 67649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // Delete pending status for a message when it is deleted. 67749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS delete_mms_pending_on_delete"); 67849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("CREATE TRIGGER delete_mms_pending_on_delete " + 67949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "AFTER DELETE ON " + MmsProvider.TABLE_PDU + " " + 68049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "BEGIN " + 68149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " DELETE FROM " + MmsSmsProvider.TABLE_PENDING_MSG + 68249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " WHERE " + PendingMessages.MSG_ID + "=old._id; " + 68349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "END;"); 68449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 68549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // When a message is moved out of Outbox, delete its pending status. 68649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS delete_mms_pending_on_update"); 68749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("CREATE TRIGGER delete_mms_pending_on_update " + 68849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "AFTER UPDATE ON " + MmsProvider.TABLE_PDU + " " + 68949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "WHEN old." + Mms.MESSAGE_BOX + "=" + Mms.MESSAGE_BOX_OUTBOX + 69049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " AND new." + Mms.MESSAGE_BOX + "!=" + Mms.MESSAGE_BOX_OUTBOX + " " + 69149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "BEGIN " + 69249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " DELETE FROM " + MmsSmsProvider.TABLE_PENDING_MSG + 69349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " WHERE " + PendingMessages.MSG_ID + "=new._id; " + 69449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "END;"); 69549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 69649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // Insert pending status for M-Notification.ind or M-ReadRec.ind 69749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // when they are inserted into Inbox/Outbox. 69849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS insert_mms_pending_on_insert"); 69949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("CREATE TRIGGER insert_mms_pending_on_insert " + 70049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "AFTER INSERT ON pdu " + 70149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "WHEN new." + Mms.MESSAGE_TYPE + "=" + PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND + 70249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " OR new." + Mms.MESSAGE_TYPE + "=" + PduHeaders.MESSAGE_TYPE_READ_REC_IND + 70349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " " + 70449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "BEGIN " + 70549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " INSERT INTO " + MmsSmsProvider.TABLE_PENDING_MSG + 70649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " (" + PendingMessages.PROTO_TYPE + "," + 70749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " " + PendingMessages.MSG_ID + "," + 70849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " " + PendingMessages.MSG_TYPE + "," + 70949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " " + PendingMessages.ERROR_TYPE + "," + 71049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " " + PendingMessages.ERROR_CODE + "," + 71149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " " + PendingMessages.RETRY_INDEX + "," + 71249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " " + PendingMessages.DUE_TIME + ") " + 71349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " VALUES " + 71449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " (" + MmsSms.MMS_PROTO + "," + 71549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " new." + BaseColumns._ID + "," + 71649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " new." + Mms.MESSAGE_TYPE + ",0,0,0,0);" + 71749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "END;"); 71849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 71949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 72049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // Insert pending status for M-Send.req when it is moved into Outbox. 72149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS insert_mms_pending_on_update"); 72249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("CREATE TRIGGER insert_mms_pending_on_update " + 72349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "AFTER UPDATE ON pdu " + 72449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "WHEN new." + Mms.MESSAGE_TYPE + "=" + PduHeaders.MESSAGE_TYPE_SEND_REQ + 72549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " AND new." + Mms.MESSAGE_BOX + "=" + Mms.MESSAGE_BOX_OUTBOX + 72649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " AND old." + Mms.MESSAGE_BOX + "!=" + Mms.MESSAGE_BOX_OUTBOX + " " + 72749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "BEGIN " + 72849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " INSERT INTO " + MmsSmsProvider.TABLE_PENDING_MSG + 72949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " (" + PendingMessages.PROTO_TYPE + "," + 73049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " " + PendingMessages.MSG_ID + "," + 73149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " " + PendingMessages.MSG_TYPE + "," + 73249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " " + PendingMessages.ERROR_TYPE + "," + 73349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " " + PendingMessages.ERROR_CODE + "," + 73449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " " + PendingMessages.RETRY_INDEX + "," + 73549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " " + PendingMessages.DUE_TIME + ") " + 73649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " VALUES " + 73749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " (" + MmsSms.MMS_PROTO + "," + 73849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " new." + BaseColumns._ID + "," + 73949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " new." + Mms.MESSAGE_TYPE + ",0,0,0,0);" + 74049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "END;"); 74149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 74249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // monitor the mms table 74349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS mms_words_update"); 74449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("CREATE TRIGGER mms_words_update AFTER UPDATE ON part BEGIN UPDATE words " + 74549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " SET index_text = NEW.text WHERE (source_id=NEW._id AND table_to_use=2); " + 74649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " END;"); 74749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 74849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS mms_words_delete"); 74949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("CREATE TRIGGER mms_words_delete AFTER DELETE ON part BEGIN DELETE FROM " + 75049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " words WHERE source_id = OLD._id AND table_to_use = 2; END;"); 75149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 75249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // Updates threads table whenever a message in pdu is updated. 75349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_date_subject_on_update"); 75449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("CREATE TRIGGER pdu_update_thread_date_subject_on_update AFTER" + 75549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " UPDATE OF " + Mms.DATE + ", " + Mms.SUBJECT + ", " + Mms.MESSAGE_BOX + 75649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " ON " + MmsProvider.TABLE_PDU + " " + 75749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor PDU_UPDATE_THREAD_CONSTRAINTS + 75849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor PDU_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE); 75949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 76049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // Update threads table whenever a message in pdu is deleted 76149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_on_delete"); 76249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("CREATE TRIGGER pdu_update_thread_on_delete " + 76349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "AFTER DELETE ON pdu " + 76449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "BEGIN " + 76549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " UPDATE threads SET " + 76649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " date = (strftime('%s','now') * 1000)" + 76749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " WHERE threads._id = old." + Mms.THREAD_ID + "; " + 76849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor UPDATE_THREAD_COUNT_ON_OLD + 76949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor UPDATE_THREAD_SNIPPET_SNIPPET_CS_ON_DELETE + 77049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "END;"); 77149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 77249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // Updates threads table whenever a message is added to pdu. 77349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_on_insert"); 77449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("CREATE TRIGGER pdu_update_thread_on_insert AFTER INSERT ON " + 77549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor MmsProvider.TABLE_PDU + " " + 77649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor PDU_UPDATE_THREAD_CONSTRAINTS + 77749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor PDU_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE); 77849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 77949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // Updates threads table whenever a message in pdu is updated. 78049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_read_on_update"); 78149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("CREATE TRIGGER pdu_update_thread_read_on_update AFTER" + 78249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " UPDATE OF " + Mms.READ + 78349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " ON " + MmsProvider.TABLE_PDU + " " + 78449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor PDU_UPDATE_THREAD_CONSTRAINTS + 78549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "BEGIN " + 78649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor PDU_UPDATE_THREAD_READ_BODY + 78749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "END;"); 78849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 78949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // Update the error flag of threads when delete pending message. 79049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS update_threads_error_on_delete_mms"); 79149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("CREATE TRIGGER update_threads_error_on_delete_mms " + 79249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " BEFORE DELETE ON pdu" + 79349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " WHEN OLD._id IN (SELECT DISTINCT msg_id" + 79449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " FROM pending_msgs" + 79549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " WHERE err_type >= 10) " + 79649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "BEGIN " + 79749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " UPDATE threads SET error = error - 1" + 79849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " WHERE _id = OLD.thread_id; " + 79949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "END;"); 80049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 80149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // Update the error flag of threads while moving an MM out of Outbox, 80249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // which was failed to be sent permanently. 80349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TRIGGER IF EXISTS update_threads_error_on_move_mms"); 80449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("CREATE TRIGGER update_threads_error_on_move_mms " + 80549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " BEFORE UPDATE OF msg_box ON pdu " + 80649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " WHEN (OLD.msg_box = 4 AND NEW.msg_box != 4) " + 80749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " AND (OLD._id IN (SELECT DISTINCT msg_id" + 80849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " FROM pending_msgs" + 80949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " WHERE err_type >= 10)) " + 81049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "BEGIN " + 81149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " UPDATE threads SET error = error - 1" + 81249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " WHERE _id = OLD.thread_id; " + 81349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor "END;"); 8147236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 8157236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 8167236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private void createSmsTables(SQLiteDatabase db) { 8177236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // N.B.: Whenever the columns here are changed, the columns in 8187236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // {@ref MmsSmsProvider} must be changed to match. 8197236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TABLE sms (" + 8207236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "_id INTEGER PRIMARY KEY," + 8217236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "thread_id INTEGER," + 8227236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "address TEXT," + 8237236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "person INTEGER," + 8247236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "date INTEGER," + 825ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert "date_sent INTEGER DEFAULT 0," + 8267236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "protocol INTEGER," + 8277236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "read INTEGER DEFAULT 0," + 8287236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "status INTEGER DEFAULT -1," + // a TP-Status value 8297236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // or -1 if it 8307236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // status hasn't 8317236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // been received 8327236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "type INTEGER," + 8337236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "reply_path_present INTEGER," + 8347236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "subject TEXT," + 8357236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "body TEXT," + 836a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor "service_center TEXT," + 8377d4e56b5fb5726342a3e0ebfba91dac48f56c107Tom Taylor "locked INTEGER DEFAULT 0," + 838dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang "error_code INTEGER DEFAULT 0," + 8398a4060ec0c2433ceeb619a3a35fba5aabedbc1c6Tom Taylor "seen INTEGER DEFAULT 0" + 840a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor ");"); 8417236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 8427236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project /** 8437236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * This table is used by the SMS dispatcher to hold 8447236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * incomplete partial messages until all the parts arrive. 8457236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project */ 8467236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TABLE raw (" + 8477236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "_id INTEGER PRIMARY KEY," + 8487236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "date INTEGER," + 8497236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "reference_number INTEGER," + // one per full message 8507236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "count INTEGER," + // the number of parts 8517236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "sequence INTEGER," + // the part number of this message 8527236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "destination_port INTEGER," + 8537236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "address TEXT," + 8547236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "pdu TEXT);"); // the raw PDU for this part 8557236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 8567236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TABLE attachments (" + 8577236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "sms_id INTEGER," + 8587236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "content_url TEXT," + 8597236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "offset INTEGER);"); 8607236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 8617236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project /** 8627236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * This table is used by the SMS dispatcher to hold pending 8637236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * delivery status report intents. 8647236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project */ 8657236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TABLE sr_pending (" + 8667236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "reference_number INTEGER," + 8677236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "action TEXT," + 8687236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "data TEXT);"); 8697236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 8707236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 8717236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private void createCommonTables(SQLiteDatabase db) { 8727236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // TODO Ensure that each entry is removed when the last use of 8737236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // any address equivalent to its address is removed. 8747236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 8757236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project /** 8767236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * This table maps the first instance seen of any particular 8777236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * MMS/SMS address to an ID, which is then used as its 8787236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * canonical representation. If the same address or an 8797236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * equivalent address (as determined by our Sqlite 8807236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * PHONE_NUMBERS_EQUAL extension) is seen later, this same ID 88109710cec4926bcd3708376face04507e661bcc02Tom Taylor * will be used. The _id is created with AUTOINCREMENT so it 88209710cec4926bcd3708376face04507e661bcc02Tom Taylor * will never be reused again if a recipient is deleted. 8837236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project */ 8847236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TABLE canonical_addresses (" + 88509710cec4926bcd3708376face04507e661bcc02Tom Taylor "_id INTEGER PRIMARY KEY AUTOINCREMENT," + 8867236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "address TEXT);"); 8877236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 8887236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project /** 8897236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * This table maps the subject and an ordered set of recipient 8907236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * IDs, separated by spaces, to a unique thread ID. The IDs 8917236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * come from the canonical_addresses table. This works 8927236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * because messages are considered to be part of the same 8937236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * thread if they have the same subject (or a null subject) 8947236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * and the same set of recipients. 8957236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project */ 8967236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TABLE threads (" + 8971ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor Threads._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 8987236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Threads.DATE + " INTEGER DEFAULT 0," + 8997236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Threads.MESSAGE_COUNT + " INTEGER DEFAULT 0," + 9007236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Threads.RECIPIENT_IDS + " TEXT," + 9017236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Threads.SNIPPET + " TEXT," + 9027236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Threads.SNIPPET_CHARSET + " INTEGER DEFAULT 0," + 9037236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Threads.READ + " INTEGER DEFAULT 1," + 9047236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Threads.TYPE + " INTEGER DEFAULT 0," + 9055f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project Threads.ERROR + " INTEGER DEFAULT 0," + 9065f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project Threads.HAS_ATTACHMENT + " INTEGER DEFAULT 0);"); 9077236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 9087236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project /** 9097236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * This table stores the queue of messages to be sent/downloaded. 9107236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project */ 9117236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TABLE " + MmsSmsProvider.TABLE_PENDING_MSG +" (" + 9127236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project PendingMessages._ID + " INTEGER PRIMARY KEY," + 9137236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project PendingMessages.PROTO_TYPE + " INTEGER," + 9147236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project PendingMessages.MSG_ID + " INTEGER," + 9157236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project PendingMessages.MSG_TYPE + " INTEGER," + 9167236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project PendingMessages.ERROR_TYPE + " INTEGER," + 9177236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project PendingMessages.ERROR_CODE + " INTEGER," + 9187236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project PendingMessages.RETRY_INDEX + " INTEGER NOT NULL DEFAULT 0," + 9197236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project PendingMessages.DUE_TIME + " INTEGER," + 9207236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project PendingMessages.LAST_TRY + " INTEGER);"); 9217236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 9227236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 9237236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 9247236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // TODO Check the query plans for these triggers. 9257236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private void createCommonTriggers(SQLiteDatabase db) { 9267236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Updates threads table whenever a message is added to sms. 9277236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TRIGGER sms_update_thread_on_insert AFTER INSERT ON sms " + 9287236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project SMS_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE); 9297236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 9307236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Updates threads table whenever a message in sms is updated. 9317236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TRIGGER sms_update_thread_date_subject_on_update AFTER" + 9327236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " UPDATE OF " + Sms.DATE + ", " + Sms.BODY + ", " + Sms.TYPE + 9337236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " ON sms " + 9347236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project SMS_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE); 9357236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 9367236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Updates threads table whenever a message in sms is updated. 9377236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TRIGGER sms_update_thread_read_on_update AFTER" + 9387236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " UPDATE OF " + Sms.READ + 9397236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " ON sms " + 9407236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "BEGIN " + 9417236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project SMS_UPDATE_THREAD_READ_BODY + 9427236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "END;"); 9437236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 944527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor // As of DATABASE_VERSION 55, we've removed these triggers that delete empty threads. 945527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor // These triggers interfere with saving drafts on brand new threads. Instead of 946527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor // triggers cleaning up empty threads, the empty threads should be cleaned up by 947527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor // an explicit call to delete with Threads.OBSOLETE_THREADS_URI. 948527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor 949527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// // When the last message in a thread is deleted, these 950527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// // triggers ensure that the entry for its thread ID is removed 951527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// // from the threads table. 952527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// db.execSQL("CREATE TRIGGER delete_obsolete_threads_pdu " + 953527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// "AFTER DELETE ON pdu " + 954527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// "BEGIN " + 955527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// " DELETE FROM threads " + 956527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// " WHERE " + 957527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// " _id = old.thread_id " + 958527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// " AND _id NOT IN " + 959527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// " (SELECT thread_id FROM sms " + 960527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// " UNION SELECT thread_id from pdu); " + 961527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// "END;"); 962527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// 963527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// db.execSQL("CREATE TRIGGER delete_obsolete_threads_when_update_pdu " + 964527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// "AFTER UPDATE OF " + Mms.THREAD_ID + " ON pdu " + 965527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// "WHEN old." + Mms.THREAD_ID + " != new." + Mms.THREAD_ID + " " + 966527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// "BEGIN " + 967527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// " DELETE FROM threads " + 968527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// " WHERE " + 969527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// " _id = old.thread_id " + 970527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// " AND _id NOT IN " + 971527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// " (SELECT thread_id FROM sms " + 972527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// " UNION SELECT thread_id from pdu); " + 973527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor// "END;"); 9747236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 9757236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // TODO Add triggers for SMS retry-status management. 9767236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 9777236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Update the error flag of threads when the error type of 9787236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // a pending MM is updated. 9797236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TRIGGER update_threads_error_on_update_mms " + 9807236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " AFTER UPDATE OF err_type ON pending_msgs " + 9817236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHEN (OLD.err_type < 10 AND NEW.err_type >= 10)" + 9827236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " OR (OLD.err_type >= 10 AND NEW.err_type < 10) " + 9837236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "BEGIN" + 9847236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " UPDATE threads SET error = " + 9857236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " CASE" + 9867236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHEN NEW.err_type >= 10 THEN error + 1" + 9877236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " ELSE error - 1" + 9887236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " END " + 9897236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE _id =" + 9907236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " (SELECT DISTINCT thread_id" + 9917236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " FROM pdu" + 9927236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE _id = NEW.msg_id); " + 9937236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "END;"); 9947236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 9957236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Update the error flag of threads after a text message was 9967236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // failed to send/receive. 9977236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TRIGGER update_threads_error_on_update_sms " + 9987236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " AFTER UPDATE OF type ON sms" + 9997236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHEN (OLD.type != 5 AND NEW.type = 5)" + 10007236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " OR (OLD.type = 5 AND NEW.type != 5) " + 10017236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "BEGIN " + 10027236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " UPDATE threads SET error = " + 10037236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " CASE" + 10047236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHEN NEW.type = 5 THEN error + 1" + 10057236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " ELSE error - 1" + 10067236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " END " + 10077236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE _id = NEW.thread_id; " + 10087236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "END;"); 10097236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 10107236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 10117236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project @Override 10127236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) { 10137236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Log.w(TAG, "Upgrading database from version " + oldVersion 10147236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project + " to " + currentVersion + "."); 10157236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 10167236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project switch (oldVersion) { 10175f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project case 40: 10185f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project if (currentVersion <= 40) { 10195f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project return; 10205f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project } 10215f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project 10225f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project db.beginTransaction(); 10235f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project try { 10245f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project upgradeDatabaseToVersion41(db); 10255f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project db.setTransactionSuccessful(); 10265f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project } catch (Throwable ex) { 10275f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project Log.e(TAG, ex.getMessage(), ex); 10285f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project break; 10295f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project } finally { 10305f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project db.endTransaction(); 10315f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project } 10325f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project // fall through 10335f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project case 41: 10345f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project if (currentVersion <= 41) { 10355f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project return; 10365f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project } 1037f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner 10385f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project db.beginTransaction(); 10395f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project try { 10405f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project upgradeDatabaseToVersion42(db); 10415f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project db.setTransactionSuccessful(); 10425f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project } catch (Throwable ex) { 10435f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project Log.e(TAG, ex.getMessage(), ex); 10445f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project break; 10455f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project } finally { 10465f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project db.endTransaction(); 10475f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project } 10485f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project // fall through 10495f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project case 42: 10505f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project if (currentVersion <= 42) { 10517236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return; 10525f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project } 1053f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner 10545f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project db.beginTransaction(); 10555f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project try { 10565f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project upgradeDatabaseToVersion43(db); 10575f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project db.setTransactionSuccessful(); 10585f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project } catch (Throwable ex) { 10595f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project Log.e(TAG, ex.getMessage(), ex); 10605f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project break; 10615f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project } finally { 10625f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project db.endTransaction(); 10635f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project } 10642ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang // fall through 10652ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang case 43: 10662ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang if (currentVersion <= 43) { 10672ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang return; 10682ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang } 10692ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang 10702ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang db.beginTransaction(); 10712ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang try { 10722ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang upgradeDatabaseToVersion44(db); 10732ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang db.setTransactionSuccessful(); 10742ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang } catch (Throwable ex) { 10752ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang Log.e(TAG, ex.getMessage(), ex); 10762ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang break; 10772ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang } finally { 10782ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang db.endTransaction(); 10792ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang } 1080ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor // fall through 1081a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor case 44: 1082a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor if (currentVersion <= 44) { 1083a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor return; 1084a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor } 1085a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor 1086a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor db.beginTransaction(); 1087a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor try { 1088a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor upgradeDatabaseToVersion45(db); 1089a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor db.setTransactionSuccessful(); 1090a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor } catch (Throwable ex) { 1091a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor Log.e(TAG, ex.getMessage(), ex); 1092a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor break; 1093a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor } finally { 1094a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor db.endTransaction(); 1095a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor } 1096ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor // fall through 1097f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner case 45: 1098f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner if (currentVersion <= 45) { 1099f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner return; 1100f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } 1101f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner db.beginTransaction(); 1102f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner try { 1103f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner upgradeDatabaseToVersion46(db); 1104f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner db.setTransactionSuccessful(); 1105f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } catch (Throwable ex) { 1106f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner Log.e(TAG, ex.getMessage(), ex); 1107f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner break; 1108f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } finally { 1109f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner db.endTransaction(); 1110f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } 11111047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang // fall through 11121047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang case 46: 11131047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang if (currentVersion <= 46) { 11141047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang return; 11151047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang } 11161047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang 11171047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang db.beginTransaction(); 11181047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang try { 11191047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang upgradeDatabaseToVersion47(db); 11201047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang db.setTransactionSuccessful(); 11211047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang } catch (Throwable ex) { 11221047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang Log.e(TAG, ex.getMessage(), ex); 11231047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang break; 11241047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang } finally { 11251047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang db.endTransaction(); 11261047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang } 1127ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor // fall through 1128ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor case 47: 1129ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor if (currentVersion <= 47) { 1130ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor return; 1131ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor } 1132ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor 1133ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor db.beginTransaction(); 1134ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor try { 1135ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor upgradeDatabaseToVersion48(db); 1136ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor db.setTransactionSuccessful(); 1137ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor } catch (Throwable ex) { 1138ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor Log.e(TAG, ex.getMessage(), ex); 1139ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor break; 1140ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor } finally { 1141ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor db.endTransaction(); 1142ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor } 1143dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang // fall through 11448e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner case 48: 11458e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner if (currentVersion <= 48) { 11468e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner return; 11478e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } 11488e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner 11498e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner db.beginTransaction(); 11508e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner try { 11517ad939ed205080002ab32d318414337fc9c3ce1fTom Taylor createWordsTables(db); 11528e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner db.setTransactionSuccessful(); 11538e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } catch (Throwable ex) { 11548e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner Log.e(TAG, ex.getMessage(), ex); 11558e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner break; 11568e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } finally { 11578e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner db.endTransaction(); 11588e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } 1159dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang // fall through 1160a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor case 49: 1161a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor if (currentVersion <= 49) { 1162a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor return; 1163a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor } 1164a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor db.beginTransaction(); 1165a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor try { 1166a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor createThreadIdIndex(db); 1167a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor db.setTransactionSuccessful(); 1168a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor } catch (Throwable ex) { 1169a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor Log.e(TAG, ex.getMessage(), ex); 1170a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor break; // force to destroy all old data; 1171a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor } finally { 1172a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor db.endTransaction(); 1173a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor } 1174dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang // fall through 1175dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang case 50: 1176dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang if (currentVersion <= 50) { 1177dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang return; 1178dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang } 11797236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 1180dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang db.beginTransaction(); 1181dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang try { 1182dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang upgradeDatabaseToVersion51(db); 1183dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang db.setTransactionSuccessful(); 1184dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang } catch (Throwable ex) { 1185dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang Log.e(TAG, ex.getMessage(), ex); 1186dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang break; 1187dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang } finally { 1188dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang db.endTransaction(); 1189dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang } 1190fc0eb2f2905477c7200eb54584d2c104cd6d1adbTom Taylor // fall through 1191fc0eb2f2905477c7200eb54584d2c104cd6d1adbTom Taylor case 51: 1192fc0eb2f2905477c7200eb54584d2c104cd6d1adbTom Taylor if (currentVersion <= 51) { 1193fc0eb2f2905477c7200eb54584d2c104cd6d1adbTom Taylor return; 1194fc0eb2f2905477c7200eb54584d2c104cd6d1adbTom Taylor } 11958a4060ec0c2433ceeb619a3a35fba5aabedbc1c6Tom Taylor // 52 was adding a new meta_data column, but that was removed. 1196fc0eb2f2905477c7200eb54584d2c104cd6d1adbTom Taylor // fall through 11971e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor case 52: 11981e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor if (currentVersion <= 52) { 11991e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor return; 12001e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor } 1201dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang 12021e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor db.beginTransaction(); 12031e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor try { 12041e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor upgradeDatabaseToVersion53(db); 12051e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor db.setTransactionSuccessful(); 12061e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor } catch (Throwable ex) { 12071e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor Log.e(TAG, ex.getMessage(), ex); 12081e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor break; 12091e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor } finally { 12101e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor db.endTransaction(); 12111e47c4888938f8abbe581707b8762d49c12b9b7aTom Taylor } 1212ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert // fall through 1213ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert case 53: 1214ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert if (currentVersion <= 53) { 1215ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert return; 1216ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert } 1217ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert 1218ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert db.beginTransaction(); 1219ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert try { 1220ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert upgradeDatabaseToVersion54(db); 1221ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert db.setTransactionSuccessful(); 1222ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert } catch (Throwable ex) { 1223ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert Log.e(TAG, ex.getMessage(), ex); 1224ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert break; 1225ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert } finally { 1226ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert db.endTransaction(); 1227ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert } 1228527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor // fall through 1229527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor case 54: 1230527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor if (currentVersion <= 54) { 1231527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor return; 1232527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor } 1233527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor 1234527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor db.beginTransaction(); 1235527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor try { 1236527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor upgradeDatabaseToVersion55(db); 1237527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor db.setTransactionSuccessful(); 1238527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor } catch (Throwable ex) { 1239527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor Log.e(TAG, ex.getMessage(), ex); 1240527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor break; 1241527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor } finally { 1242527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor db.endTransaction(); 1243527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor } 1244f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor // fall through 1245f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor case 55: 1246f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor if (currentVersion <= 55) { 1247f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor return; 1248f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor } 1249f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor 1250f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor db.beginTransaction(); 1251f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor try { 1252f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor upgradeDatabaseToVersion56(db); 1253f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor db.setTransactionSuccessful(); 1254f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor } catch (Throwable ex) { 1255f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor Log.e(TAG, ex.getMessage(), ex); 1256f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor break; 1257f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor } finally { 1258f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor db.endTransaction(); 1259f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor } 12601a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor // fall through 12611a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor case 56: 12621a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor if (currentVersion <= 56) { 12631a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor return; 12641a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor } 12651a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor 12661a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor db.beginTransaction(); 12671a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor try { 12681a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor upgradeDatabaseToVersion57(db); 12691a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor db.setTransactionSuccessful(); 12701a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor } catch (Throwable ex) { 12711a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor Log.e(TAG, ex.getMessage(), ex); 12721a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor break; 12731a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor } finally { 12741a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor db.endTransaction(); 12751a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor } 1276dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang return; 1277a6e44cb0cc7866439acba48ea18bdac9862afbdeTom Taylor } 1278f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner 12795f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project Log.e(TAG, "Destroying all old data."); 12805f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project dropAll(db); 12817236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project onCreate(db); 12827236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 12837236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 12845f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project private void dropAll(SQLiteDatabase db) { 12855f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project // Clean the database out in order to start over from scratch. 12865f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project // We don't need to drop our triggers here because SQLite automatically 12875f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project // drops a trigger when its attached database is dropped. 12887236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TABLE IF EXISTS canonical_addresses"); 12897236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TABLE IF EXISTS threads"); 12907236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TABLE IF EXISTS " + MmsSmsProvider.TABLE_PENDING_MSG); 12917236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TABLE IF EXISTS sms"); 12927236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TABLE IF EXISTS raw"); 12937236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TABLE IF EXISTS attachments"); 12947236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TABLE IF EXISTS thread_ids"); 12957236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TABLE IF EXISTS sr_pending"); 12967236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_PDU + ";"); 12977236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_ADDR + ";"); 12987236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_PART + ";"); 12997236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_RATE + ";"); 13007236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_DRM + ";"); 13017236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 13027236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 13037236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private void upgradeDatabaseToVersion41(SQLiteDatabase db) { 13047236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TRIGGER IF EXISTS update_threads_error_on_move_mms"); 13057236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("CREATE TRIGGER update_threads_error_on_move_mms " + 13067236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " BEFORE UPDATE OF msg_box ON pdu " + 13077236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHEN (OLD.msg_box = 4 AND NEW.msg_box != 4) " + 13087236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " AND (OLD._id IN (SELECT DISTINCT msg_id" + 13097236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " FROM pending_msgs" + 13107236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE err_type >= 10)) " + 13117236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "BEGIN " + 13127236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " UPDATE threads SET error = error - 1" + 13137236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " WHERE _id = OLD.thread_id; " + 13147236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "END;"); 13157236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 1316f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner 13177236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private void upgradeDatabaseToVersion42(SQLiteDatabase db) { 13187236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_on_delete"); 13197236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TRIGGER IF EXISTS delete_obsolete_threads_sms"); 13207236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.execSQL("DROP TRIGGER IF EXISTS update_threads_error_on_delete_sms"); 13217236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 1322f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner 13235f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project private void upgradeDatabaseToVersion43(SQLiteDatabase db) { 13245f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project // Add 'has_attachment' column to threads table. 13255f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project db.execSQL("ALTER TABLE threads ADD COLUMN has_attachment INTEGER DEFAULT 0"); 13265f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project 13271047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang updateThreadsAttachmentColumn(db); 13285f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project 13295f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project // Add insert and delete triggers for keeping it up to date. 13305f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project db.execSQL(PART_UPDATE_THREADS_ON_INSERT_TRIGGER); 13315f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project db.execSQL(PART_UPDATE_THREADS_ON_DELETE_TRIGGER); 13325f1e43fe6163014d8c56325daf7af364c2ff077fThe Android Open Source Project } 13332ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang 13342ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang private void upgradeDatabaseToVersion44(SQLiteDatabase db) { 13351047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang updateThreadsAttachmentColumn(db); 13362ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang 13372ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang // add the update trigger for keeping the threads up to date. 13382ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang db.execSQL(PART_UPDATE_THREADS_ON_UPDATE_TRIGGER); 13392ad5ba8b1fc7b9197b78a9c3a0039522bdbd402fWei Huang } 1340a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor 1341a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor private void upgradeDatabaseToVersion45(SQLiteDatabase db) { 1342a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor // Add 'locked' column to sms table. 1343fc0eb2f2905477c7200eb54584d2c104cd6d1adbTom Taylor db.execSQL("ALTER TABLE sms ADD COLUMN " + Sms.LOCKED + " INTEGER DEFAULT 0"); 1344a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor 1345a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor // Add 'locked' column to pdu table. 1346a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor db.execSQL("ALTER TABLE pdu ADD COLUMN " + Mms.LOCKED + " INTEGER DEFAULT 0"); 1347a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor } 1348a48a9665519f98d1e89b24d17726d7a478e575f2Tom Taylor 1349f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner private void upgradeDatabaseToVersion46(SQLiteDatabase db) { 1350f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner // add the "text" column for caching inline text (e.g. strings) instead of 1351f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner // putting them in an external file 1352f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner db.execSQL("ALTER TABLE part ADD COLUMN " + Part.TEXT + " TEXT"); 1353f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner 1354f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner Cursor textRows = db.query( 1355f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner "part", 1356f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner new String[] { Part._ID, Part._DATA, Part.TEXT}, 1357f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner "ct = 'text/plain' OR ct == 'application/smil'", 1358f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner null, 1359f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner null, 1360f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner null, 1361f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner null); 1362f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner ArrayList<String> filesToDelete = new ArrayList<String>(); 1363f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner try { 13640ebbb48f9f83ad65d738d1910a38e4fbdb920ac7Jeff Hamilton db.beginTransaction(); 1365f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner if (textRows != null) { 1366f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner int partDataColumn = textRows.getColumnIndex(Part._DATA); 1367f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner 1368f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner // This code is imperfect in that we can't guarantee that all the 1369f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner // backing files get deleted. For example if the system aborts after 1370f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner // the database is updated but before we complete the process of 1371f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner // deleting files. 1372f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner while (textRows.moveToNext()) { 1373f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner String path = textRows.getString(partDataColumn); 1374f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner if (path != null) { 1375f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner try { 1376f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner InputStream is = new FileInputStream(path); 1377f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner byte [] data = new byte[is.available()]; 1378f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner is.read(data); 1379f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner EncodedStringValue v = new EncodedStringValue(data); 13800ebbb48f9f83ad65d738d1910a38e4fbdb920ac7Jeff Hamilton db.execSQL("UPDATE part SET " + Part._DATA + " = NULL, " + 13810ebbb48f9f83ad65d738d1910a38e4fbdb920ac7Jeff Hamilton Part.TEXT + " = ?", new String[] { v.getString() }); 1382f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner is.close(); 1383f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner filesToDelete.add(path); 1384f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } catch (IOException e) { 1385f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner // TODO Auto-generated catch block 1386f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner e.printStackTrace(); 1387f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } 1388f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } 1389f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } 1390f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } 13910ebbb48f9f83ad65d738d1910a38e4fbdb920ac7Jeff Hamilton db.setTransactionSuccessful(); 1392f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } finally { 13930ebbb48f9f83ad65d738d1910a38e4fbdb920ac7Jeff Hamilton db.endTransaction(); 1394f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner for (String pathToDelete : filesToDelete) { 1395f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner try { 1396f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner (new File(pathToDelete)).delete(); 1397f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } catch (SecurityException ex) { 1398f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner Log.e(TAG, "unable to clean up old mms file for " + pathToDelete, ex); 1399f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } 1400f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } 1401f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner if (textRows != null) { 1402f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner textRows.close(); 1403f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } 1404f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } 1405f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } 14061047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang 14071047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang private void upgradeDatabaseToVersion47(SQLiteDatabase db) { 14081047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang updateThreadsAttachmentColumn(db); 14091047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang 14101047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang // add the update trigger for keeping the threads up to date. 14111047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang db.execSQL(PDU_UPDATE_THREADS_ON_UPDATE_TRIGGER); 14121047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang } 14131047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang 1414ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor private void upgradeDatabaseToVersion48(SQLiteDatabase db) { 1415ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor // Add 'error_code' column to sms table. 1416ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor db.execSQL("ALTER TABLE sms ADD COLUMN error_code INTEGER DEFAULT 0"); 1417ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor } 1418ddf267c20a697f66b8238538fb6ad31507724692Tom Taylor 1419dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang private void upgradeDatabaseToVersion51(SQLiteDatabase db) { 1420dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang db.execSQL("ALTER TABLE sms add COLUMN seen INTEGER DEFAULT 0"); 1421dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang db.execSQL("ALTER TABLE pdu add COLUMN seen INTEGER DEFAULT 0"); 1422a882662df39eb5af84cc386fc09df4636166f48fWei Huang 1423a882662df39eb5af84cc386fc09df4636166f48fWei Huang try { 1424a882662df39eb5af84cc386fc09df4636166f48fWei Huang // update the existing sms and pdu tables so the new "seen" column is the same as 1425a882662df39eb5af84cc386fc09df4636166f48fWei Huang // the "read" column for each row. 1426a882662df39eb5af84cc386fc09df4636166f48fWei Huang ContentValues contentValues = new ContentValues(); 1427a882662df39eb5af84cc386fc09df4636166f48fWei Huang contentValues.put("seen", 1); 1428a882662df39eb5af84cc386fc09df4636166f48fWei Huang int count = db.update("sms", contentValues, "read=1", null); 1429a882662df39eb5af84cc386fc09df4636166f48fWei Huang Log.d(TAG, "[MmsSmsDb] upgradeDatabaseToVersion51: updated " + count + 1430a882662df39eb5af84cc386fc09df4636166f48fWei Huang " rows in sms table to have READ=1"); 1431a882662df39eb5af84cc386fc09df4636166f48fWei Huang count = db.update("pdu", contentValues, "read=1", null); 1432a882662df39eb5af84cc386fc09df4636166f48fWei Huang Log.d(TAG, "[MmsSmsDb] upgradeDatabaseToVersion51: updated " + count + 1433a882662df39eb5af84cc386fc09df4636166f48fWei Huang " rows in pdu table to have READ=1"); 1434a882662df39eb5af84cc386fc09df4636166f48fWei Huang } catch (Exception ex) { 1435a882662df39eb5af84cc386fc09df4636166f48fWei Huang Log.e(TAG, "[MmsSmsDb] upgradeDatabaseToVersion51 caught ", ex); 1436a882662df39eb5af84cc386fc09df4636166f48fWei Huang } 1437dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang } 1438dfac57630db2993a1cda15ee4fb697ea1baadb0bWei Huang 1439ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert private void upgradeDatabaseToVersion53(SQLiteDatabase db) { 1440ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_read_on_update"); 1441ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert 1442ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert // Updates threads table whenever a message in pdu is updated. 1443ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert db.execSQL("CREATE TRIGGER pdu_update_thread_read_on_update AFTER" + 1444ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert " UPDATE OF " + Mms.READ + 1445ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert " ON " + MmsProvider.TABLE_PDU + " " + 1446ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert PDU_UPDATE_THREAD_CONSTRAINTS + 1447ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert "BEGIN " + 1448ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert PDU_UPDATE_THREAD_READ_BODY + 1449ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert "END;"); 1450ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert } 1451ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert 1452ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert private void upgradeDatabaseToVersion54(SQLiteDatabase db) { 1453ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert // Add 'date_sent' column to sms table. 1454ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert db.execSQL("ALTER TABLE sms ADD COLUMN " + Sms.DATE_SENT + " INTEGER DEFAULT 0"); 1455ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert 1456ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert // Add 'date_sent' column to pdu table. 1457ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert db.execSQL("ALTER TABLE pdu ADD COLUMN " + Mms.DATE_SENT + " INTEGER DEFAULT 0"); 1458ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert } 1459ea5c40c18a83bd984da79ecda301bd5a7cd9daa1Fredrik Roubert 1460527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor private void upgradeDatabaseToVersion55(SQLiteDatabase db) { 1461527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor // Drop removed triggers 1462527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor db.execSQL("DROP TRIGGER IF EXISTS delete_obsolete_threads_pdu"); 1463527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor db.execSQL("DROP TRIGGER IF EXISTS delete_obsolete_threads_when_update_pdu"); 1464527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor } 1465527fcced9fe9cf8525e33ffb098fd28650af24afTom Taylor 1466f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor private void upgradeDatabaseToVersion56(SQLiteDatabase db) { 1467f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor // Add 'text_only' column to pdu table. 1468f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor db.execSQL("ALTER TABLE " + MmsProvider.TABLE_PDU + " ADD COLUMN " + Mms.TEXT_ONLY + 1469f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor " INTEGER DEFAULT 0"); 1470f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor } 1471f88d1d6733158144e9e0c87f29b446068edf0507Tom Taylor 14721a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor private void upgradeDatabaseToVersion57(SQLiteDatabase db) { 14731a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor // Clear out bad rows, those with empty threadIds, from the pdu table. 14741a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor db.execSQL("DELETE FROM " + MmsProvider.TABLE_PDU + " WHERE " + Mms.THREAD_ID + " IS NULL"); 14751a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor } 14761a45ce5c6e417fee13c55221a97c3d36b4bea846Tom Taylor 14771ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor @Override 14781ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor public synchronized SQLiteDatabase getWritableDatabase() { 14791ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor SQLiteDatabase db = super.getWritableDatabase(); 14801ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor 148110faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor if (!sTriedAutoIncrement) { 148210faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor sTriedAutoIncrement = true; 148309710cec4926bcd3708376face04507e661bcc02Tom Taylor boolean hasAutoIncrementThreads = hasAutoIncrement(db, "threads"); 148409710cec4926bcd3708376face04507e661bcc02Tom Taylor boolean hasAutoIncrementAddresses = hasAutoIncrement(db, "canonical_addresses"); 148549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor boolean hasAutoIncrementPart = hasAutoIncrement(db, "part"); 148649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor boolean hasAutoIncrementPdu = hasAutoIncrement(db, "pdu"); 148709710cec4926bcd3708376face04507e661bcc02Tom Taylor Log.d(TAG, "[getWritableDatabase] hasAutoIncrementThreads: " + hasAutoIncrementThreads + 148849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " hasAutoIncrementAddresses: " + hasAutoIncrementAddresses + 148949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " hasAutoIncrementPart: " + hasAutoIncrementPart + 149049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " hasAutoIncrementPdu: " + hasAutoIncrementPdu); 149109710cec4926bcd3708376face04507e661bcc02Tom Taylor boolean autoIncrementThreadsSuccess = true; 149209710cec4926bcd3708376face04507e661bcc02Tom Taylor boolean autoIncrementAddressesSuccess = true; 149349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor boolean autoIncrementPartSuccess = true; 149449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor boolean autoIncrementPduSuccess = true; 149509710cec4926bcd3708376face04507e661bcc02Tom Taylor if (!hasAutoIncrementThreads) { 14961ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor db.beginTransaction(); 14971ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor try { 149810faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor if (false && sFakeLowStorageTest) { 149910faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor Log.d(TAG, "[getWritableDatabase] mFakeLowStorageTest is true " + 150010faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor " - fake exception"); 150110faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor throw new Exception("FakeLowStorageTest"); 150210faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor } 150309710cec4926bcd3708376face04507e661bcc02Tom Taylor upgradeThreadsTableToAutoIncrement(db); // a no-op if already upgraded 15041ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor db.setTransactionSuccessful(); 15051ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor } catch (Throwable ex) { 150609710cec4926bcd3708376face04507e661bcc02Tom Taylor Log.e(TAG, "Failed to add autoIncrement to threads;: " + ex.getMessage(), ex); 150709710cec4926bcd3708376face04507e661bcc02Tom Taylor autoIncrementThreadsSuccess = false; 150809710cec4926bcd3708376face04507e661bcc02Tom Taylor } finally { 150909710cec4926bcd3708376face04507e661bcc02Tom Taylor db.endTransaction(); 151009710cec4926bcd3708376face04507e661bcc02Tom Taylor } 151109710cec4926bcd3708376face04507e661bcc02Tom Taylor } 151209710cec4926bcd3708376face04507e661bcc02Tom Taylor if (!hasAutoIncrementAddresses) { 151309710cec4926bcd3708376face04507e661bcc02Tom Taylor db.beginTransaction(); 151409710cec4926bcd3708376face04507e661bcc02Tom Taylor try { 151509710cec4926bcd3708376face04507e661bcc02Tom Taylor if (false && sFakeLowStorageTest) { 151609710cec4926bcd3708376face04507e661bcc02Tom Taylor Log.d(TAG, "[getWritableDatabase] mFakeLowStorageTest is true " + 151709710cec4926bcd3708376face04507e661bcc02Tom Taylor " - fake exception"); 151809710cec4926bcd3708376face04507e661bcc02Tom Taylor throw new Exception("FakeLowStorageTest"); 151910faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor } 152009710cec4926bcd3708376face04507e661bcc02Tom Taylor upgradeAddressTableToAutoIncrement(db); // a no-op if already upgraded 152109710cec4926bcd3708376face04507e661bcc02Tom Taylor db.setTransactionSuccessful(); 152209710cec4926bcd3708376face04507e661bcc02Tom Taylor } catch (Throwable ex) { 152309710cec4926bcd3708376face04507e661bcc02Tom Taylor Log.e(TAG, "Failed to add autoIncrement to canonical_addresses: " + 152409710cec4926bcd3708376face04507e661bcc02Tom Taylor ex.getMessage(), ex); 152509710cec4926bcd3708376face04507e661bcc02Tom Taylor autoIncrementAddressesSuccess = false; 15261ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor } finally { 15271ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor db.endTransaction(); 15281ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor } 15291ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor } 153049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor if (!hasAutoIncrementPart) { 153149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.beginTransaction(); 153249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor try { 153349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor if (false && sFakeLowStorageTest) { 153449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Log.d(TAG, "[getWritableDatabase] mFakeLowStorageTest is true " + 153549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " - fake exception"); 153649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor throw new Exception("FakeLowStorageTest"); 153749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor } 153849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor upgradePartTableToAutoIncrement(db); // a no-op if already upgraded 153949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.setTransactionSuccessful(); 154049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor } catch (Throwable ex) { 154149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Log.e(TAG, "Failed to add autoIncrement to part: " + 154249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor ex.getMessage(), ex); 154349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor autoIncrementPartSuccess = false; 154449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor } finally { 154549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.endTransaction(); 154649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor } 154749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor } 154849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor if (!hasAutoIncrementPdu) { 154949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.beginTransaction(); 155049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor try { 155149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor if (false && sFakeLowStorageTest) { 155249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Log.d(TAG, "[getWritableDatabase] mFakeLowStorageTest is true " + 155349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor " - fake exception"); 155449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor throw new Exception("FakeLowStorageTest"); 155549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor } 155649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor upgradePduTableToAutoIncrement(db); // a no-op if already upgraded 155749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.setTransactionSuccessful(); 155849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor } catch (Throwable ex) { 155949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Log.e(TAG, "Failed to add autoIncrement to pdu: " + 156049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor ex.getMessage(), ex); 156149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor autoIncrementPduSuccess = false; 156249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor } finally { 156349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.endTransaction(); 156449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor } 156549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor } 156649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor if (autoIncrementThreadsSuccess && 156749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor autoIncrementAddressesSuccess && 156849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor autoIncrementPartSuccess && 156949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor autoIncrementPduSuccess) { 157009710cec4926bcd3708376face04507e661bcc02Tom Taylor if (mLowStorageMonitor != null) { 157109710cec4926bcd3708376face04507e661bcc02Tom Taylor // We've already updated the database. This receiver is no longer necessary. 157209710cec4926bcd3708376face04507e661bcc02Tom Taylor Log.d(TAG, "Unregistering mLowStorageMonitor - we've upgraded"); 157309710cec4926bcd3708376face04507e661bcc02Tom Taylor mContext.unregisterReceiver(mLowStorageMonitor); 157409710cec4926bcd3708376face04507e661bcc02Tom Taylor mLowStorageMonitor = null; 157509710cec4926bcd3708376face04507e661bcc02Tom Taylor } 157609710cec4926bcd3708376face04507e661bcc02Tom Taylor } else { 157709710cec4926bcd3708376face04507e661bcc02Tom Taylor if (sFakeLowStorageTest) { 157809710cec4926bcd3708376face04507e661bcc02Tom Taylor sFakeLowStorageTest = false; 157909710cec4926bcd3708376face04507e661bcc02Tom Taylor } 158009710cec4926bcd3708376face04507e661bcc02Tom Taylor 158109710cec4926bcd3708376face04507e661bcc02Tom Taylor // We failed, perhaps because of low storage. Turn on a receiver to watch for 158209710cec4926bcd3708376face04507e661bcc02Tom Taylor // storage space. 158309710cec4926bcd3708376face04507e661bcc02Tom Taylor if (mLowStorageMonitor == null) { 158409710cec4926bcd3708376face04507e661bcc02Tom Taylor Log.d(TAG, "[getWritableDatabase] turning on storage monitor"); 158509710cec4926bcd3708376face04507e661bcc02Tom Taylor mLowStorageMonitor = new LowStorageMonitor(); 158609710cec4926bcd3708376face04507e661bcc02Tom Taylor IntentFilter intentFilter = new IntentFilter(); 158709710cec4926bcd3708376face04507e661bcc02Tom Taylor intentFilter.addAction(Intent.ACTION_DEVICE_STORAGE_LOW); 158809710cec4926bcd3708376face04507e661bcc02Tom Taylor intentFilter.addAction(Intent.ACTION_DEVICE_STORAGE_OK); 158909710cec4926bcd3708376face04507e661bcc02Tom Taylor mContext.registerReceiver(mLowStorageMonitor, intentFilter); 159009710cec4926bcd3708376face04507e661bcc02Tom Taylor } 159109710cec4926bcd3708376face04507e661bcc02Tom Taylor } 15921ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor } 15931ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor return db; 15941ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor } 15951ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor 159609710cec4926bcd3708376face04507e661bcc02Tom Taylor // Determine whether a particular table has AUTOINCREMENT in its schema. 159709710cec4926bcd3708376face04507e661bcc02Tom Taylor private boolean hasAutoIncrement(SQLiteDatabase db, String tableName) { 15981ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor boolean result = false; 159909710cec4926bcd3708376face04507e661bcc02Tom Taylor String query = "SELECT sql FROM sqlite_master WHERE type='table' AND name='" + 160009710cec4926bcd3708376face04507e661bcc02Tom Taylor tableName + "'"; 16011ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor Cursor c = db.rawQuery(query, null); 16021ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor if (c != null) { 16031ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor try { 16041ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor if (c.moveToFirst()) { 16051ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor String schema = c.getString(0); 16061ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor result = schema != null ? schema.contains("AUTOINCREMENT") : false; 160709710cec4926bcd3708376face04507e661bcc02Tom Taylor Log.d(TAG, "[MmsSmsDb] tableName: " + tableName + " hasAutoIncrement: " + 160809710cec4926bcd3708376face04507e661bcc02Tom Taylor schema + " result: " + result); 16091ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor } 16101ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor } finally { 16111ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor c.close(); 16121ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor } 16131ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor } 16141ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor return result; 16151ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor } 16161ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor 16171ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor // upgradeThreadsTableToAutoIncrement() is called to add the AUTOINCREMENT keyword to 16181ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor // the threads table. This could fail if the user has a lot of conversations and not enough 16191ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor // storage to make a copy of the threads table. That's ok. This upgrade is optional. It'll 16201ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor // be called again next time the device is rebooted. 16211ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor private void upgradeThreadsTableToAutoIncrement(SQLiteDatabase db) { 162209710cec4926bcd3708376face04507e661bcc02Tom Taylor if (hasAutoIncrement(db, "threads")) { 16231ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor Log.d(TAG, "[MmsSmsDb] upgradeThreadsTableToAutoIncrement: already upgraded"); 16241ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor return; 16251ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor } 16261ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor Log.d(TAG, "[MmsSmsDb] upgradeThreadsTableToAutoIncrement: upgrading"); 16271ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor 16281ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor // Make the _id of the threads table autoincrement so we never re-use thread ids 16291ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor // Have to create a new temp threads table. Copy all the info from the old table. 16301ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor // Drop the old table and rename the new table to that of the old. 16311ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor db.execSQL("CREATE TABLE threads_temp (" + 16321ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor Threads._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 16331ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor Threads.DATE + " INTEGER DEFAULT 0," + 16341ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor Threads.MESSAGE_COUNT + " INTEGER DEFAULT 0," + 16351ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor Threads.RECIPIENT_IDS + " TEXT," + 16361ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor Threads.SNIPPET + " TEXT," + 16371ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor Threads.SNIPPET_CHARSET + " INTEGER DEFAULT 0," + 16381ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor Threads.READ + " INTEGER DEFAULT 1," + 16391ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor Threads.TYPE + " INTEGER DEFAULT 0," + 16401ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor Threads.ERROR + " INTEGER DEFAULT 0," + 16411ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor Threads.HAS_ATTACHMENT + " INTEGER DEFAULT 0);"); 16421ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor 16431ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor db.execSQL("INSERT INTO threads_temp SELECT * from threads;"); 16441ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor db.execSQL("DROP TABLE threads;"); 16451ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor db.execSQL("ALTER TABLE threads_temp RENAME TO threads;"); 16461ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor } 16471ab4800f1598cae72846ae4d24d6c545a5965d97Tom Taylor 164809710cec4926bcd3708376face04507e661bcc02Tom Taylor // upgradeAddressTableToAutoIncrement() is called to add the AUTOINCREMENT keyword to 164909710cec4926bcd3708376face04507e661bcc02Tom Taylor // the canonical_addresses table. This could fail if the user has a lot of people they've 165009710cec4926bcd3708376face04507e661bcc02Tom Taylor // messaged with and not enough storage to make a copy of the canonical_addresses table. 165109710cec4926bcd3708376face04507e661bcc02Tom Taylor // That's ok. This upgrade is optional. It'll be called again next time the device is rebooted. 165209710cec4926bcd3708376face04507e661bcc02Tom Taylor private void upgradeAddressTableToAutoIncrement(SQLiteDatabase db) { 165309710cec4926bcd3708376face04507e661bcc02Tom Taylor if (hasAutoIncrement(db, "canonical_addresses")) { 165409710cec4926bcd3708376face04507e661bcc02Tom Taylor Log.d(TAG, "[MmsSmsDb] upgradeAddressTableToAutoIncrement: already upgraded"); 165509710cec4926bcd3708376face04507e661bcc02Tom Taylor return; 165609710cec4926bcd3708376face04507e661bcc02Tom Taylor } 165709710cec4926bcd3708376face04507e661bcc02Tom Taylor Log.d(TAG, "[MmsSmsDb] upgradeAddressTableToAutoIncrement: upgrading"); 165809710cec4926bcd3708376face04507e661bcc02Tom Taylor 165909710cec4926bcd3708376face04507e661bcc02Tom Taylor // Make the _id of the canonical_addresses table autoincrement so we never re-use ids 166009710cec4926bcd3708376face04507e661bcc02Tom Taylor // Have to create a new temp canonical_addresses table. Copy all the info from the old 166109710cec4926bcd3708376face04507e661bcc02Tom Taylor // table. Drop the old table and rename the new table to that of the old. 166209710cec4926bcd3708376face04507e661bcc02Tom Taylor db.execSQL("CREATE TABLE canonical_addresses_temp (_id INTEGER PRIMARY KEY AUTOINCREMENT," + 166309710cec4926bcd3708376face04507e661bcc02Tom Taylor "address TEXT);"); 166409710cec4926bcd3708376face04507e661bcc02Tom Taylor 166509710cec4926bcd3708376face04507e661bcc02Tom Taylor db.execSQL("INSERT INTO canonical_addresses_temp SELECT * from canonical_addresses;"); 166609710cec4926bcd3708376face04507e661bcc02Tom Taylor db.execSQL("DROP TABLE canonical_addresses;"); 166709710cec4926bcd3708376face04507e661bcc02Tom Taylor db.execSQL("ALTER TABLE canonical_addresses_temp RENAME TO canonical_addresses;"); 166809710cec4926bcd3708376face04507e661bcc02Tom Taylor } 166909710cec4926bcd3708376face04507e661bcc02Tom Taylor 167049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // upgradePartTableToAutoIncrement() is called to add the AUTOINCREMENT keyword to 167149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // the part table. This could fail if the user has a lot of sound/video/picture attachments 167249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // and not enough storage to make a copy of the part table. 167349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // That's ok. This upgrade is optional. It'll be called again next time the device is rebooted. 167449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor private void upgradePartTableToAutoIncrement(SQLiteDatabase db) { 167549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor if (hasAutoIncrement(db, "part")) { 167649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Log.d(TAG, "[MmsSmsDb] upgradePartTableToAutoIncrement: already upgraded"); 167749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor return; 167849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor } 167949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Log.d(TAG, "[MmsSmsDb] upgradePartTableToAutoIncrement: upgrading"); 168049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 168149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // Make the _id of the part table autoincrement so we never re-use ids 168249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // Have to create a new temp part table. Copy all the info from the old 168349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // table. Drop the old table and rename the new table to that of the old. 168449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("CREATE TABLE part_temp (" + 168549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Part._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 168649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Part.MSG_ID + " INTEGER," + 168749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Part.SEQ + " INTEGER DEFAULT 0," + 168849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Part.CONTENT_TYPE + " TEXT," + 168949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Part.NAME + " TEXT," + 169049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Part.CHARSET + " INTEGER," + 169149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Part.CONTENT_DISPOSITION + " TEXT," + 169249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Part.FILENAME + " TEXT," + 169349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Part.CONTENT_ID + " TEXT," + 169449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Part.CONTENT_LOCATION + " TEXT," + 169549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Part.CT_START + " INTEGER," + 169649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Part.CT_TYPE + " TEXT," + 169749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Part._DATA + " TEXT," + 169849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Part.TEXT + " TEXT);"); 169949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 170049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("INSERT INTO part_temp SELECT * from part;"); 170149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TABLE part;"); 170249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("ALTER TABLE part_temp RENAME TO part;"); 170349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 170449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // part-related triggers get tossed when the part table is dropped -- rebuild them. 170549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor createMmsTriggers(db); 170649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor } 170749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 170849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // upgradePduTableToAutoIncrement() is called to add the AUTOINCREMENT keyword to 170949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // the pdu table. This could fail if the user has a lot of mms messages 171049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // and not enough storage to make a copy of the pdu table. 171149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // That's ok. This upgrade is optional. It'll be called again next time the device is rebooted. 171249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor private void upgradePduTableToAutoIncrement(SQLiteDatabase db) { 171349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor if (hasAutoIncrement(db, "pdu")) { 171449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Log.d(TAG, "[MmsSmsDb] upgradePduTableToAutoIncrement: already upgraded"); 171549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor return; 171649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor } 171749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Log.d(TAG, "[MmsSmsDb] upgradePduTableToAutoIncrement: upgrading"); 171849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 171949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // Make the _id of the part table autoincrement so we never re-use ids 172049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // Have to create a new temp part table. Copy all the info from the old 172149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // table. Drop the old table and rename the new table to that of the old. 172249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("CREATE TABLE pdu_temp (" + 172349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 172449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.THREAD_ID + " INTEGER," + 172549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.DATE + " INTEGER," + 172649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.DATE_SENT + " INTEGER DEFAULT 0," + 172749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.MESSAGE_BOX + " INTEGER," + 172849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.READ + " INTEGER DEFAULT 0," + 172949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.MESSAGE_ID + " TEXT," + 173049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.SUBJECT + " TEXT," + 173149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.SUBJECT_CHARSET + " INTEGER," + 173249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.CONTENT_TYPE + " TEXT," + 173349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.CONTENT_LOCATION + " TEXT," + 173449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.EXPIRY + " INTEGER," + 173549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.MESSAGE_CLASS + " TEXT," + 173649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.MESSAGE_TYPE + " INTEGER," + 173749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.MMS_VERSION + " INTEGER," + 173849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.MESSAGE_SIZE + " INTEGER," + 173949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.PRIORITY + " INTEGER," + 174049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.READ_REPORT + " INTEGER," + 174149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.REPORT_ALLOWED + " INTEGER," + 174249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.RESPONSE_STATUS + " INTEGER," + 174349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.STATUS + " INTEGER," + 174449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.TRANSACTION_ID + " TEXT," + 174549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.RETRIEVE_STATUS + " INTEGER," + 174649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.RETRIEVE_TEXT + " TEXT," + 174749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.RETRIEVE_TEXT_CHARSET + " INTEGER," + 174849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.READ_STATUS + " INTEGER," + 174949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.CONTENT_CLASS + " INTEGER," + 175049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.RESPONSE_TEXT + " TEXT," + 175149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.DELIVERY_TIME + " INTEGER," + 175249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.DELIVERY_REPORT + " INTEGER," + 175349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.LOCKED + " INTEGER DEFAULT 0," + 175449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.SEEN + " INTEGER DEFAULT 0," + 175549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor Mms.TEXT_ONLY + " INTEGER DEFAULT 0" + 175649c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor ");"); 175749c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 175849c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("INSERT INTO pdu_temp SELECT * from pdu;"); 175949c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("DROP TABLE pdu;"); 176049c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor db.execSQL("ALTER TABLE pdu_temp RENAME TO pdu;"); 176149c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 176249c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor // pdu-related triggers get tossed when the part table is dropped -- rebuild them. 176349c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor createMmsTriggers(db); 176449c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor } 176549c9ede3206cf2b9504cb9d06deeea8fd856900cTom Taylor 176610faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor private class LowStorageMonitor extends BroadcastReceiver { 176710faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor 176810faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor public LowStorageMonitor() { 176910faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor } 177010faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor 177110faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor public void onReceive(Context context, Intent intent) { 177210faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor String action = intent.getAction(); 177310faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor 177410faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor Log.d(TAG, "[LowStorageMonitor] onReceive intent " + action); 177510faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor 177610faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor if (Intent.ACTION_DEVICE_STORAGE_OK.equals(action)) { 177710faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor sTriedAutoIncrement = false; // try to upgrade on the next getWriteableDatabase 177810faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor } 177910faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor } 178010faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor } 178110faf3f5f0c16a812c25f02d208715fabc556a7dTom Taylor 17821047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang private void updateThreadsAttachmentColumn(SQLiteDatabase db) { 17831047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang // Set the values of that column correctly based on the current 17841047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang // contents of the database. 17851047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang db.execSQL("UPDATE threads SET has_attachment=1 WHERE _id IN " + 17861047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang " (SELECT DISTINCT pdu.thread_id FROM part " + 17871047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang " JOIN pdu ON pdu._id=part.mid " + 17881047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang " WHERE part.ct != 'text/plain' AND part.ct != 'application/smil')"); 17891047ab43a2bcdad9b8e8cf27afabe40ab8608b3dWei Huang } 17907236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project} 1791