17236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project/* 27236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * Copyright (C) 2007 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 19f27792fb80c6f533a250ec75867c9f2351ff9f04Dianne Hackbornimport android.app.AppOpsManager; 207236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.content.ContentProvider; 217236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.content.ContentValues; 227236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.content.Context; 237236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.content.Intent; 247236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.content.UriMatcher; 257236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.database.Cursor; 267236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.database.sqlite.SQLiteDatabase; 273ad9da40b96f27bd441dae1e78a3b7061d4999e3Tom Taylorimport android.database.sqlite.SQLiteException; 287236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.database.sqlite.SQLiteOpenHelper; 297236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.database.sqlite.SQLiteQueryBuilder; 307236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.net.Uri; 31c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylorimport android.os.FileUtils; 327236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.os.ParcelFileDescriptor; 3343f9fb234aabe569b342af78bdaf85effbd85f10Amith Yamasaniimport android.os.UserHandle; 347236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.provider.BaseColumns; 358e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagnerimport android.provider.Telephony; 3621c25bcedfc36ff1ebe6082eef2fb4076fe636acYusuf T. Mobileimport android.provider.Telephony.CanonicalAddressesColumns; 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.Mms.Addr; 407236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.provider.Telephony.Mms.Part; 417236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.provider.Telephony.Mms.Rate; 427236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.text.TextUtils; 437236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport android.util.Log; 447236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 45b1bae65bf18dc22762cf7b8210fdad836b3e4ee5Tom Taylorimport com.google.android.mms.pdu.PduHeaders; 46c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylorimport com.google.android.mms.util.DownloadDrmHelper; 47c71e770495e0b4597b4b3d947cbc68a0d35051beTom Taylor 487236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport java.io.File; 497236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport java.io.FileNotFoundException; 507236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectimport java.io.IOException; 5143f9fb234aabe569b342af78bdaf85effbd85f10Amith Yamasani 5221c25bcedfc36ff1ebe6082eef2fb4076fe636acYusuf T. Mobileimport android.provider.Telephony.Threads; 537236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 547236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project/** 557236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * The class to provide base facility to access MMS related content, 567236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project * which is stored in a SQLite database and in the file system. 577236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project */ 587236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Projectpublic class MmsProvider extends ContentProvider { 597236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project static final String TABLE_PDU = "pdu"; 607236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project static final String TABLE_ADDR = "addr"; 617236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project static final String TABLE_PART = "part"; 627236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project static final String TABLE_RATE = "rate"; 637236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project static final String TABLE_DRM = "drm"; 648e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner static final String TABLE_WORDS = "words"; 657236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 66c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor 677236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project @Override 687236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project public boolean onCreate() { 69b2ce2d37bc6efc0c37d8cee925d3ad65a01ea4bfYe Wen setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_WRITE_SMS); 70b2ce2d37bc6efc0c37d8cee925d3ad65a01ea4bfYe Wen mOpenHelper = MmsSmsDatabaseHelper.getInstance(getContext()); 717236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return true; 727236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 737236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 747236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project @Override 757236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project public Cursor query(Uri uri, String[] projection, 767236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project String selection, String[] selectionArgs, String sortOrder) { 777236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 787236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 797236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Generate the body of the query. 807236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project int match = sURLMatcher.match(uri); 817236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (LOCAL_LOGV) { 827236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Log.v(TAG, "Query uri=" + uri + ", match=" + match); 837236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 847236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 857236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project switch (match) { 867236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_ALL: 877236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project constructQueryForBox(qb, Mms.MESSAGE_BOX_ALL); 887236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 897236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_INBOX: 907236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project constructQueryForBox(qb, Mms.MESSAGE_BOX_INBOX); 917236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 927236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_SENT: 937236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project constructQueryForBox(qb, Mms.MESSAGE_BOX_SENT); 947236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 957236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_DRAFTS: 967236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project constructQueryForBox(qb, Mms.MESSAGE_BOX_DRAFTS); 977236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 987236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_OUTBOX: 997236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project constructQueryForBox(qb, Mms.MESSAGE_BOX_OUTBOX); 1007236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 1017236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_ALL_ID: 1027236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.setTables(TABLE_PDU); 1037236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.appendWhere(Mms._ID + "=" + uri.getPathSegments().get(0)); 1047236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 1057236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_INBOX_ID: 1067236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_SENT_ID: 1077236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_DRAFTS_ID: 1087236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_OUTBOX_ID: 1097236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.setTables(TABLE_PDU); 1107236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.appendWhere(Mms._ID + "=" + uri.getPathSegments().get(1)); 1117236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.appendWhere(" AND " + Mms.MESSAGE_BOX + "=" 1127236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project + getMessageBoxByMatch(match)); 1137236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 1147236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_ALL_PART: 1157236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.setTables(TABLE_PART); 1167236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 1177236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_MSG_PART: 1187236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.setTables(TABLE_PART); 1197236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.appendWhere(Part.MSG_ID + "=" + uri.getPathSegments().get(0)); 1207236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 1217236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_PART_ID: 1227236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.setTables(TABLE_PART); 1237236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.appendWhere(Part._ID + "=" + uri.getPathSegments().get(1)); 1247236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 1257236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_MSG_ADDR: 1267236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.setTables(TABLE_ADDR); 1277236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.appendWhere(Addr.MSG_ID + "=" + uri.getPathSegments().get(0)); 1287236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 1297236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_REPORT_STATUS: 1307236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project /* 1317236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project SELECT DISTINCT address, 1327236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project T.delivery_status AS delivery_status, 1337236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project T.read_status AS read_status 1347236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project FROM addr 1357236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project INNER JOIN (SELECT P1._id AS id1, P2._id AS id2, P3._id AS id3, 1367236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project ifnull(P2.st, 0) AS delivery_status, 1377236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project ifnull(P3.read_status, 0) AS read_status 1387236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project FROM pdu P1 1397236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project INNER JOIN pdu P2 1407236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project ON P1.m_id = P2.m_id AND P2.m_type = 134 1417236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project LEFT JOIN pdu P3 1427236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project ON P1.m_id = P3.m_id AND P3.m_type = 136 1437236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project UNION 1447236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project SELECT P1._id AS id1, P2._id AS id2, P3._id AS id3, 1457236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project ifnull(P2.st, 0) AS delivery_status, 1467236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project ifnull(P3.read_status, 0) AS read_status 1477236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project FROM pdu P1 1487236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project INNER JOIN pdu P3 1497236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project ON P1.m_id = P3.m_id AND P3.m_type = 136 1507236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project LEFT JOIN pdu P2 1517236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project ON P1.m_id = P2.m_id AND P2.m_type = 134) T 1527236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project ON (msg_id = id2 AND type = 151) 1537236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project OR (msg_id = id3 AND type = 137) 1547236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project WHERE T.id1 = ?; 1557236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project */ 1567236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.setTables("addr INNER JOIN (SELECT P1._id AS id1, P2._id" + 1577236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " AS id2, P3._id AS id3, ifnull(P2.st, 0) AS" + 1587236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " delivery_status, ifnull(P3.read_status, 0) AS" + 1597236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " read_status FROM pdu P1 INNER JOIN pdu P2 ON" + 1607236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " P1.m_id=P2.m_id AND P2.m_type=134 LEFT JOIN" + 1617236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " pdu P3 ON P1.m_id=P3.m_id AND P3.m_type=136" + 1627236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " UNION SELECT P1._id AS id1, P2._id AS id2, P3._id" + 1637236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " AS id3, ifnull(P2.st, 0) AS delivery_status," + 1647236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " ifnull(P3.read_status, 0) AS read_status FROM" + 1657236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " pdu P1 INNER JOIN pdu P3 ON P1.m_id=P3.m_id AND" + 1667236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " P3.m_type=136 LEFT JOIN pdu P2 ON P1.m_id=P2.m_id" + 1677236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " AND P2.m_type=134) T ON (msg_id=id2 AND type=151)" + 1687236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project " OR (msg_id=id3 AND type=137)"); 1697236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.appendWhere("T.id1 = " + uri.getLastPathSegment()); 1707236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.setDistinct(true); 1717236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 1727236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_REPORT_REQUEST: 1737236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project /* 1747236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project SELECT address, d_rpt, rr 1757236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project FROM addr join pdu on pdu._id = addr.msg_id 1767236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project WHERE pdu._id = messageId AND addr.type = 151 1777236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project */ 1787236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.setTables(TABLE_ADDR + " join " + 1797236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project TABLE_PDU + " on pdu._id = addr.msg_id"); 1807236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.appendWhere("pdu._id = " + uri.getLastPathSegment()); 1817236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.appendWhere(" AND " + "addr.type = " + PduHeaders.TO); 1827236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 1837236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_SENDING_RATE: 1847236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.setTables(TABLE_RATE); 1857236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 1867236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_DRM_STORAGE_ID: 1877236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.setTables(TABLE_DRM); 1887236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.appendWhere(BaseColumns._ID + "=" + uri.getLastPathSegment()); 1897236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 1906c0ef2476db38e51932975db870a9e6670200f20Tom Taylor case MMS_THREADS: 1916c0ef2476db38e51932975db870a9e6670200f20Tom Taylor qb.setTables("pdu group by thread_id"); 1926c0ef2476db38e51932975db870a9e6670200f20Tom Taylor break; 1937236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project default: 1942914a7ab544c795f9e47cd7bcd44e0c28bd3cdb9Wei Huang Log.e(TAG, "query: invalid request: " + uri); 1957236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return null; 1967236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 1977236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 1987236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project String finalSortOrder = null; 1997236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (TextUtils.isEmpty(sortOrder)) { 2007236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (qb.getTables().equals(TABLE_PDU)) { 2017236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project finalSortOrder = Mms.DATE + " DESC"; 2027236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } else if (qb.getTables().equals(TABLE_PART)) { 2037236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project finalSortOrder = Part.SEQ; 2047236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 2057236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } else { 2067236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project finalSortOrder = sortOrder; 2077236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 2087236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 2093ad9da40b96f27bd441dae1e78a3b7061d4999e3Tom Taylor Cursor ret; 2103ad9da40b96f27bd441dae1e78a3b7061d4999e3Tom Taylor try { 2113ad9da40b96f27bd441dae1e78a3b7061d4999e3Tom Taylor SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 2123ad9da40b96f27bd441dae1e78a3b7061d4999e3Tom Taylor ret = qb.query(db, projection, selection, 2133ad9da40b96f27bd441dae1e78a3b7061d4999e3Tom Taylor selectionArgs, null, null, finalSortOrder); 2143ad9da40b96f27bd441dae1e78a3b7061d4999e3Tom Taylor } catch (SQLiteException e) { 2153ad9da40b96f27bd441dae1e78a3b7061d4999e3Tom Taylor Log.e(TAG, "returning NULL cursor, query: " + uri, e); 2163ad9da40b96f27bd441dae1e78a3b7061d4999e3Tom Taylor return null; 2173ad9da40b96f27bd441dae1e78a3b7061d4999e3Tom Taylor } 2187236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 2197236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // TODO: Does this need to be a URI for this provider. 2207236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project ret.setNotificationUri(getContext().getContentResolver(), uri); 2217236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return ret; 2227236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 2237236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 2247236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private void constructQueryForBox(SQLiteQueryBuilder qb, int msgBox) { 2257236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.setTables(TABLE_PDU); 2267236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 2277236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (msgBox != Mms.MESSAGE_BOX_ALL) { 2287236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project qb.appendWhere(Mms.MESSAGE_BOX + "=" + msgBox); 2297236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 2307236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 2317236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 2327236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project @Override 2337236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project public String getType(Uri uri) { 2347236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project int match = sURLMatcher.match(uri); 2357236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project switch (match) { 2367236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_ALL: 2377236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_INBOX: 2387236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_SENT: 2397236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_DRAFTS: 2407236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_OUTBOX: 2417236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return VND_ANDROID_DIR_MMS; 2427236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_ALL_ID: 2437236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_INBOX_ID: 2447236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_SENT_ID: 2457236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_DRAFTS_ID: 2467236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_OUTBOX_ID: 2477236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return VND_ANDROID_MMS; 2487236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_PART_ID: { 2497236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Cursor cursor = mOpenHelper.getReadableDatabase().query( 2507236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project TABLE_PART, new String[] { Part.CONTENT_TYPE }, 2517236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Part._ID + " = ?", new String[] { uri.getLastPathSegment() }, 2527236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project null, null, null); 2537236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (cursor != null) { 2547236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project try { 2557236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if ((cursor.getCount() == 1) && cursor.moveToFirst()) { 2567236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return cursor.getString(0); 2577236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } else { 2587236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Log.e(TAG, "cursor.count() != 1: " + uri); 2597236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 2607236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } finally { 2617236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project cursor.close(); 2627236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 2637236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } else { 2647236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Log.e(TAG, "cursor == null: " + uri); 2657236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 2667236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return "*/*"; 2677236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 2687236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_ALL_PART: 2697236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_MSG_PART: 2707236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_MSG_ADDR: 2717236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project default: 2727236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return "*/*"; 2737236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 2747236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 2757236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 2767236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project @Override 2777236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project public Uri insert(Uri uri, ContentValues values) { 278438403eab51611bd92050e64eba56efe00c613daTom Taylor // Don't let anyone insert anything with the _data column 279438403eab51611bd92050e64eba56efe00c613daTom Taylor if (values != null && values.containsKey(Part._DATA)) { 280438403eab51611bd92050e64eba56efe00c613daTom Taylor return null; 281438403eab51611bd92050e64eba56efe00c613daTom Taylor } 2827236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project int msgBox = Mms.MESSAGE_BOX_ALL; 2837236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project boolean notify = true; 2847236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 2857236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project int match = sURLMatcher.match(uri); 2867236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (LOCAL_LOGV) { 2877236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Log.v(TAG, "Insert uri=" + uri + ", match=" + match); 2887236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 2897236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 2907236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project String table = TABLE_PDU; 2917236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project switch (match) { 2927236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_ALL: 2937236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Object msgBoxObj = values.getAsInteger(Mms.MESSAGE_BOX); 2947236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (msgBoxObj != null) { 2957236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project msgBox = (Integer) msgBoxObj; 2967236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 2977236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project else { 2987236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // default to inbox 2997236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project msgBox = Mms.MESSAGE_BOX_INBOX; 3007236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 3017236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 3027236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_INBOX: 3037236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project msgBox = Mms.MESSAGE_BOX_INBOX; 3047236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 3057236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_SENT: 3067236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project msgBox = Mms.MESSAGE_BOX_SENT; 3077236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 3087236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_DRAFTS: 3097236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project msgBox = Mms.MESSAGE_BOX_DRAFTS; 3107236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 3117236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_OUTBOX: 3127236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project msgBox = Mms.MESSAGE_BOX_OUTBOX; 3137236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 3147236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_MSG_PART: 3157236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project notify = false; 3167236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project table = TABLE_PART; 3177236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 3187236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_MSG_ADDR: 3197236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project notify = false; 3207236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project table = TABLE_ADDR; 3217236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 3227236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_SENDING_RATE: 3237236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project notify = false; 3247236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project table = TABLE_RATE; 3257236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 3267236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_DRM_STORAGE: 3277236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project notify = false; 3287236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project table = TABLE_DRM; 3297236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 3307236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project default: 3312914a7ab544c795f9e47cd7bcd44e0c28bd3cdb9Wei Huang Log.e(TAG, "insert: invalid request: " + uri); 3327236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return null; 3337236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 3347236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 3357236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 3367236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project ContentValues finalValues; 3377236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Uri res = Mms.CONTENT_URI; 3387236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project long rowId; 3397236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 3407236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (table.equals(TABLE_PDU)) { 3417236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project boolean addDate = !values.containsKey(Mms.DATE); 3427236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project boolean addMsgBox = !values.containsKey(Mms.MESSAGE_BOX); 3437236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 3447236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Filter keys we don't support yet. 3457236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project filterUnsupportedKeys(values); 3467236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 3477236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // TODO: Should initialValues be validated, e.g. if it 3487236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // missed some significant keys? 3497236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project finalValues = new ContentValues(values); 3507236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 3517236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project long timeInMillis = System.currentTimeMillis(); 3527236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 3537236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (addDate) { 3547236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project finalValues.put(Mms.DATE, timeInMillis / 1000L); 3557236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 3567236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 3577236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (addMsgBox && (msgBox != Mms.MESSAGE_BOX_ALL)) { 3587236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project finalValues.put(Mms.MESSAGE_BOX, msgBox); 3597236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 3607236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 3617236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (msgBox != Mms.MESSAGE_BOX_INBOX) { 3627236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Mark all non-inbox messages read. 3637236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project finalValues.put(Mms.READ, 1); 3647236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 3657236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 36621c25bcedfc36ff1ebe6082eef2fb4076fe636acYusuf T. Mobile // thread_id 36721c25bcedfc36ff1ebe6082eef2fb4076fe636acYusuf T. Mobile Long threadId = values.getAsLong(Mms.THREAD_ID); 36821c25bcedfc36ff1ebe6082eef2fb4076fe636acYusuf T. Mobile String address = values.getAsString(CanonicalAddressesColumns.ADDRESS); 36921c25bcedfc36ff1ebe6082eef2fb4076fe636acYusuf T. Mobile 3705926996da70fff9275e948d1cf8a0f17b52a5e14Tom Taylor if (((threadId == null) || (threadId == 0)) && (!TextUtils.isEmpty(address))) { 37121c25bcedfc36ff1ebe6082eef2fb4076fe636acYusuf T. Mobile finalValues.put(Mms.THREAD_ID, Threads.getOrCreateThreadId(getContext(), address)); 37221c25bcedfc36ff1ebe6082eef2fb4076fe636acYusuf T. Mobile } 37321c25bcedfc36ff1ebe6082eef2fb4076fe636acYusuf T. Mobile 3747236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if ((rowId = db.insert(table, null, finalValues)) <= 0) { 3757236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Log.e(TAG, "MmsProvider.insert: failed! " + finalValues); 3767236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return null; 3777236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 3787236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 3797236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project res = Uri.parse(res + "/" + rowId); 3807236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 3817236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } else if (table.equals(TABLE_ADDR)) { 3827236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project finalValues = new ContentValues(values); 3837236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project finalValues.put(Addr.MSG_ID, uri.getPathSegments().get(0)); 3847236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 3857236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if ((rowId = db.insert(table, null, finalValues)) <= 0) { 3867236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Log.e(TAG, "Failed to insert address: " + finalValues); 3877236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return null; 3887236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 3897236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 3907236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project res = Uri.parse(res + "/addr/" + rowId); 3917236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } else if (table.equals(TABLE_PART)) { 3927236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project finalValues = new ContentValues(values); 3937236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 3947236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (match == MMS_MSG_PART) { 3957236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project finalValues.put(Part.MSG_ID, uri.getPathSegments().get(0)); 3967236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 3977236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 398f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner String contentType = values.getAsString("ct"); 3998e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner 400f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner // text/plain and app application/smil store their "data" inline in the 401f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner // table so there's no need to create the file 402c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor boolean plainText = false; 403c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor boolean smilText = false; 404c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor if ("text/plain".equals(contentType)) { 405c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor plainText = true; 406c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor } else if ("application/smil".equals(contentType)) { 407c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor smilText = true; 408c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor } 4098e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner if (!plainText && !smilText) { 410c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor // Use the filename if possible, otherwise use the current time as the name. 411c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor String contentLocation = values.getAsString("cl"); 412c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor if (!TextUtils.isEmpty(contentLocation)) { 413c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor File f = new File(contentLocation); 414c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor contentLocation = "_" + f.getName(); 415c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor } else { 416c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor contentLocation = ""; 417c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor } 418c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor 419f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner // Generate the '_data' field of the part with default 420f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner // permission settings. 421f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner String path = getContext().getDir("parts", 0).getPath() 422c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor + "/PART_" + System.currentTimeMillis() + contentLocation; 423c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor 424c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor if (DownloadDrmHelper.isDrmConvertNeeded(contentType)) { 425c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor // Adds the .fl extension to the filename if contentType is 426c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor // "application/vnd.oma.drm.message" 427c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor path = DownloadDrmHelper.modifyDrmFwLockFileExtension(path); 428c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor } 429f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner 430f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner finalValues.put(Part._DATA, path); 431f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner 432f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner File partFile = new File(path); 433f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner if (!partFile.exists()) { 434f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner try { 435f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner if (!partFile.createNewFile()) { 436f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner throw new IllegalStateException( 437f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner "Unable to create new partFile: " + path); 438f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } 439c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor // Give everyone rw permission until we encrypt the file 440c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor // (in PduPersister.persistData). Once the file is encrypted, the 441c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor // permissions will be set to 0644. 442c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor int result = FileUtils.setPermissions(path, 0666, -1, -1); 443c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor if (LOCAL_LOGV) { 444c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor Log.d(TAG, "MmsProvider.insert setPermissions result: " + result); 445c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor } 446f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } catch (IOException e) { 447f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner Log.e(TAG, "createNewFile", e); 4487236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project throw new IllegalStateException( 4497236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "Unable to create new partFile: " + path); 4507236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 4517236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 4527236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 4537236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 4547236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if ((rowId = db.insert(table, null, finalValues)) <= 0) { 4557236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Log.e(TAG, "MmsProvider.insert: failed! " + finalValues); 4567236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return null; 4577236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 4587236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 4597236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project res = Uri.parse(res + "/part/" + rowId); 4608e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner 4618e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner // Don't use a trigger for updating the words table because of a bug 4628e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner // in FTS3. The bug is such that the call to get the last inserted 4638e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner // row is incorrect. 4648e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner if (plainText) { 4658e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner // Update the words table with a corresponding row. The words table 4668e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner // allows us to search for words quickly, without scanning the whole 4678e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner // table; 4688e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner ContentValues cv = new ContentValues(); 4698e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner 4708e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner // we're using the row id of the part table row but we're also using ids 4718e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner // from the sms table so this divides the space into two large chunks. 4728e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner // The row ids from the part table start at 2 << 32. 4738e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner cv.put(Telephony.MmsSms.WordsTable.ID, (2 << 32) + rowId); 4748e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner cv.put(Telephony.MmsSms.WordsTable.INDEXED_TEXT, values.getAsString("text")); 4758e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner cv.put(Telephony.MmsSms.WordsTable.SOURCE_ROW_ID, rowId); 4768e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner cv.put(Telephony.MmsSms.WordsTable.TABLE_ID, 2); 4778e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner db.insert(TABLE_WORDS, Telephony.MmsSms.WordsTable.INDEXED_TEXT, cv); 4788e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner } 4798e5ee782690175e9cfb9a37f600f207b952ba8a6Mark Wagner 4807236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } else if (table.equals(TABLE_RATE)) { 4817236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project long now = values.getAsLong(Rate.SENT_TIME); 4827236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project long oneHourAgo = now - 1000 * 60 * 60; 4837236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Delete all unused rows (time earlier than one hour ago). 4847236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.delete(table, Rate.SENT_TIME + "<=" + oneHourAgo, null); 4857236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project db.insert(table, null, values); 4867236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } else if (table.equals(TABLE_DRM)) { 4877236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project String path = getContext().getDir("parts", 0).getPath() 4887236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project + "/PART_" + System.currentTimeMillis(); 4897236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project finalValues = new ContentValues(1); 4907236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project finalValues.put("_data", path); 4917236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 4927236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project File partFile = new File(path); 4937236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (!partFile.exists()) { 4947236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project try { 4957236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (!partFile.createNewFile()) { 4967236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project throw new IllegalStateException( 4977236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "Unable to create new file: " + path); 4987236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 4997236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } catch (IOException e) { 5007236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Log.e(TAG, "createNewFile", e); 5017236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project throw new IllegalStateException( 5027236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project "Unable to create new file: " + path); 5037236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 5047236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 5057236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 5067236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if ((rowId = db.insert(table, null, finalValues)) <= 0) { 5077236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Log.e(TAG, "MmsProvider.insert: failed! " + finalValues); 5087236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return null; 5097236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 5107236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project res = Uri.parse(res + "/drm/" + rowId); 5117236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } else { 5127236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project throw new AssertionError("Unknown table type: " + table); 5137236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 5147236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 5157236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (notify) { 5167236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project notifyChange(); 5177236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 5187236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return res; 5197236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 5207236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 5217236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private int getMessageBoxByMatch(int match) { 5227236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project switch (match) { 5237236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_INBOX_ID: 5247236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_INBOX: 5257236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return Mms.MESSAGE_BOX_INBOX; 5267236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_SENT_ID: 5277236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_SENT: 5287236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return Mms.MESSAGE_BOX_SENT; 5297236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_DRAFTS_ID: 5307236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_DRAFTS: 5317236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return Mms.MESSAGE_BOX_DRAFTS; 5327236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_OUTBOX_ID: 5337236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_OUTBOX: 5347236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return Mms.MESSAGE_BOX_OUTBOX; 5357236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project default: 5367236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project throw new IllegalArgumentException("bad Arg: " + match); 5377236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 5387236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 5397236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 5407236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project @Override 5417236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project public int delete(Uri uri, String selection, 5427236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project String[] selectionArgs) { 5437236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project int match = sURLMatcher.match(uri); 5447236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (LOCAL_LOGV) { 5457236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Log.v(TAG, "Delete uri=" + uri + ", match=" + match); 5467236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 5477236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 5487236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project String table, extraSelection = null; 5497236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project boolean notify = false; 5507236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 5517236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project switch (match) { 5527236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_ALL_ID: 5537236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_INBOX_ID: 5547236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_SENT_ID: 5557236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_DRAFTS_ID: 5567236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_OUTBOX_ID: 5577236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project notify = true; 5587236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project table = TABLE_PDU; 5597236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project extraSelection = Mms._ID + "=" + uri.getLastPathSegment(); 5607236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 5617236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_ALL: 5627236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_INBOX: 5637236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_SENT: 5647236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_DRAFTS: 5657236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_OUTBOX: 5667236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project notify = true; 5677236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project table = TABLE_PDU; 5687236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (match != MMS_ALL) { 5697236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project int msgBox = getMessageBoxByMatch(match); 5707236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project extraSelection = Mms.MESSAGE_BOX + "=" + msgBox; 5717236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 5727236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 5737236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_ALL_PART: 5747236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project table = TABLE_PART; 5757236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 5767236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_MSG_PART: 5777236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project table = TABLE_PART; 5787236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project extraSelection = Part.MSG_ID + "=" + uri.getPathSegments().get(0); 5797236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 5807236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_PART_ID: 5817236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project table = TABLE_PART; 5827236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project extraSelection = Part._ID + "=" + uri.getPathSegments().get(1); 5837236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 5847236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_MSG_ADDR: 5857236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project table = TABLE_ADDR; 5867236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project extraSelection = Addr.MSG_ID + "=" + uri.getPathSegments().get(0); 5877236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 5887236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_DRM_STORAGE: 5897236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project table = TABLE_DRM; 5907236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 5917236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project default: 5927236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Log.w(TAG, "No match for URI '" + uri + "'"); 5937236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return 0; 5947236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 5957236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 5967236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project String finalSelection = concatSelections(selection, extraSelection); 5977236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 5987236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project int deletedRows = 0; 5997236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6007236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (TABLE_PDU.equals(table)) { 6017236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project deletedRows = deleteMessages(getContext(), db, finalSelection, 6027236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project selectionArgs, uri); 6037236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } else if (TABLE_PART.equals(table)) { 6047236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project deletedRows = deleteParts(db, finalSelection, selectionArgs); 6057236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } else if (TABLE_DRM.equals(table)) { 6067236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project deletedRows = deleteTempDrmData(db, finalSelection, selectionArgs); 6077236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } else { 6087236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project deletedRows = db.delete(table, finalSelection, selectionArgs); 6097236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6107236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6117236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if ((deletedRows > 0) && notify) { 6127236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project notifyChange(); 6137236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6147236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return deletedRows; 6157236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6167236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6177236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project static int deleteMessages(Context context, SQLiteDatabase db, 6187236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project String selection, String[] selectionArgs, Uri uri) { 6197236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Cursor cursor = db.query(TABLE_PDU, new String[] { Mms._ID }, 6207236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project selection, selectionArgs, null, null, null); 6217236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (cursor == null) { 6227236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return 0; 6237236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6247236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6257236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project try { 6267236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (cursor.getCount() == 0) { 6277236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return 0; 6287236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6297236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6307236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project while (cursor.moveToNext()) { 6317236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project deleteParts(db, Part.MSG_ID + " = ?", 6327236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project new String[] { String.valueOf(cursor.getLong(0)) }); 6337236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6347236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } finally { 6357236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project cursor.close(); 6367236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6377236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6387236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project int count = db.delete(TABLE_PDU, selection, selectionArgs); 6397236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (count > 0) { 6407236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Intent intent = new Intent(Mms.Intents.CONTENT_CHANGED_ACTION); 6417236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project intent.putExtra(Mms.Intents.DELETED_CONTENTS, uri); 6427236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (LOCAL_LOGV) { 6437236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Log.v(TAG, "Broadcasting intent: " + intent); 6447236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6457236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project context.sendBroadcast(intent); 6467236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6477236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return count; 6487236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6497236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6507236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static int deleteParts(SQLiteDatabase db, String selection, 6517236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project String[] selectionArgs) { 6527236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return deleteDataRows(db, TABLE_PART, selection, selectionArgs); 6537236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6547236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6557236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static int deleteTempDrmData(SQLiteDatabase db, String selection, 6567236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project String[] selectionArgs) { 6577236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return deleteDataRows(db, TABLE_DRM, selection, selectionArgs); 6587236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6597236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6607236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static int deleteDataRows(SQLiteDatabase db, String table, 6617236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project String selection, String[] selectionArgs) { 6627236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Cursor cursor = db.query(table, new String[] { "_data" }, 6637236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project selection, selectionArgs, null, null, null); 6647236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (cursor == null) { 6657236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // FIXME: This might be an error, ignore it may cause 6667236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // unpredictable result. 6677236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return 0; 6687236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6697236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6707236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project try { 6717236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (cursor.getCount() == 0) { 6727236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return 0; 6737236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6747236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6757236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project while (cursor.moveToNext()) { 6767236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project try { 6777236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Delete the associated files saved on file-system. 678f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner String path = cursor.getString(0); 679f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner if (path != null) { 680f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner new File(path).delete(); 681f0a9e90721310bed023a9ff1f176f1b5e05a14f7Mark Wagner } 6827236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } catch (Throwable ex) { 6837236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Log.e(TAG, ex.getMessage(), ex); 6847236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6857236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6867236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } finally { 6877236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project cursor.close(); 6887236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6897236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6907236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return db.delete(table, selection, selectionArgs); 6917236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 6927236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 6937236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project @Override 6947236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project public int update(Uri uri, ContentValues values, 6957236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project String selection, String[] selectionArgs) { 696438403eab51611bd92050e64eba56efe00c613daTom Taylor // Don't let anyone update the _data column 697438403eab51611bd92050e64eba56efe00c613daTom Taylor if (values != null && values.containsKey(Part._DATA)) { 698438403eab51611bd92050e64eba56efe00c613daTom Taylor return 0; 699438403eab51611bd92050e64eba56efe00c613daTom Taylor } 7007236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project int match = sURLMatcher.match(uri); 7017236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (LOCAL_LOGV) { 7027236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Log.v(TAG, "Update uri=" + uri + ", match=" + match); 7037236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 7047236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 7057236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project boolean notify = false; 7067236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project String msgId = null; 7077236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project String table; 7087236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 7097236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project switch (match) { 7107236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_ALL_ID: 7117236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_INBOX_ID: 7127236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_SENT_ID: 7137236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_DRAFTS_ID: 7147236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_OUTBOX_ID: 7157236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project msgId = uri.getLastPathSegment(); 7167236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // fall-through 7177236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_ALL: 7187236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_INBOX: 7197236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_SENT: 7207236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_DRAFTS: 7217236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_OUTBOX: 7227236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project notify = true; 7237236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project table = TABLE_PDU; 7247236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 725c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor 7267236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_MSG_PART: 7277236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_PART_ID: 7287236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project table = TABLE_PART; 7297236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 730c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor 731c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor case MMS_PART_RESET_FILE_PERMISSION: 732c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor String path = getContext().getDir("parts", 0).getPath() + '/' + 733c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor uri.getPathSegments().get(1); 734c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor // Reset the file permission back to read for everyone but me. 735c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor int result = FileUtils.setPermissions(path, 0644, -1, -1); 736c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor if (LOCAL_LOGV) { 737c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor Log.d(TAG, "MmsProvider.update setPermissions result: " + result + 738c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor " for path: " + path); 739c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor } 740c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor return 0; 741c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor 7427236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project default: 7437236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project Log.w(TAG, "Update operation for '" + uri + "' not implemented."); 7447236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return 0; 7457236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 7467236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 7477236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project String extraSelection = null; 7487236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project ContentValues finalValues; 7497236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (table.equals(TABLE_PDU)) { 7507236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Filter keys that we don't support yet. 7517236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project filterUnsupportedKeys(values); 7527236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project finalValues = new ContentValues(values); 7537236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 7547236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (msgId != null) { 7557236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project extraSelection = Mms._ID + "=" + msgId; 7567236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 7577236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } else if (table.equals(TABLE_PART)) { 7587236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project finalValues = new ContentValues(values); 7597236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 7607236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project switch (match) { 7617236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_MSG_PART: 7627236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project extraSelection = Part.MSG_ID + "=" + uri.getPathSegments().get(0); 7637236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 7647236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project case MMS_PART_ID: 7657236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project extraSelection = Part._ID + "=" + uri.getPathSegments().get(1); 7667236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 7677236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project default: 7687236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project break; 7697236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 7707236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } else { 7717236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return 0; 7727236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 7737236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 7747236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project String finalSelection = concatSelections(selection, extraSelection); 7757236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 7767236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project int count = db.update(table, finalValues, finalSelection, selectionArgs); 7777236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (notify && (count > 0)) { 7787236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project notifyChange(); 7797236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 7807236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return count; 7817236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 7827236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 7837236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project @Override 7842914a7ab544c795f9e47cd7bcd44e0c28bd3cdb9Wei Huang public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { 7852914a7ab544c795f9e47cd7bcd44e0c28bd3cdb9Wei Huang int match = sURLMatcher.match(uri); 7862914a7ab544c795f9e47cd7bcd44e0c28bd3cdb9Wei Huang 7872914a7ab544c795f9e47cd7bcd44e0c28bd3cdb9Wei Huang if (Log.isLoggable(TAG, Log.VERBOSE)) { 7888168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor Log.d(TAG, "openFile: uri=" + uri + ", mode=" + mode + ", match=" + match); 7892914a7ab544c795f9e47cd7bcd44e0c28bd3cdb9Wei Huang } 7902914a7ab544c795f9e47cd7bcd44e0c28bd3cdb9Wei Huang 7918168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor if (match != MMS_PART_ID) { 7928168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor return null; 7938168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor } 7948168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor 7958168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor // Verify that the _data path points to mms data 7968168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor Cursor c = query(uri, new String[]{"_data"}, null, null, null); 7978168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor int count = (c != null) ? c.getCount() : 0; 7988168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor if (count != 1) { 7998168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor // If there is not exactly one result, throw an appropriate 8008168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor // exception. 8018168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor if (c != null) { 8028168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor c.close(); 8038168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor } 8048168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor if (count == 0) { 8058168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor throw new FileNotFoundException("No entry for " + uri); 8068168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor } 8078168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor throw new FileNotFoundException("Multiple items at " + uri); 8088168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor } 8098168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor 8108168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor c.moveToFirst(); 8118168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor int i = c.getColumnIndex("_data"); 8128168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor String path = (i >= 0 ? c.getString(i) : null); 8138168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor c.close(); 8148168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor 8158168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor if (path == null) { 8168168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor return null; 8178168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor } 8188168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor try { 8198168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor File filePath = new File(path); 8208168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor if (!filePath.getCanonicalPath() 8218168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor .startsWith(getContext().getApplicationInfo().dataDir + "/app_parts/")) { 8228168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor return null; 8238168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor } 8248168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor } catch (IOException e) { 8258168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor return null; 8262914a7ab544c795f9e47cd7bcd44e0c28bd3cdb9Wei Huang } 8272914a7ab544c795f9e47cd7bcd44e0c28bd3cdb9Wei Huang 8288168ff8cebcd1b51ef9d97f2a50f9c91ee8aa562Tom Taylor return openFileHelper(uri, mode); 8297236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 8307236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 8317236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private void filterUnsupportedKeys(ContentValues values) { 8327236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Some columns are unsupported. They should therefore 8337236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // neither be inserted nor updated. Filter them out. 8347236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.DELIVERY_TIME_TOKEN); 8357236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.SENDER_VISIBILITY); 8367236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.REPLY_CHARGING); 8377236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.REPLY_CHARGING_DEADLINE_TOKEN); 8387236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.REPLY_CHARGING_DEADLINE); 8397236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.REPLY_CHARGING_ID); 8407236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.REPLY_CHARGING_SIZE); 8417236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.PREVIOUSLY_SENT_BY); 8427236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.PREVIOUSLY_SENT_DATE); 8437236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.STORE); 8447236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.MM_STATE); 8457236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.MM_FLAGS_TOKEN); 8467236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.MM_FLAGS); 8477236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.STORE_STATUS); 8487236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.STORE_STATUS_TEXT); 8497236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.STORED); 8507236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.TOTALS); 8517236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.MBOX_TOTALS); 8527236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.MBOX_TOTALS_TOKEN); 8537236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.QUOTAS); 8547236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.MBOX_QUOTAS); 8557236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.MBOX_QUOTAS_TOKEN); 8567236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.MESSAGE_COUNT); 8577236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.START); 8587236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.DISTRIBUTION_INDICATOR); 8597236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.ELEMENT_DESCRIPTOR); 8607236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.LIMIT); 8617236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.RECOMMENDED_RETRIEVAL_MODE); 8627236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.RECOMMENDED_RETRIEVAL_MODE_TEXT); 8637236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.STATUS_TEXT); 8647236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.APPLIC_ID); 8657236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.REPLY_APPLIC_ID); 8667236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.AUX_APPLIC_ID); 8677236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.DRM_CONTENT); 8687236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.ADAPTATION_ALLOWED); 8697236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.REPLACE_ID); 8707236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.CANCEL_ID); 8717236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms.CANCEL_STATUS); 8727236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 8737236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project // Keys shouldn't be inserted or updated. 8747236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project values.remove(Mms._ID); 8757236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 8767236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 8777236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private void notifyChange() { 8787236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project getContext().getContentResolver().notifyChange( 87943f9fb234aabe569b342af78bdaf85effbd85f10Amith Yamasani MmsSms.CONTENT_URI, null, true, UserHandle.USER_ALL); 8807236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 8817236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 8827236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private final static String TAG = "MmsProvider"; 8837236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private final static String VND_ANDROID_MMS = "vnd.android/mms"; 8847236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private final static String VND_ANDROID_DIR_MMS = "vnd.android-dir/mms"; 8857236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private final static boolean DEBUG = false; 886dc94679e1de943695cf40297c341bc929ea1b67eJoe Onorato private final static boolean LOCAL_LOGV = false; 8877236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 8887236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_ALL = 0; 8897236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_ALL_ID = 1; 8907236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_INBOX = 2; 8917236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_INBOX_ID = 3; 8927236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_SENT = 4; 8937236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_SENT_ID = 5; 8947236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_DRAFTS = 6; 8957236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_DRAFTS_ID = 7; 8967236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_OUTBOX = 8; 8977236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_OUTBOX_ID = 9; 8987236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_ALL_PART = 10; 8997236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_MSG_PART = 11; 9007236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_PART_ID = 12; 9017236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_MSG_ADDR = 13; 9027236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_SENDING_RATE = 14; 9036c0ef2476db38e51932975db870a9e6670200f20Tom Taylor private static final int MMS_REPORT_STATUS = 15; 9046c0ef2476db38e51932975db870a9e6670200f20Tom Taylor private static final int MMS_REPORT_REQUEST = 16; 9057236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_DRM_STORAGE = 17; 9067236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final int MMS_DRM_STORAGE_ID = 18; 9076c0ef2476db38e51932975db870a9e6670200f20Tom Taylor private static final int MMS_THREADS = 19; 908c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor private static final int MMS_PART_RESET_FILE_PERMISSION = 20; 9097236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 9107236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static final UriMatcher 9117236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher = new UriMatcher(UriMatcher.NO_MATCH); 9127236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 9137236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project static { 9147236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", null, MMS_ALL); 9157236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "#", MMS_ALL_ID); 9167236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "inbox", MMS_INBOX); 9177236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "inbox/#", MMS_INBOX_ID); 9187236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "sent", MMS_SENT); 9197236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "sent/#", MMS_SENT_ID); 9207236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "drafts", MMS_DRAFTS); 9217236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "drafts/#", MMS_DRAFTS_ID); 9227236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "outbox", MMS_OUTBOX); 9237236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "outbox/#", MMS_OUTBOX_ID); 9247236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "part", MMS_ALL_PART); 9257236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "#/part", MMS_MSG_PART); 9267236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "part/#", MMS_PART_ID); 9277236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "#/addr", MMS_MSG_ADDR); 9287236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "rate", MMS_SENDING_RATE); 9297236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "report-status/#", MMS_REPORT_STATUS); 9307236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "report-request/#", MMS_REPORT_REQUEST); 9317236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "drm", MMS_DRM_STORAGE); 9327236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project sURLMatcher.addURI("mms", "drm/#", MMS_DRM_STORAGE_ID); 9336c0ef2476db38e51932975db870a9e6670200f20Tom Taylor sURLMatcher.addURI("mms", "threads", MMS_THREADS); 934c2db47d0d13883d9817c2e2b9c425d1552c4494fTom Taylor sURLMatcher.addURI("mms", "resetFilePerm/*", MMS_PART_RESET_FILE_PERMISSION); 9357236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 9367236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 9377236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private SQLiteOpenHelper mOpenHelper; 9387236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 9397236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project private static String concatSelections(String selection1, String selection2) { 9407236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project if (TextUtils.isEmpty(selection1)) { 9417236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return selection2; 9427236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } else if (TextUtils.isEmpty(selection2)) { 9437236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return selection1; 9447236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } else { 9457236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project return selection1 + " AND " + selection2; 9467236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 9477236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project } 9487236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project} 9497236c3ad7ff01dd5ece14a2cabbf5ce3a570d793The Android Open Source Project 950