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