diff --git a/Android.mk b/Android.mk
deleted file mode 100644
index 2b16664..0000000
--- a/Android.mk
+++ /dev/null
@@ -1,13 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := user development
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_JAVA_LIBRARIES := 
-
-LOCAL_PACKAGE_NAME := TelephonyProvider
-LOCAL_CERTIFICATE := platform
-
-include $(BUILD_PACKAGE)
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
deleted file mode 100644
index dfbf918..0000000
--- a/AndroidManifest.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-        package="com.android.providers.telephony"
-        android:sharedUserId="android.uid.phone"
->
-
-    <application android:process="com.android.phone"
-                 android:allowClearUserData="false"
-                 android:label="Dialer Storage"
-                 android:icon="@drawable/ic_launcher_phone">
-        <provider android:name="TelephonyProvider" android:authorities="telephony" android:multiprocess="true" />
-        <provider android:name="SmsProvider" android:authorities="sms" android:multiprocess="true" 
-            android:readPermission="android.permission.READ_SMS"
-            android:writePermission="android.permission.WRITE_SMS" />
-        <provider android:name="MmsProvider" android:authorities="mms" android:multiprocess="true" 
-            android:readPermission="android.permission.READ_SMS"
-            android:writePermission="android.permission.WRITE_SMS" />
-        <provider android:name="MmsSmsProvider" android:authorities="mms-sms" android:multiprocess="true" 
-            android:readPermission="android.permission.READ_SMS"
-            android:writePermission="android.permission.WRITE_SMS" />
-    </application>
-</manifest>
diff --git a/MODULE_LICENSE_APACHE2 b/MODULE_LICENSE_APACHE2
deleted file mode 100644
index e69de29..0000000
--- a/MODULE_LICENSE_APACHE2
+++ /dev/null
diff --git a/NOTICE b/NOTICE
deleted file mode 100644
index c5b1efa..0000000
--- a/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2005-2008, The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/res/drawable/ic_launcher_phone.png b/res/drawable/ic_launcher_phone.png
deleted file mode 100644
index 4e613ec..0000000
--- a/res/drawable/ic_launcher_phone.png
+++ /dev/null
Binary files differ
diff --git a/src/com/android/providers/telephony/MmsProvider.java b/src/com/android/providers/telephony/MmsProvider.java
deleted file mode 100644
index 37d1787..0000000
--- a/src/com/android/providers/telephony/MmsProvider.java
+++ /dev/null
@@ -1,796 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.providers.telephony;
-
-import com.google.android.mms.pdu.PduHeaders;
-
-import android.content.ContentProvider;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.content.UriMatcher;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.database.sqlite.SQLiteQueryBuilder;
-import android.net.Uri;
-import android.os.ParcelFileDescriptor;
-import android.provider.BaseColumns;
-import android.provider.Telephony.Mms;
-import android.provider.Telephony.MmsSms;
-import android.provider.Telephony.Mms.Addr;
-import android.provider.Telephony.Mms.Part;
-import android.provider.Telephony.Mms.Rate;
-import android.text.TextUtils;
-import android.util.Config;
-import android.util.Log;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
-/**
- * The class to provide base facility to access MMS related content,
- * which is stored in a SQLite database and in the file system.
- */
-public class MmsProvider extends ContentProvider {
-    static final String TABLE_PDU  = "pdu";
-    static final String TABLE_ADDR = "addr";
-    static final String TABLE_PART = "part";
-    static final String TABLE_RATE = "rate";
-    static final String TABLE_DRM  = "drm";
-
-    @Override
-    public boolean onCreate() {
-        mOpenHelper = MmsSmsDatabaseHelper.getInstance(getContext());
-        return true;
-    }
-
-    @Override
-    public Cursor query(Uri uri, String[] projection,
-            String selection, String[] selectionArgs, String sortOrder) {
-        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
-
-        // Generate the body of the query.
-        int match = sURLMatcher.match(uri);
-        if (LOCAL_LOGV) {
-            Log.v(TAG, "Query uri=" + uri + ", match=" + match);
-        }
-
-        switch (match) {
-            case MMS_ALL:
-                constructQueryForBox(qb, Mms.MESSAGE_BOX_ALL);
-                break;
-            case MMS_INBOX:
-                constructQueryForBox(qb, Mms.MESSAGE_BOX_INBOX);
-                break;
-            case MMS_SENT:
-                constructQueryForBox(qb, Mms.MESSAGE_BOX_SENT);
-                break;
-            case MMS_DRAFTS:
-                constructQueryForBox(qb, Mms.MESSAGE_BOX_DRAFTS);
-                break;
-            case MMS_OUTBOX:
-                constructQueryForBox(qb, Mms.MESSAGE_BOX_OUTBOX);
-                break;
-            case MMS_ALL_ID:
-                qb.setTables(TABLE_PDU);
-                qb.appendWhere(Mms._ID + "=" + uri.getPathSegments().get(0));
-                break;
-            case MMS_INBOX_ID:
-            case MMS_SENT_ID:
-            case MMS_DRAFTS_ID:
-            case MMS_OUTBOX_ID:
-                qb.setTables(TABLE_PDU);
-                qb.appendWhere(Mms._ID + "=" + uri.getPathSegments().get(1));
-                qb.appendWhere(" AND " + Mms.MESSAGE_BOX + "="
-                        + getMessageBoxByMatch(match));
-                break;
-            case MMS_ALL_PART:
-                qb.setTables(TABLE_PART);
-                break;
-            case MMS_MSG_PART:
-                qb.setTables(TABLE_PART);
-                qb.appendWhere(Part.MSG_ID + "=" + uri.getPathSegments().get(0));
-                break;
-            case MMS_PART_ID:
-                qb.setTables(TABLE_PART);
-                qb.appendWhere(Part._ID + "=" + uri.getPathSegments().get(1));
-                break;
-            case MMS_MSG_ADDR:
-                qb.setTables(TABLE_ADDR);
-                qb.appendWhere(Addr.MSG_ID + "=" + uri.getPathSegments().get(0));
-                break;
-            case MMS_REPORT_STATUS:
-                /*
-                   SELECT DISTINCT address,
-                                   T.delivery_status AS delivery_status,
-                                   T.read_status AS read_status
-                   FROM addr
-                   INNER JOIN (SELECT P1._id AS id1, P2._id AS id2, P3._id AS id3,
-                                      ifnull(P2.st, 0) AS delivery_status,
-                                      ifnull(P3.read_status, 0) AS read_status
-                               FROM pdu P1
-                               INNER JOIN pdu P2
-                               ON P1.m_id = P2.m_id AND P2.m_type = 134
-                               LEFT JOIN pdu P3
-                               ON P1.m_id = P3.m_id AND P3.m_type = 136
-                               UNION
-                               SELECT P1._id AS id1, P2._id AS id2, P3._id AS id3,
-                                      ifnull(P2.st, 0) AS delivery_status,
-                                      ifnull(P3.read_status, 0) AS read_status
-                               FROM pdu P1
-                               INNER JOIN pdu P3
-                               ON P1.m_id = P3.m_id AND P3.m_type = 136
-                               LEFT JOIN pdu P2
-                               ON P1.m_id = P2.m_id AND P2.m_type = 134) T
-                   ON (msg_id = id2 AND type = 151)
-                   OR (msg_id = id3 AND type = 137)
-                   WHERE T.id1 = ?;
-                 */
-                qb.setTables("addr INNER JOIN (SELECT P1._id AS id1, P2._id" +
-                             " AS id2, P3._id AS id3, ifnull(P2.st, 0) AS" +
-                             " delivery_status, ifnull(P3.read_status, 0) AS" +
-                             " read_status FROM pdu P1 INNER JOIN pdu P2 ON" +
-                             " P1.m_id=P2.m_id AND P2.m_type=134 LEFT JOIN" +
-                             " pdu P3 ON P1.m_id=P3.m_id AND P3.m_type=136" +
-                             " UNION SELECT P1._id AS id1, P2._id AS id2, P3._id" +
-                             " AS id3, ifnull(P2.st, 0) AS delivery_status," +
-                             " ifnull(P3.read_status, 0) AS read_status FROM" +
-                             " pdu P1 INNER JOIN pdu P3 ON P1.m_id=P3.m_id AND" +
-                             " P3.m_type=136 LEFT JOIN pdu P2 ON P1.m_id=P2.m_id" +
-                             " AND P2.m_type=134) T ON (msg_id=id2 AND type=151)" +
-                             " OR (msg_id=id3 AND type=137)");
-                qb.appendWhere("T.id1 = " + uri.getLastPathSegment());
-                qb.setDistinct(true);
-                break;
-            case MMS_REPORT_REQUEST:
-                /*
-                   SELECT address, d_rpt, rr
-                   FROM addr join pdu on pdu._id = addr.msg_id
-                   WHERE pdu._id = messageId AND addr.type = 151
-                 */
-                qb.setTables(TABLE_ADDR + " join " +
-                        TABLE_PDU + " on pdu._id = addr.msg_id");
-                qb.appendWhere("pdu._id = " + uri.getLastPathSegment());
-                qb.appendWhere(" AND " + "addr.type = " + PduHeaders.TO);
-                break;
-            case MMS_SENDING_RATE:
-                qb.setTables(TABLE_RATE);
-                break;
-            case MMS_DRM_STORAGE_ID:
-                qb.setTables(TABLE_DRM);
-                qb.appendWhere(BaseColumns._ID + "=" + uri.getLastPathSegment());
-                break;
-            default:
-                Log.e(TAG, "Invalid request: " + uri);
-                return null;
-        }
-
-        String finalSortOrder = null;
-        if (TextUtils.isEmpty(sortOrder)) {
-            if (qb.getTables().equals(TABLE_PDU)) {
-                finalSortOrder = Mms.DATE + " DESC";
-            } else if (qb.getTables().equals(TABLE_PART)) {
-                finalSortOrder = Part.SEQ;
-            }
-        } else {
-            finalSortOrder = sortOrder;
-        }
-
-        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
-        Cursor ret = qb.query(db, projection, selection,
-                selectionArgs, null, null, finalSortOrder);
-
-        // TODO: Does this need to be a URI for this provider.
-        ret.setNotificationUri(getContext().getContentResolver(), uri);
-        return ret;
-    }
-
-    private void constructQueryForBox(SQLiteQueryBuilder qb, int msgBox) {
-        qb.setTables(TABLE_PDU);
-
-        if (msgBox != Mms.MESSAGE_BOX_ALL) {
-            qb.appendWhere(Mms.MESSAGE_BOX + "=" + msgBox);
-        }
-    }
-
-    @Override
-    public String getType(Uri uri) {
-        int match = sURLMatcher.match(uri);
-        switch (match) {
-            case MMS_ALL:
-            case MMS_INBOX:
-            case MMS_SENT:
-            case MMS_DRAFTS:
-            case MMS_OUTBOX:
-                return VND_ANDROID_DIR_MMS;
-            case MMS_ALL_ID:
-            case MMS_INBOX_ID:
-            case MMS_SENT_ID:
-            case MMS_DRAFTS_ID:
-            case MMS_OUTBOX_ID:
-                return VND_ANDROID_MMS;
-            case MMS_PART_ID: {
-                Cursor cursor = mOpenHelper.getReadableDatabase().query(
-                        TABLE_PART, new String[] { Part.CONTENT_TYPE },
-                        Part._ID + " = ?", new String[] { uri.getLastPathSegment() },
-                        null, null, null);
-                if (cursor != null) {
-                    try {
-                        if ((cursor.getCount() == 1) && cursor.moveToFirst()) {
-                            return cursor.getString(0);
-                        } else {
-                            Log.e(TAG, "cursor.count() != 1: " + uri);
-                        }
-                    } finally {
-                        cursor.close();
-                    }
-                } else {
-                    Log.e(TAG, "cursor == null: " + uri);
-                }
-                return "*/*";
-            }
-            case MMS_ALL_PART:
-            case MMS_MSG_PART:
-            case MMS_MSG_ADDR:
-            default:
-                return "*/*";
-        }
-    }
-
-    @Override
-    public Uri insert(Uri uri, ContentValues values) {
-        int msgBox = Mms.MESSAGE_BOX_ALL;
-        boolean notify = true;
-
-        int match = sURLMatcher.match(uri);
-        if (LOCAL_LOGV) {
-            Log.v(TAG, "Insert uri=" + uri + ", match=" + match);
-        }
-
-        String table = TABLE_PDU;
-        switch (match) {
-            case MMS_ALL:
-                Object msgBoxObj = values.getAsInteger(Mms.MESSAGE_BOX);
-                if (msgBoxObj != null) {
-                    msgBox = (Integer) msgBoxObj;
-                }
-                else {
-                    // default to inbox
-                    msgBox = Mms.MESSAGE_BOX_INBOX;
-                }
-                break;
-            case MMS_INBOX:
-                msgBox = Mms.MESSAGE_BOX_INBOX;
-                break;
-            case MMS_SENT:
-                msgBox = Mms.MESSAGE_BOX_SENT;
-                break;
-            case MMS_DRAFTS:
-                msgBox = Mms.MESSAGE_BOX_DRAFTS;
-                break;
-            case MMS_OUTBOX:
-                msgBox = Mms.MESSAGE_BOX_OUTBOX;
-                break;
-            case MMS_MSG_PART:
-                notify = false;
-                table = TABLE_PART;
-                break;
-            case MMS_MSG_ADDR:
-                notify = false;
-                table = TABLE_ADDR;
-                break;
-            case MMS_SENDING_RATE:
-                notify = false;
-                table = TABLE_RATE;
-                break;
-            case MMS_DRM_STORAGE:
-                notify = false;
-                table = TABLE_DRM;
-                break;
-            default:
-                Log.e(TAG, "Invalid request: " + uri);
-                return null;
-        }
-
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        ContentValues finalValues;
-        Uri res = Mms.CONTENT_URI;
-        long rowId;
-
-        if (table.equals(TABLE_PDU)) {
-            boolean addDate = !values.containsKey(Mms.DATE);
-            boolean addMsgBox = !values.containsKey(Mms.MESSAGE_BOX);
-
-            // Filter keys we don't support yet.
-            filterUnsupportedKeys(values);
-
-            // TODO: Should initialValues be validated, e.g. if it
-            // missed some significant keys?
-            finalValues = new ContentValues(values);
-
-            long timeInMillis = System.currentTimeMillis();
-
-            if (addDate) {
-                finalValues.put(Mms.DATE, timeInMillis / 1000L);
-            }
-
-            if (addMsgBox && (msgBox != Mms.MESSAGE_BOX_ALL)) {
-                finalValues.put(Mms.MESSAGE_BOX, msgBox);
-            }
-
-            if (msgBox != Mms.MESSAGE_BOX_INBOX) {
-                // Mark all non-inbox messages read.
-                finalValues.put(Mms.READ, 1);
-            }
-
-            if ((rowId = db.insert(table, null, finalValues)) <= 0) {
-                Log.e(TAG, "MmsProvider.insert: failed! " + finalValues);
-                return null;
-            }
-
-            res = Uri.parse(res + "/" + rowId);
-
-        } else if (table.equals(TABLE_ADDR)) {
-            finalValues = new ContentValues(values);
-            finalValues.put(Addr.MSG_ID, uri.getPathSegments().get(0));
-
-            if ((rowId = db.insert(table, null, finalValues)) <= 0) {
-                Log.e(TAG, "Failed to insert address: " + finalValues);
-                return null;
-            }
-
-            res = Uri.parse(res + "/addr/" + rowId);
-        } else if (table.equals(TABLE_PART)) {
-            finalValues = new ContentValues(values);
-
-            if (match == MMS_MSG_PART) {
-                finalValues.put(Part.MSG_ID, uri.getPathSegments().get(0));
-            }
-
-            // Generate the '_data' field of the part with default
-            // permission settings.
-            String path = getContext().getDir("parts", 0).getPath()
-                    + "/PART_" + System.currentTimeMillis();
-
-            finalValues.put(Part._DATA, path);
-
-            File partFile = new File(path);
-            if (!partFile.exists()) {
-                try {
-                    if (!partFile.createNewFile()) {
-                        throw new IllegalStateException(
-                                "Unable to create new partFile: " + path);
-                    }
-                } catch (IOException e) {
-                    Log.e(TAG, "createNewFile", e);
-                    throw new IllegalStateException(
-                            "Unable to create new partFile: " + path);
-                }
-            }
-
-            if ((rowId = db.insert(table, null, finalValues)) <= 0) {
-                Log.e(TAG, "MmsProvider.insert: failed! " + finalValues);
-                return null;
-            }
-
-            res = Uri.parse(res + "/part/" + rowId);
-        } else if (table.equals(TABLE_RATE)) {
-            long now = values.getAsLong(Rate.SENT_TIME);
-            long oneHourAgo = now - 1000 * 60 * 60;
-            // Delete all unused rows (time earlier than one hour ago).
-            db.delete(table, Rate.SENT_TIME + "<=" + oneHourAgo, null);
-            db.insert(table, null, values);
-        } else if (table.equals(TABLE_DRM)) {
-            String path = getContext().getDir("parts", 0).getPath()
-                    + "/PART_" + System.currentTimeMillis();
-            finalValues = new ContentValues(1);
-            finalValues.put("_data", path);
-
-            File partFile = new File(path);
-            if (!partFile.exists()) {
-                try {
-                    if (!partFile.createNewFile()) {
-                        throw new IllegalStateException(
-                                "Unable to create new file: " + path);
-                    }
-                } catch (IOException e) {
-                    Log.e(TAG, "createNewFile", e);
-                    throw new IllegalStateException(
-                            "Unable to create new file: " + path);
-                }
-            }
-
-            if ((rowId = db.insert(table, null, finalValues)) <= 0) {
-                Log.e(TAG, "MmsProvider.insert: failed! " + finalValues);
-                return null;
-            }
-            res = Uri.parse(res + "/drm/" + rowId);
-        } else {
-            throw new AssertionError("Unknown table type: " + table);
-        }
-
-        if (notify) {
-            notifyChange();
-        }
-        return res;
-    }
-
-    private int getMessageBoxByMatch(int match) {
-        switch (match) {
-            case MMS_INBOX_ID:
-            case MMS_INBOX:
-                return Mms.MESSAGE_BOX_INBOX;
-            case MMS_SENT_ID:
-            case MMS_SENT:
-                return Mms.MESSAGE_BOX_SENT;
-            case MMS_DRAFTS_ID:
-            case MMS_DRAFTS:
-                return Mms.MESSAGE_BOX_DRAFTS;
-            case MMS_OUTBOX_ID:
-            case MMS_OUTBOX:
-                return Mms.MESSAGE_BOX_OUTBOX;
-            default:
-                throw new IllegalArgumentException("bad Arg: " + match);
-        }
-    }
-
-    @Override
-    public int delete(Uri uri, String selection,
-            String[] selectionArgs) {
-        int match = sURLMatcher.match(uri);
-        if (LOCAL_LOGV) {
-            Log.v(TAG, "Delete uri=" + uri + ", match=" + match);
-        }
-
-        String table, extraSelection = null;
-        boolean notify = false;
-
-        switch (match) {
-            case MMS_ALL_ID:
-            case MMS_INBOX_ID:
-            case MMS_SENT_ID:
-            case MMS_DRAFTS_ID:
-            case MMS_OUTBOX_ID:
-                notify = true;
-                table = TABLE_PDU;
-                extraSelection = Mms._ID + "=" + uri.getLastPathSegment();
-                break;
-            case MMS_ALL:
-            case MMS_INBOX:
-            case MMS_SENT:
-            case MMS_DRAFTS:
-            case MMS_OUTBOX:
-                notify = true;
-                table = TABLE_PDU;
-                if (match != MMS_ALL) {
-                    int msgBox = getMessageBoxByMatch(match);
-                    extraSelection = Mms.MESSAGE_BOX + "=" + msgBox;
-                }
-                break;
-            case MMS_ALL_PART:
-                table = TABLE_PART;
-                break;
-            case MMS_MSG_PART:
-                table = TABLE_PART;
-                extraSelection = Part.MSG_ID + "=" + uri.getPathSegments().get(0);
-                break;
-            case MMS_PART_ID:
-                table = TABLE_PART;
-                extraSelection = Part._ID + "=" + uri.getPathSegments().get(1);
-                break;
-            case MMS_MSG_ADDR:
-                table = TABLE_ADDR;
-                extraSelection = Addr.MSG_ID + "=" + uri.getPathSegments().get(0);
-                break;
-            case MMS_DRM_STORAGE:
-                table = TABLE_DRM;
-                break;
-            default:
-                Log.w(TAG, "No match for URI '" + uri + "'");
-                return 0;
-        }
-
-        String finalSelection = concatSelections(selection, extraSelection);
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        int deletedRows = 0;
-
-        if (TABLE_PDU.equals(table)) {
-            deletedRows = deleteMessages(getContext(), db, finalSelection,
-                                         selectionArgs, uri);
-        } else if (TABLE_PART.equals(table)) {
-            deletedRows = deleteParts(db, finalSelection, selectionArgs);
-        } else if (TABLE_DRM.equals(table)) {
-            deletedRows = deleteTempDrmData(db, finalSelection, selectionArgs);
-        } else {
-            deletedRows = db.delete(table, finalSelection, selectionArgs);
-        }
-
-        if ((deletedRows > 0) && notify) {
-            notifyChange();
-        }
-        return deletedRows;
-    }
-
-    static int deleteMessages(Context context, SQLiteDatabase db,
-            String selection, String[] selectionArgs, Uri uri) {
-        Cursor cursor = db.query(TABLE_PDU, new String[] { Mms._ID },
-                selection, selectionArgs, null, null, null);
-        if (cursor == null) {
-            return 0;
-        }
-
-        try {
-            if (cursor.getCount() == 0) {
-                return 0;
-            }
-
-            while (cursor.moveToNext()) {
-                deleteParts(db, Part.MSG_ID + " = ?",
-                        new String[] { String.valueOf(cursor.getLong(0)) });
-            }
-        } finally {
-            cursor.close();
-        }
-
-        int count = db.delete(TABLE_PDU, selection, selectionArgs);
-        if (count > 0) {
-            Intent intent = new Intent(Mms.Intents.CONTENT_CHANGED_ACTION);
-            intent.putExtra(Mms.Intents.DELETED_CONTENTS, uri);
-            if (LOCAL_LOGV) {
-                Log.v(TAG, "Broadcasting intent: " + intent);
-            }
-            context.sendBroadcast(intent);
-        }
-        return count;
-    }
-
-    private static int deleteParts(SQLiteDatabase db, String selection,
-            String[] selectionArgs) {
-        return deleteDataRows(db, TABLE_PART, selection, selectionArgs);
-    }
-
-    private static int deleteTempDrmData(SQLiteDatabase db, String selection,
-            String[] selectionArgs) {
-        return deleteDataRows(db, TABLE_DRM, selection, selectionArgs);
-    }
-
-    private static int deleteDataRows(SQLiteDatabase db, String table,
-            String selection, String[] selectionArgs) {
-        Cursor cursor = db.query(table, new String[] { "_data" },
-                selection, selectionArgs, null, null, null);
-        if (cursor == null) {
-            // FIXME: This might be an error, ignore it may cause
-            // unpredictable result.
-            return 0;
-        }
-
-        try {
-            if (cursor.getCount() == 0) {
-                return 0;
-            }
-
-            while (cursor.moveToNext()) {
-                try {
-                    // Delete the associated files saved on file-system.
-                    new File(cursor.getString(0)).delete();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                }
-            }
-        } finally {
-            cursor.close();
-        }
-
-        return db.delete(table, selection, selectionArgs);
-    }
-
-    @Override
-    public int update(Uri uri, ContentValues values,
-            String selection, String[] selectionArgs) {
-        int match = sURLMatcher.match(uri);
-        if (LOCAL_LOGV) {
-            Log.v(TAG, "Update uri=" + uri + ", match=" + match);
-        }
-
-        boolean notify = false;
-        String msgId = null;
-        String table;
-
-        switch (match) {
-            case MMS_ALL_ID:
-            case MMS_INBOX_ID:
-            case MMS_SENT_ID:
-            case MMS_DRAFTS_ID:
-            case MMS_OUTBOX_ID:
-                msgId = uri.getLastPathSegment();
-            // fall-through
-            case MMS_ALL:
-            case MMS_INBOX:
-            case MMS_SENT:
-            case MMS_DRAFTS:
-            case MMS_OUTBOX:
-                notify = true;
-                table = TABLE_PDU;
-                break;
-            case MMS_MSG_PART:
-            case MMS_PART_ID:
-                table = TABLE_PART;
-                break;
-            default:
-                Log.w(TAG, "Update operation for '" + uri + "' not implemented.");
-                return 0;
-        }
-
-        String extraSelection = null;
-        ContentValues finalValues;
-        if (table.equals(TABLE_PDU)) {
-            // Filter keys that we don't support yet.
-            filterUnsupportedKeys(values);
-            finalValues = new ContentValues(values);
-
-            if (msgId != null) {
-                extraSelection = Mms._ID + "=" + msgId;
-            }
-        } else if (table.equals(TABLE_PART)) {
-            finalValues = new ContentValues(values);
-
-            switch (match) {
-                case MMS_MSG_PART:
-                    extraSelection = Part.MSG_ID + "=" + uri.getPathSegments().get(0);
-                    break;
-                case MMS_PART_ID:
-                    extraSelection = Part._ID + "=" + uri.getPathSegments().get(1);
-                    break;
-                default:
-                    break;
-            }
-        } else {
-            return 0;
-        }
-
-        String finalSelection = concatSelections(selection, extraSelection);
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        int count = db.update(table, finalValues, finalSelection, selectionArgs);
-        if (notify && (count > 0)) {
-            notifyChange();
-        }
-        return count;
-    }
-
-    @Override
-    public ParcelFileDescriptor openFile(Uri uri, String mode)
-            throws FileNotFoundException {
-        return openFileHelper(uri, mode);
-    }
-
-    private void filterUnsupportedKeys(ContentValues values) {
-        // Some columns are unsupported.  They should therefore
-        // neither be inserted nor updated.  Filter them out.
-        values.remove(Mms.DELIVERY_TIME_TOKEN);
-        values.remove(Mms.SENDER_VISIBILITY);
-        values.remove(Mms.REPLY_CHARGING);
-        values.remove(Mms.REPLY_CHARGING_DEADLINE_TOKEN);
-        values.remove(Mms.REPLY_CHARGING_DEADLINE);
-        values.remove(Mms.REPLY_CHARGING_ID);
-        values.remove(Mms.REPLY_CHARGING_SIZE);
-        values.remove(Mms.PREVIOUSLY_SENT_BY);
-        values.remove(Mms.PREVIOUSLY_SENT_DATE);
-        values.remove(Mms.STORE);
-        values.remove(Mms.MM_STATE);
-        values.remove(Mms.MM_FLAGS_TOKEN);
-        values.remove(Mms.MM_FLAGS);
-        values.remove(Mms.STORE_STATUS);
-        values.remove(Mms.STORE_STATUS_TEXT);
-        values.remove(Mms.STORED);
-        values.remove(Mms.TOTALS);
-        values.remove(Mms.MBOX_TOTALS);
-        values.remove(Mms.MBOX_TOTALS_TOKEN);
-        values.remove(Mms.QUOTAS);
-        values.remove(Mms.MBOX_QUOTAS);
-        values.remove(Mms.MBOX_QUOTAS_TOKEN);
-        values.remove(Mms.MESSAGE_COUNT);
-        values.remove(Mms.START);
-        values.remove(Mms.DISTRIBUTION_INDICATOR);
-        values.remove(Mms.ELEMENT_DESCRIPTOR);
-        values.remove(Mms.LIMIT);
-        values.remove(Mms.RECOMMENDED_RETRIEVAL_MODE);
-        values.remove(Mms.RECOMMENDED_RETRIEVAL_MODE_TEXT);
-        values.remove(Mms.STATUS_TEXT);
-        values.remove(Mms.APPLIC_ID);
-        values.remove(Mms.REPLY_APPLIC_ID);
-        values.remove(Mms.AUX_APPLIC_ID);
-        values.remove(Mms.DRM_CONTENT);
-        values.remove(Mms.ADAPTATION_ALLOWED);
-        values.remove(Mms.REPLACE_ID);
-        values.remove(Mms.CANCEL_ID);
-        values.remove(Mms.CANCEL_STATUS);
-
-        // Keys shouldn't be inserted or updated.
-        values.remove(Mms._ID);
-    }
-
-    private void notifyChange() {
-        getContext().getContentResolver().notifyChange(
-                MmsSms.CONTENT_URI, null);
-    }
-
-    private final static String TAG = "MmsProvider";
-    private final static String VND_ANDROID_MMS = "vnd.android/mms";
-    private final static String VND_ANDROID_DIR_MMS = "vnd.android-dir/mms";
-    private final static boolean DEBUG = false;
-    private final static boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV;
-
-    private static final int MMS_ALL                      = 0;
-    private static final int MMS_ALL_ID                   = 1;
-    private static final int MMS_INBOX                    = 2;
-    private static final int MMS_INBOX_ID                 = 3;
-    private static final int MMS_SENT                     = 4;
-    private static final int MMS_SENT_ID                  = 5;
-    private static final int MMS_DRAFTS                   = 6;
-    private static final int MMS_DRAFTS_ID                = 7;
-    private static final int MMS_OUTBOX                   = 8;
-    private static final int MMS_OUTBOX_ID                = 9;
-    private static final int MMS_ALL_PART                 = 10;
-    private static final int MMS_MSG_PART                 = 11;
-    private static final int MMS_PART_ID                  = 12;
-    private static final int MMS_MSG_ADDR                 = 13;
-    private static final int MMS_SENDING_RATE             = 14;
-    private static final int MMS_REPORT_STATUS          = 15;
-    private static final int MMS_REPORT_REQUEST = 16;
-    private static final int MMS_DRM_STORAGE              = 17;
-    private static final int MMS_DRM_STORAGE_ID           = 18;
-
-    private static final UriMatcher
-            sURLMatcher = new UriMatcher(UriMatcher.NO_MATCH);
-
-    static {
-        sURLMatcher.addURI("mms", null,         MMS_ALL);
-        sURLMatcher.addURI("mms", "#",          MMS_ALL_ID);
-        sURLMatcher.addURI("mms", "inbox",      MMS_INBOX);
-        sURLMatcher.addURI("mms", "inbox/#",    MMS_INBOX_ID);
-        sURLMatcher.addURI("mms", "sent",       MMS_SENT);
-        sURLMatcher.addURI("mms", "sent/#",     MMS_SENT_ID);
-        sURLMatcher.addURI("mms", "drafts",     MMS_DRAFTS);
-        sURLMatcher.addURI("mms", "drafts/#",   MMS_DRAFTS_ID);
-        sURLMatcher.addURI("mms", "outbox",     MMS_OUTBOX);
-        sURLMatcher.addURI("mms", "outbox/#",   MMS_OUTBOX_ID);
-        sURLMatcher.addURI("mms", "part",       MMS_ALL_PART);
-        sURLMatcher.addURI("mms", "#/part",     MMS_MSG_PART);
-        sURLMatcher.addURI("mms", "part/#",     MMS_PART_ID);
-        sURLMatcher.addURI("mms", "#/addr",     MMS_MSG_ADDR);
-        sURLMatcher.addURI("mms", "rate",       MMS_SENDING_RATE);
-        sURLMatcher.addURI("mms", "report-status/#",  MMS_REPORT_STATUS);
-        sURLMatcher.addURI("mms", "report-request/#", MMS_REPORT_REQUEST);
-        sURLMatcher.addURI("mms", "drm",        MMS_DRM_STORAGE);
-        sURLMatcher.addURI("mms", "drm/#",      MMS_DRM_STORAGE_ID);
-    }
-
-    private SQLiteOpenHelper mOpenHelper;
-
-    private static String concatSelections(String selection1, String selection2) {
-        if (TextUtils.isEmpty(selection1)) {
-            return selection2;
-        } else if (TextUtils.isEmpty(selection2)) {
-            return selection1;
-        } else {
-            return selection1 + " AND " + selection2;
-        }
-    }
-}
-
diff --git a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
deleted file mode 100644
index 1644186..0000000
--- a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
+++ /dev/null
@@ -1,2031 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.providers.telephony;
-
-import static com.google.android.mms.pdu.PduHeaders.MESSAGE_TYPE_DELIVERY_IND;
-import static com.google.android.mms.pdu.PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND;
-import static com.google.android.mms.pdu.PduHeaders.MESSAGE_TYPE_READ_ORIG_IND;
-import static com.google.android.mms.pdu.PduHeaders.MESSAGE_TYPE_READ_REC_IND;
-import static com.google.android.mms.pdu.PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF;
-import static com.google.android.mms.pdu.PduHeaders.MESSAGE_TYPE_SEND_REQ;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.provider.BaseColumns;
-import android.provider.Telephony.Mms;
-import android.provider.Telephony.MmsSms;
-import android.provider.Telephony.Sms;
-import android.provider.Telephony.Threads;
-import android.provider.Telephony.Mms.Addr;
-import android.provider.Telephony.Mms.Part;
-import android.provider.Telephony.Mms.Rate;
-import android.provider.Telephony.MmsSms.PendingMessages;
-import android.util.Log;
-
-public class MmsSmsDatabaseHelper extends SQLiteOpenHelper {
-    private static final String TAG = "MmsSmsDatabaseHelper";
-
-    private static final String SMS_UPDATE_THREAD_READ_BODY =
-                        "  UPDATE threads SET read = " +
-                        "    CASE (SELECT COUNT(*)" +
-                        "          FROM sms" +
-                        "          WHERE " + Sms.READ + " = 0" +
-                        "            AND " + Sms.THREAD_ID + " = threads._id)" +
-                        "      WHEN 0 THEN 1" +
-                        "      ELSE 0" +
-                        "    END" +
-                        "  WHERE threads._id = new." + Sms.THREAD_ID + "; ";
-
-    private static final String UPDATE_THREAD_COUNT_ON_NEW =
-                        "  UPDATE threads SET message_count = " +
-                        "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                        "      ON threads._id = " + Sms.THREAD_ID +
-                        "      WHERE " + Sms.THREAD_ID + " = new.thread_id" +
-                        "        AND sms." + Sms.TYPE + " != 3) + " +
-                        "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                        "      ON threads._id = " + Mms.THREAD_ID +
-                        "      WHERE " + Mms.THREAD_ID + " = new.thread_id" +
-                        "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                        "        AND " + Mms.MESSAGE_BOX + " != 3) " +
-                        "  WHERE threads._id = new.thread_id; ";
-
-    private static final String UPDATE_THREAD_COUNT_ON_OLD =
-                        "  UPDATE threads SET message_count = " +
-                        "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                        "      ON threads._id = " + Sms.THREAD_ID +
-                        "      WHERE " + Sms.THREAD_ID + " = old.thread_id" +
-                        "        AND sms." + Sms.TYPE + " != 3) + " +
-                        "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                        "      ON threads._id = " + Mms.THREAD_ID +
-                        "      WHERE " + Mms.THREAD_ID + " = old.thread_id" +
-                        "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                        "        AND " + Mms.MESSAGE_BOX + " != 3) " +
-                        "  WHERE threads._id = old.thread_id; ";
-
-    private static final String SMS_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE =
-                        "BEGIN" +
-                        "  UPDATE threads SET" +
-                        "    date = (strftime('%s','now') * 1000), " +
-                        "    snippet = new." + Sms.BODY + ", " +
-                        "    snippet_cs = 0" +
-                        "  WHERE threads._id = new." + Sms.THREAD_ID + "; " +
-                        UPDATE_THREAD_COUNT_ON_NEW +
-                        SMS_UPDATE_THREAD_READ_BODY +
-                        "END;";
-
-    private static final String PDU_UPDATE_THREAD_CONSTRAINTS =
-                        "  WHEN new." + Mms.MESSAGE_TYPE + "=" + MESSAGE_TYPE_RETRIEVE_CONF +
-                        "    OR new." + Mms.MESSAGE_TYPE + "=" + MESSAGE_TYPE_NOTIFICATION_IND +
-                        "    OR new." + Mms.MESSAGE_TYPE + "=" + MESSAGE_TYPE_SEND_REQ + " ";
-
-    private static final String PDU_UPDATE_THREAD_READ_BODY =
-                        "  UPDATE threads SET read = " +
-                        "    CASE (SELECT COUNT(*)" +
-                        "          FROM " + MmsProvider.TABLE_PDU +
-                        "          WHERE " + Mms.READ + " = 0" +
-                        "            AND " + Mms.THREAD_ID + " = threads._id)" +
-                        "      WHEN 0 THEN 1" +
-                        "      ELSE 0" +
-                        "    END" +
-                        "  WHERE threads._id = new." + Mms.THREAD_ID + "; ";
-
-    private static final String PDU_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE =
-                        "BEGIN" +
-                        "  UPDATE threads SET" +
-                        "    date = (strftime('%s','now') * 1000), " +
-                        "    snippet = new." + Mms.SUBJECT + ", " +
-                        "    snippet_cs = new." + Mms.SUBJECT_CHARSET +
-                        "  WHERE threads._id = new." + Mms.THREAD_ID + "; " +
-                        UPDATE_THREAD_COUNT_ON_NEW +
-                        PDU_UPDATE_THREAD_READ_BODY +
-                        "END;";
-
-    private static final String UPDATE_THREAD_SNIPPET_SNIPPET_CS_ON_DELETE =
-                        "  UPDATE threads SET snippet = " +
-                        "   (SELECT snippet FROM" +
-                        "     (SELECT date * 1000 AS date, sub AS snippet, thread_id FROM pdu" +
-                        "      UNION SELECT date, body AS snippet, thread_id FROM sms)" +
-                        "    WHERE thread_id = OLD.thread_id ORDER BY date DESC LIMIT 1) " +
-                        "  WHERE threads._id = OLD.thread_id; " +
-                        "  UPDATE threads SET snippet_cs = " +
-                        "   (SELECT snippet_cs FROM" +
-                        "     (SELECT date * 1000 AS date, sub_cs AS snippet_cs, thread_id FROM pdu" +
-                        "      UNION SELECT date, 0 AS snippet_cs, thread_id FROM sms)" +
-                        "    WHERE thread_id = OLD.thread_id ORDER BY date DESC LIMIT 1) " +
-                        "  WHERE threads._id = OLD.thread_id; ";
-
-    private static MmsSmsDatabaseHelper mInstance = null;
-
-    static final String DATABASE_NAME = "mmssms.db";
-    static final int DATABASE_VERSION = 41;
-
-    private MmsSmsDatabaseHelper(Context context) {
-        super(context, DATABASE_NAME, null, DATABASE_VERSION);
-    }
-
-    /**
-     * Return a singleton helper for the combined MMS and SMS
-     * database.
-     */
-    /* package */ static synchronized MmsSmsDatabaseHelper getInstance(Context context) {
-        if (mInstance == null) {
-            mInstance = new MmsSmsDatabaseHelper(context);
-        }
-        return mInstance;
-    }
-
-    public static void updateThread(SQLiteDatabase db, long thread_id) {
-        if (thread_id < 0) {
-            updateAllThreads(db, null, null);
-            return;
-        }
-        
-        // Delete the row for this thread in the threads table if
-        // there are no more messages attached to it in either
-        // the sms or pdu tables.
-        int rows = db.delete("threads",
-                  "_id = ? AND _id NOT IN" +
-                  "          (SELECT thread_id FROM sms " +
-                  "           UNION SELECT thread_id FROM pdu)",
-                  new String[] { String.valueOf(thread_id) });
-        if (rows > 0) {
-            // If this deleted a row, we have no more work to do.
-            return;
-        }
-        // Update the message count in the threads table as the sum
-        // of all messages in both the sms and pdu tables.
-        db.execSQL(
-            "  UPDATE threads SET message_count = " +
-            "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-            "      ON threads._id = " + Sms.THREAD_ID +
-            "      WHERE " + Sms.THREAD_ID + " = " + thread_id +
-            "        AND sms." + Sms.TYPE + " != 3) + " +
-            "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-            "      ON threads._id = " + Mms.THREAD_ID +
-            "      WHERE " + Mms.THREAD_ID + " = " + thread_id +
-            "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-            "        AND " + Mms.MESSAGE_BOX + " != 3) " +
-            "  WHERE threads._id = " + thread_id + ";");
-
-        // Update the date and the snippet (and its character set) in
-        // the threads table to be that of the most recent message in
-        // the thread.
-        db.execSQL(
-            "  UPDATE threads" + 
-            "  SET" + 
-            "  date =" + 
-            "    (SELECT date FROM" + 
-            "        (SELECT date * 1000 AS date, thread_id FROM pdu" + 
-            "         UNION SELECT date, thread_id FROM sms)" + 
-            "     WHERE thread_id = " + thread_id + " ORDER BY date DESC LIMIT 1)," + 
-            "  snippet =" + 
-            "    (SELECT snippet FROM" + 
-            "        (SELECT date * 1000 AS date, sub AS snippet, thread_id FROM pdu" + 
-            "         UNION SELECT date, body AS snippet, thread_id FROM sms)" + 
-            "     WHERE thread_id = " + thread_id + " ORDER BY date DESC LIMIT 1)," + 
-            "  snippet_cs =" + 
-            "    (SELECT snippet_cs FROM" + 
-            "        (SELECT date * 1000 AS date, sub_cs AS snippet_cs, thread_id FROM pdu" + 
-            "         UNION SELECT date, 0 AS snippet_cs, thread_id FROM sms)" + 
-            "     WHERE thread_id = " + thread_id + " ORDER BY date DESC LIMIT 1)" + 
-            "  WHERE threads._id = " + thread_id + ";"); 
-
-        // Update the error column of the thread to indicate if there
-        // are any messages in it that have failed to send.
-        db.execSQL(
-            "UPDATE threads SET error =" +
-            "       (SELECT COUNT(*) FROM sms WHERE type=5" +
-            "        AND thread_id = " + thread_id + " LIMIT 1)" +
-            "   WHERE threads._id = " + thread_id + ";");
-    }
-    
-    public static void updateAllThreads(SQLiteDatabase db, String where, String[] whereArgs) {
-        if (where == null) {
-            where = "";
-        } else {
-            where = "WHERE (" + where + ")";
-        }
-        String query = "SELECT _id FROM threads WHERE _id IN " +
-                       "(SELECT DISTINCT thread_id FROM sms " + where + ")";
-        Cursor c = db.rawQuery(query, whereArgs);
-        if (c != null) {
-            while (c.moveToNext()) {
-                updateThread(db, c.getInt(0));
-            }
-            c.close();
-        }
-    }
-    
-    public static int deleteOneSms(SQLiteDatabase db, int message_id) {
-        int thread_id = -1;
-        // Find the thread ID that the specified SMS belongs to.
-        Cursor c = db.query("sms", new String[] { "thread_id" },
-                            "_id=" + message_id, null, null, null, null);
-        if (c != null) {
-            if (c.moveToFirst()) {
-                thread_id = c.getInt(0);
-            }
-            c.close();
-        }
-
-        // Delete the specified message.
-        int rows = db.delete("sms", "_id=" + message_id, null);
-        if (thread_id > 0) {
-            // Update its thread.
-            updateThread(db, thread_id);
-        }
-        return rows;
-    }
-
-    @Override
-    public void onCreate(SQLiteDatabase db) {
-        createMmsTables(db);
-        createSmsTables(db);
-        createCommonTables(db);
-        createCommonTriggers(db);
-        createMmsTriggers(db);
-    }
-
-    private void createMmsTables(SQLiteDatabase db) {
-        // N.B.: Whenever the columns here are changed, the columns in
-        // {@ref MmsSmsProvider} must be changed to match.
-        db.execSQL("CREATE TABLE " + MmsProvider.TABLE_PDU + " (" +
-                   Mms._ID + " INTEGER PRIMARY KEY," +
-                   Mms.THREAD_ID + " INTEGER," +
-                   Mms.DATE + " INTEGER," +
-                   Mms.MESSAGE_BOX + " INTEGER," +
-                   Mms.READ + " INTEGER DEFAULT 0," +
-                   Mms.MESSAGE_ID + " TEXT," +
-                   Mms.SUBJECT + " TEXT," +
-                   Mms.SUBJECT_CHARSET + " INTEGER," +
-                   Mms.CONTENT_TYPE + " TEXT," +
-                   Mms.CONTENT_LOCATION + " TEXT," +
-                   Mms.EXPIRY + " INTEGER," +
-                   Mms.MESSAGE_CLASS + " TEXT," +
-                   Mms.MESSAGE_TYPE + " INTEGER," +
-                   Mms.MMS_VERSION + " INTEGER," +
-                   Mms.MESSAGE_SIZE + " INTEGER," +
-                   Mms.PRIORITY + " INTEGER," +
-                   Mms.READ_REPORT + " INTEGER," +
-                   Mms.REPORT_ALLOWED + " INTEGER," +
-                   Mms.RESPONSE_STATUS + " INTEGER," +
-                   Mms.STATUS + " INTEGER," +
-                   Mms.TRANSACTION_ID + " TEXT," +
-                   Mms.RETRIEVE_STATUS + " INTEGER," +
-                   Mms.RETRIEVE_TEXT + " TEXT," +
-                   Mms.RETRIEVE_TEXT_CHARSET + " INTEGER," +
-                   Mms.READ_STATUS + " INTEGER," +
-                   Mms.CONTENT_CLASS + " INTEGER," +
-                   Mms.RESPONSE_TEXT + " TEXT," +
-                   Mms.DELIVERY_TIME + " INTEGER," +
-                   Mms.DELIVERY_REPORT + " INTEGER);");
-
-        db.execSQL("CREATE TABLE " + MmsProvider.TABLE_ADDR + " (" +
-                   Addr._ID + " INTEGER PRIMARY KEY," +
-                   Addr.MSG_ID + " INTEGER," +
-                   Addr.CONTACT_ID + " INTEGER," +
-                   Addr.ADDRESS + " TEXT," +
-                   Addr.TYPE + " INTEGER," +
-                   Addr.CHARSET + " INTEGER);");
-
-        db.execSQL("CREATE TABLE " + MmsProvider.TABLE_PART + " (" +
-                   Part._ID + " INTEGER PRIMARY KEY," +
-                   Part.MSG_ID + " INTEGER," +
-                   Part.SEQ + " INTEGER DEFAULT 0," +
-                   Part.CONTENT_TYPE + " TEXT," +
-                   Part.NAME + " TEXT," +
-                   Part.CHARSET + " INTEGER," +
-                   Part.CONTENT_DISPOSITION + " TEXT," +
-                   Part.FILENAME + " TEXT," +
-                   Part.CONTENT_ID + " TEXT," +
-                   Part.CONTENT_LOCATION + " TEXT," +
-                   Part.CT_START + " INTEGER," +
-                   Part.CT_TYPE + " TEXT," +
-                   Part._DATA + " TEXT);");
-
-        db.execSQL("CREATE TABLE " + MmsProvider.TABLE_RATE + " (" +
-                   Rate.SENT_TIME + " INTEGER);");
-
-        db.execSQL("CREATE TABLE " + MmsProvider.TABLE_DRM + " (" +
-                   BaseColumns._ID + " INTEGER PRIMARY KEY," +
-                   "_data TEXT);");
-    }
-
-    private void createMmsTriggers(SQLiteDatabase db) {
-        // Cleans up parts when a MM is deleted.
-        db.execSQL("CREATE TRIGGER part_cleanup DELETE ON " + MmsProvider.TABLE_PDU + " " +
-                   "BEGIN " +
-                   "  DELETE FROM " + MmsProvider.TABLE_PART +
-                   "  WHERE " + Part.MSG_ID + "=old._id;" +
-                   "END;");
-
-        // Cleans up address info when a MM is deleted.
-        db.execSQL("CREATE TRIGGER addr_cleanup DELETE ON " + MmsProvider.TABLE_PDU + " " +
-                   "BEGIN " +
-                   "  DELETE FROM " + MmsProvider.TABLE_ADDR +
-                   "  WHERE " + Addr.MSG_ID + "=old._id;" +
-                   "END;");
-
-        // Delete obsolete delivery-report, read-report while deleting their
-        // associated Send.req.
-        db.execSQL("CREATE TRIGGER cleanup_delivery_and_read_report " +
-                   "AFTER DELETE ON " + MmsProvider.TABLE_PDU + " " +
-                   "WHEN old." + Mms.MESSAGE_TYPE + "=" + MESSAGE_TYPE_SEND_REQ + " " +
-                   "BEGIN " +
-                   "  DELETE FROM " + MmsProvider.TABLE_PDU +
-                   "  WHERE (" + Mms.MESSAGE_TYPE + "=" + MESSAGE_TYPE_DELIVERY_IND +
-                   "    OR " + Mms.MESSAGE_TYPE + "=" + MESSAGE_TYPE_READ_ORIG_IND + ")" +
-                   "    AND " + Mms.MESSAGE_ID + "=old." + Mms.MESSAGE_ID + "; " +
-                   "END;");
-    }
-
-    private void createSmsTables(SQLiteDatabase db) {
-        // N.B.: Whenever the columns here are changed, the columns in
-        // {@ref MmsSmsProvider} must be changed to match.
-        db.execSQL("CREATE TABLE sms (" +
-                   "_id INTEGER PRIMARY KEY," +
-                   "thread_id INTEGER," +
-                   "address TEXT," +
-                   "person INTEGER," +
-                   "date INTEGER," +
-                   "protocol INTEGER," +
-                   "read INTEGER DEFAULT 0," +
-                   "status INTEGER DEFAULT -1," + // a TP-Status value
-                                                  // or -1 if it
-                                                  // status hasn't
-                                                  // been received
-                   "type INTEGER," +
-                   "reply_path_present INTEGER," +
-                   "subject TEXT," +
-                   "body TEXT," +
-                   "service_center TEXT);");
-
-        /**
-         * This table is used by the SMS dispatcher to hold
-         * incomplete partial messages until all the parts arrive.
-         */
-        db.execSQL("CREATE TABLE raw (" +
-                   "_id INTEGER PRIMARY KEY," +
-                   "date INTEGER," +
-                   "reference_number INTEGER," + // one per full message
-                   "count INTEGER," + // the number of parts
-                   "sequence INTEGER," + // the part number of this message
-                   "destination_port INTEGER," +
-                   "address TEXT," +
-                   "pdu TEXT);"); // the raw PDU for this part
-
-        db.execSQL("CREATE TABLE attachments (" +
-                   "sms_id INTEGER," +
-                   "content_url TEXT," +
-                   "offset INTEGER);");
-
-        /**
-         * This table is used by the SMS dispatcher to hold pending
-         * delivery status report intents.
-         */
-        db.execSQL("CREATE TABLE sr_pending (" +
-                   "reference_number INTEGER," +
-                   "action TEXT," +
-                   "data TEXT);");
-    }
-
-    private void createCommonTables(SQLiteDatabase db) {
-        // TODO Ensure that each entry is removed when the last use of
-        // any address equivalent to its address is removed.
-
-        /**
-         * This table maps the first instance seen of any particular
-         * MMS/SMS address to an ID, which is then used as its
-         * canonical representation.  If the same address or an
-         * equivalent address (as determined by our Sqlite
-         * PHONE_NUMBERS_EQUAL extension) is seen later, this same ID
-         * will be used.
-         */
-        db.execSQL("CREATE TABLE canonical_addresses (" +
-                   "_id INTEGER PRIMARY KEY," +
-                   "address TEXT);");
-
-        /**
-         * This table maps the subject and an ordered set of recipient
-         * IDs, separated by spaces, to a unique thread ID.  The IDs
-         * come from the canonical_addresses table.  This works
-         * because messages are considered to be part of the same
-         * thread if they have the same subject (or a null subject)
-         * and the same set of recipients.
-         */
-        db.execSQL("CREATE TABLE threads (" +
-                   Threads._ID + " INTEGER PRIMARY KEY," +
-                   Threads.DATE + " INTEGER DEFAULT 0," +
-                   Threads.MESSAGE_COUNT + " INTEGER DEFAULT 0," +
-                   Threads.RECIPIENT_IDS + " TEXT," +
-                   Threads.SNIPPET + " TEXT," +
-                   Threads.SNIPPET_CHARSET + " INTEGER DEFAULT 0," +
-                   Threads.READ + " INTEGER DEFAULT 1," +
-                   Threads.TYPE + " INTEGER DEFAULT 0," +
-                   Threads.ERROR + " INTEGER DEFAULT 0);");
-
-        /**
-         * This table stores the queue of messages to be sent/downloaded.
-         */
-        db.execSQL("CREATE TABLE " + MmsSmsProvider.TABLE_PENDING_MSG +" (" +
-                   PendingMessages._ID + " INTEGER PRIMARY KEY," +
-                   PendingMessages.PROTO_TYPE + " INTEGER," +
-                   PendingMessages.MSG_ID + " INTEGER," +
-                   PendingMessages.MSG_TYPE + " INTEGER," +
-                   PendingMessages.ERROR_TYPE + " INTEGER," +
-                   PendingMessages.ERROR_CODE + " INTEGER," +
-                   PendingMessages.RETRY_INDEX + " INTEGER NOT NULL DEFAULT 0," +
-                   PendingMessages.DUE_TIME + " INTEGER," +
-                   PendingMessages.LAST_TRY + " INTEGER);");
-
-    }
-
-    // TODO Check the query plans for these triggers.
-    private void createCommonTriggers(SQLiteDatabase db) {
-        // Updates threads table whenever a message is added to pdu.
-        db.execSQL("CREATE TRIGGER pdu_update_thread_on_insert AFTER INSERT ON " +
-                   MmsProvider.TABLE_PDU + " " +
-                   PDU_UPDATE_THREAD_CONSTRAINTS +
-                   PDU_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE);
-
-        // Updates threads table whenever a message is added to sms.
-        db.execSQL("CREATE TRIGGER sms_update_thread_on_insert AFTER INSERT ON sms " +
-                   SMS_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE);
-
-        // Updates threads table whenever a message in pdu is updated.
-        db.execSQL("CREATE TRIGGER pdu_update_thread_date_subject_on_update AFTER" +
-                   "  UPDATE OF " + Mms.DATE + ", " + Mms.SUBJECT + ", " + Mms.MESSAGE_BOX +
-                   "  ON " + MmsProvider.TABLE_PDU + " " +
-                   PDU_UPDATE_THREAD_CONSTRAINTS +
-                   PDU_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE);
-
-        // Updates threads table whenever a message in sms is updated.
-        db.execSQL("CREATE TRIGGER sms_update_thread_date_subject_on_update AFTER" +
-                   "  UPDATE OF " + Sms.DATE + ", " + Sms.BODY + ", " + Sms.TYPE +
-                   "  ON sms " +
-                   SMS_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE);
-
-        // Updates threads table whenever a message in pdu is updated.
-        db.execSQL("CREATE TRIGGER pdu_update_thread_read_on_update AFTER" +
-                   "  UPDATE OF " + Mms.READ +
-                   "  ON " + MmsProvider.TABLE_PDU + " " +
-                   PDU_UPDATE_THREAD_CONSTRAINTS +
-                   "BEGIN " +
-                   PDU_UPDATE_THREAD_READ_BODY +
-                   "END;");
-
-        // Updates threads table whenever a message in sms is updated.
-        db.execSQL("CREATE TRIGGER sms_update_thread_read_on_update AFTER" +
-                   "  UPDATE OF " + Sms.READ +
-                   "  ON sms " +
-                   "BEGIN " +
-                   SMS_UPDATE_THREAD_READ_BODY +
-                   "END;");
-
-        // Update threads table whenever a message in pdu is deleted
-        db.execSQL("CREATE TRIGGER pdu_update_thread_on_delete " +
-                   "AFTER DELETE ON pdu " +
-                   "BEGIN " +
-                   "  UPDATE threads SET " +
-                   "     date = (strftime('%s','now') * 1000)" +
-                   "  WHERE threads._id = old." + Mms.THREAD_ID + "; " +
-                   UPDATE_THREAD_COUNT_ON_OLD +
-                   UPDATE_THREAD_SNIPPET_SNIPPET_CS_ON_DELETE +
-                   "END;");
-
-        // When the last message in a thread is deleted, these
-        // triggers ensure that the entry for its thread ID is removed
-        // from the threads table.
-        db.execSQL("CREATE TRIGGER delete_obsolete_threads_pdu " +
-                   "AFTER DELETE ON pdu " +
-                   "BEGIN " +
-                   "  DELETE FROM threads " +
-                   "  WHERE " +
-                   "    _id = old.thread_id " +
-                   "    AND _id NOT IN " +
-                   "    (SELECT thread_id FROM sms " +
-                   "     UNION SELECT thread_id from pdu); " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER delete_obsolete_threads_when_update_pdu " +
-                   "AFTER UPDATE OF " + Mms.THREAD_ID + " ON pdu " +
-                   "WHEN old." + Mms.THREAD_ID + " != new." + Mms.THREAD_ID + " " +
-                   "BEGIN " +
-                   "  DELETE FROM threads " +
-                   "  WHERE " +
-                   "    _id = old.thread_id " +
-                   "    AND _id NOT IN " +
-                   "    (SELECT thread_id FROM sms " +
-                   "     UNION SELECT thread_id from pdu); " +
-                   "END;");
-        // Insert pending status for M-Notification.ind or M-ReadRec.ind
-        // when they are inserted into Inbox/Outbox.
-        db.execSQL("CREATE TRIGGER insert_mms_pending_on_insert " +
-                   "AFTER INSERT ON pdu " +
-                   "WHEN new." + Mms.MESSAGE_TYPE + "=" + MESSAGE_TYPE_NOTIFICATION_IND +
-                   "  OR new." + Mms.MESSAGE_TYPE + "=" + MESSAGE_TYPE_READ_REC_IND + " " +
-                   "BEGIN " +
-                   "  INSERT INTO " + MmsSmsProvider.TABLE_PENDING_MSG +
-                   "    (" + PendingMessages.PROTO_TYPE + "," +
-                   "     " + PendingMessages.MSG_ID + "," +
-                   "     " + PendingMessages.MSG_TYPE + "," +
-                   "     " + PendingMessages.ERROR_TYPE + "," +
-                   "     " + PendingMessages.ERROR_CODE + "," +
-                   "     " + PendingMessages.RETRY_INDEX + "," +
-                   "     " + PendingMessages.DUE_TIME + ") " +
-                   "  VALUES " +
-                   "    (" + MmsSms.MMS_PROTO + "," +
-                   "      new." + BaseColumns._ID + "," +
-                   "      new." + Mms.MESSAGE_TYPE + ",0,0,0,0);" +
-                   "END;");
-
-        // Insert pending status for M-Send.req when it is moved into Outbox.
-        db.execSQL("CREATE TRIGGER insert_mms_pending_on_update " +
-                   "AFTER UPDATE ON pdu " +
-                   "WHEN new." + Mms.MESSAGE_TYPE + "=" + MESSAGE_TYPE_SEND_REQ +
-                   "  AND new." + Mms.MESSAGE_BOX + "=" + Mms.MESSAGE_BOX_OUTBOX +
-                   "  AND old." + Mms.MESSAGE_BOX + "!=" + Mms.MESSAGE_BOX_OUTBOX + " " +
-                   "BEGIN " +
-                   "  INSERT INTO " + MmsSmsProvider.TABLE_PENDING_MSG +
-                   "    (" + PendingMessages.PROTO_TYPE + "," +
-                   "     " + PendingMessages.MSG_ID + "," +
-                   "     " + PendingMessages.MSG_TYPE + "," +
-                   "     " + PendingMessages.ERROR_TYPE + "," +
-                   "     " + PendingMessages.ERROR_CODE + "," +
-                   "     " + PendingMessages.RETRY_INDEX + "," +
-                   "     " + PendingMessages.DUE_TIME + ") " +
-                   "  VALUES " +
-                   "    (" + MmsSms.MMS_PROTO + "," +
-                   "      new." + BaseColumns._ID + "," +
-                   "      new." + Mms.MESSAGE_TYPE + ",0,0,0,0);" +
-                   "END;");
-
-        // When a message is moved out of Outbox, delete its pending status.
-        db.execSQL("CREATE TRIGGER delete_mms_pending_on_update " +
-                   "AFTER UPDATE ON " + MmsProvider.TABLE_PDU + " " +
-                   "WHEN old." + Mms.MESSAGE_BOX + "=" + Mms.MESSAGE_BOX_OUTBOX +
-                   "  AND new." + Mms.MESSAGE_BOX + "!=" + Mms.MESSAGE_BOX_OUTBOX + " " +
-                   "BEGIN " +
-                   "  DELETE FROM " + MmsSmsProvider.TABLE_PENDING_MSG +
-                   "  WHERE " + PendingMessages.MSG_ID + "=new._id; " +
-                   "END;");
-
-        // Delete pending status for a message when it is deleted.
-        db.execSQL("CREATE TRIGGER delete_mms_pending_on_delete " +
-                   "AFTER DELETE ON " + MmsProvider.TABLE_PDU + " " +
-                   "BEGIN " +
-                   "  DELETE FROM " + MmsSmsProvider.TABLE_PENDING_MSG +
-                   "  WHERE " + PendingMessages.MSG_ID + "=old._id; " +
-                   "END;");
-
-        // TODO Add triggers for SMS retry-status management.
-
-        // Update the error flag of threads when the error type of
-        // a pending MM is updated.
-        db.execSQL("CREATE TRIGGER update_threads_error_on_update_mms " +
-                   "  AFTER UPDATE OF err_type ON pending_msgs " +
-                   "  WHEN (OLD.err_type < 10 AND NEW.err_type >= 10)" +
-                   "    OR (OLD.err_type >= 10 AND NEW.err_type < 10) " +
-                   "BEGIN" +
-                   "  UPDATE threads SET error = " +
-                   "    CASE" +
-                   "      WHEN NEW.err_type >= 10 THEN error + 1" +
-                   "      ELSE error - 1" +
-                   "    END " +
-                   "  WHERE _id =" +
-                   "   (SELECT DISTINCT thread_id" +
-                   "    FROM pdu" +
-                   "    WHERE _id = NEW.msg_id); " +
-                   "END;");
-
-        // Update the error flag of threads when delete pending message.
-        db.execSQL("CREATE TRIGGER update_threads_error_on_delete_mms " +
-                   "  BEFORE DELETE ON pdu" +
-                   "  WHEN OLD._id IN (SELECT DISTINCT msg_id" +
-                   "                   FROM pending_msgs" +
-                   "                   WHERE err_type >= 10) " +
-                   "BEGIN " +
-                   "  UPDATE threads SET error = error - 1" +
-                   "  WHERE _id = OLD.thread_id; " +
-                   "END;");
-
-        // Update the error flag of threads while moving an MM out of Outbox,
-        // which was failed to be sent permanently.
-        db.execSQL("CREATE TRIGGER update_threads_error_on_move_mms " +
-                   "  BEFORE UPDATE OF msg_box ON pdu " +
-                   "  WHEN (OLD.msg_box = 4 AND NEW.msg_box != 4) " +
-                   "  AND (OLD._id IN (SELECT DISTINCT msg_id" +
-                   "                   FROM pending_msgs" +
-                   "                   WHERE err_type >= 10)) " +
-                   "BEGIN " +
-                   "  UPDATE threads SET error = error - 1" +
-                   "  WHERE _id = OLD.thread_id; " +
-                   "END;");
-
-        // Update the error flag of threads after a text message was
-        // failed to send/receive.
-        db.execSQL("CREATE TRIGGER update_threads_error_on_update_sms " +
-                   "  AFTER UPDATE OF type ON sms" +
-                   "  WHEN (OLD.type != 5 AND NEW.type = 5)" +
-                   "    OR (OLD.type = 5 AND NEW.type != 5) " +
-                   "BEGIN " +
-                   "  UPDATE threads SET error = " +
-                   "    CASE" +
-                   "      WHEN NEW.type = 5 THEN error + 1" +
-                   "      ELSE error - 1" +
-                   "    END " +
-                   "  WHERE _id = NEW.thread_id; " +
-                   "END;");
-    }
-
-    @Override
-    public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) {
-        Log.w(TAG, "Upgrading database from version " + oldVersion
-                + " to " + currentVersion + ".");
-
-        switch (oldVersion) {
-            case 24:
-                if (currentVersion <= 24) {
-                    return;
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion25(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 25:
-                if (currentVersion <= 25) {
-                    return;
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion26(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 26:
-                if (currentVersion <= 26) {
-                    return;
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion27(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 27:
-                if (currentVersion <= 27) {
-                    return;
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion28(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 28:
-                if (currentVersion <= 28) {
-                    return;
-                }
-
-                // Test whether this database file is from TC2 branch.
-                Cursor c = db.rawQuery("SELECT * FROM threads", null);
-                if (c != null) {
-                    try {
-                        c.getColumnIndexOrThrow("snippet_cs");
-                    } catch (IllegalArgumentException e) {
-                        // Column 'snippet_cs' doesn't exist, which means
-                        // this database file was maintained by TC2 branch
-                        // and its version is inconsistent.
-                        Log.w(TAG, "Upgrade database file from TC2!!!");
-                        db.beginTransaction();
-                        try {
-                            upgradeDatabaseToVersion28(db);
-                            db.setTransactionSuccessful();
-                        } catch (Throwable ex) {
-                            Log.e(TAG, ex.getMessage(), ex);
-                            break; // force to destroy all old data;
-                        } finally {
-                            db.endTransaction();
-                        }
-                    } finally {
-                        c.close();
-                    }
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion29(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 29:
-                if (currentVersion <= 29) {
-                    return;
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion30(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 30:
-                if (currentVersion <= 30) {
-                    return;
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion31(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 31:
-                if (currentVersion <= 31) {
-                    return;
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion32(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 32:
-                if (currentVersion <= 32) {
-                    return;
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion33(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 33:
-                if (currentVersion <= 33) {
-                    return;
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion34(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 34:
-                if (currentVersion <= 34) {
-                    return;
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion35(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 35:
-                if (currentVersion <= 35) {
-                    return;
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion36(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 36:
-                if (currentVersion <= 36) {
-                    return;
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion37(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 37:
-                if (currentVersion <= 37) {
-                    return;
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion38(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 38:
-                if (currentVersion <= 38) {
-                    return;
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion39(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 39:
-                if (currentVersion <= 39) {
-                    return;
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion40(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 40:
-                if (currentVersion <= 40) {
-                    return;
-                }
-
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion41(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break; // force to destroy all old data;
-                } finally {
-                    db.endTransaction();
-                }
-                // fall-through
-            case 41:
-                if (currentVersion <= 41) {
-                    return;
-                }
-                db.beginTransaction();
-                try {
-                    upgradeDatabaseToVersion42(db);
-                    db.setTransactionSuccessful();
-                } catch (Throwable ex) {
-                    Log.e(TAG, ex.getMessage(), ex);
-                    break;
-                } finally {
-                    db.endTransaction();
-                }
-                return;
-        }
-
-        Log.w(TAG, "Destroying all old data.");
-        dropCommonTriggers(db);
-        dropMmsTriggers(db);
-        dropCommonTables(db);
-        dropMmsTables(db);
-        dropSmsTables(db);
-        onCreate(db);
-    }
-
-    private void dropCommonTables(SQLiteDatabase db) {
-        db.execSQL("DROP TABLE IF EXISTS canonical_addresses");
-        db.execSQL("DROP TABLE IF EXISTS threads");
-        db.execSQL("DROP TABLE IF EXISTS " + MmsSmsProvider.TABLE_PENDING_MSG);
-    }
-
-    private void dropCommonTriggers(SQLiteDatabase db) {
-        db.execSQL("DROP TRIGGER IF EXISTS delete_obsolete_threads_pdu");
-        db.execSQL("DROP TRIGGER IF EXISTS delete_obsolete_threads_when_update_pdu");
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_on_insert");
-        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_on_insert");
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_date_subject_on_update");
-        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_date_subject_on_update");
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_read_on_update");
-        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_read_on_update");
-        db.execSQL("DROP TRIGGER IF EXISTS insert_mms_pending_on_insert");
-        db.execSQL("DROP TRIGGER IF EXISTS insert_mms_pending_on_update");
-        db.execSQL("DROP TRIGGER IF EXISTS delete_mms_pending_on_update");
-        db.execSQL("DROP TRIGGER IF EXISTS delete_mms_pending_on_delete");
-        db.execSQL("DROP TRIGGER IF EXISTS update_threads_error_on_update_mms");
-        db.execSQL("DROP TRIGGER IF EXISTS update_threads_error_on_delete_mms");
-        db.execSQL("DROP TRIGGER IF EXISTS update_threads_error_on_move_mms");
-        db.execSQL("DROP TRIGGER IF EXISTS update_threads_error_on_update_sms");
-    }
-
-    private void dropSmsTables(SQLiteDatabase db) {
-        db.execSQL("DROP TABLE IF EXISTS sms");
-        db.execSQL("DROP TABLE IF EXISTS newSmsIndicator");
-        db.execSQL("DROP TABLE IF EXISTS raw");
-        db.execSQL("DROP TABLE IF EXISTS attachments");
-        db.execSQL("DROP TABLE IF EXISTS thread_ids");
-        db.execSQL("DROP TABLE IF EXISTS sr_pending");
-    }
-
-    private void dropMmsTables(SQLiteDatabase db) {
-        db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_PDU + ";");
-        db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_ADDR + ";");
-        db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_PART + ";");
-        db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_RATE + ";");
-        db.execSQL("DROP TABLE IF EXISTS " + MmsProvider.TABLE_DRM + ";");
-    }
-
-    private void dropMmsTriggers(SQLiteDatabase db) {
-        db.execSQL("DROP TRIGGER IF EXISTS part_cleanup;");
-        db.execSQL("DROP TRIGGER IF EXISTS addr_cleanup;");
-        db.execSQL("DROP TRIGGER IF EXISTS cleanup_delivery_and_read_report;");
-    }
-
-    private void upgradeDatabaseToVersion25(SQLiteDatabase db) {
-        db.execSQL("ALTER TABLE threads " +
-                   "ADD COLUMN type INTEGER NOT NULL DEFAULT 0;");
-    }
-
-    private void upgradeDatabaseToVersion26(SQLiteDatabase db) {
-        db.execSQL("ALTER TABLE threads " +
-                   "ADD COLUMN error INTEGER DEFAULT 0;");
-
-        // Do NOT use defined symbols when upgrading database
-        // because they may be changed and cannot be applied
-        // to old database.
-        db.execSQL("UPDATE threads SET error = 1 WHERE _id IN" +
-                   "  (SELECT thread_id FROM pdu LEFT JOIN pending_msgs" +
-                   "     ON pdu.thread_id = pending_msgs.msg_id" +
-                   "     WHERE proto_type = 1 AND err_type >= 10" +
-                   "     GROUP BY thread_id); " +
-                   "UPDATE threads SET error = 1 WHERE _id IN" +
-                   "  (SELECT thread_id FROM sms LEFT JOIN pending_msgs" +
-                   "     ON sms.thread_id = pending_msgs.msg_id" +
-                   "     WHERE proto_type = 0 AND err_type >= 10" +
-                   "     GROUP BY thread_id); ");
-
-        db.execSQL("CREATE TRIGGER update_threads_error_on_update " +
-                   "  AFTER UPDATE OF err_type ON pending_msgs " +
-                   "BEGIN " +
-                   "UPDATE threads SET error = 1 WHERE _id IN" +
-                   "  (SELECT thread_id FROM pdu LEFT JOIN pending_msgs" +
-                   "     ON pdu.thread_id = pending_msgs.msg_id" +
-                   "     WHERE proto_type = 1 AND err_type >= 10" +
-                   "     GROUP BY thread_id); " +
-                   "UPDATE threads SET error = 1 WHERE _id IN" +
-                   "  (SELECT thread_id FROM sms LEFT JOIN pending_msgs" +
-                   "     ON sms.thread_id = pending_msgs.msg_id" +
-                   "     WHERE proto_type = 0 AND err_type >= 10" +
-                   "     GROUP BY thread_id); " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER update_threads_error_on_delete " +
-                   "  AFTER DELETE ON pending_msgs " +
-                   "BEGIN " +
-                   "UPDATE threads SET error = 1 WHERE _id IN" +
-                   "  (SELECT thread_id FROM pdu LEFT JOIN pending_msgs" +
-                   "     ON pdu.thread_id = pending_msgs.msg_id" +
-                   "     WHERE proto_type = 1 AND err_type >= 10" +
-                   "     GROUP BY thread_id); " +
-                   "UPDATE threads SET error = 1 WHERE _id IN" +
-                   "  (SELECT thread_id FROM sms LEFT JOIN pending_msgs" +
-                   "     ON sms.thread_id = pending_msgs.msg_id" +
-                   "     WHERE proto_type = 0 AND err_type >= 10" +
-                   "     GROUP BY thread_id); " +
-                   "END;");
-    }
-
-    private void upgradeDatabaseToVersion27(SQLiteDatabase db) {
-        db.execSQL("UPDATE threads SET error = 1 WHERE _id IN" +
-                   "  (SELECT thread_id FROM pdu LEFT JOIN pending_msgs" +
-                   "     ON pdu._id = pending_msgs.msg_id" +
-                   "     WHERE proto_type = 1 AND err_type >= 10" +
-                   "     GROUP BY thread_id); " +
-                   "UPDATE threads SET error = 1 WHERE _id IN" +
-                   "  (SELECT thread_id FROM sms LEFT JOIN pending_msgs" +
-                   "     ON sms._id = pending_msgs.msg_id" +
-                   "     WHERE proto_type = 0 AND err_type >= 10" +
-                   "     GROUP BY thread_id); ");
-
-        db.execSQL("DROP TRIGGER IF EXISTS update_threads_error_on_update");
-        db.execSQL("DROP TRIGGER IF EXISTS update_threads_error_on_delete");
-
-        db.execSQL("CREATE TRIGGER update_threads_error_on_update " +
-                   "  AFTER UPDATE OF err_type ON pending_msgs " +
-                   "BEGIN " +
-                   "UPDATE threads SET error = 1 WHERE _id IN" +
-                   "  (SELECT thread_id FROM pdu LEFT JOIN pending_msgs" +
-                   "     ON pdu._id = pending_msgs.msg_id" +
-                   "     WHERE proto_type = 1 AND err_type >= 10" +
-                   "     GROUP BY thread_id); " +
-                   "UPDATE threads SET error = 1 WHERE _id IN" +
-                   "  (SELECT thread_id FROM sms LEFT JOIN pending_msgs" +
-                   "     ON sms._id = pending_msgs.msg_id" +
-                   "     WHERE proto_type = 0 AND err_type >= 10" +
-                   "     GROUP BY thread_id); " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER update_threads_error_on_delete " +
-                   "  AFTER DELETE ON pending_msgs " +
-                   "BEGIN " +
-                   "UPDATE threads SET error = 1 WHERE _id IN" +
-                   "  (SELECT thread_id FROM pdu LEFT JOIN pending_msgs" +
-                   "     ON pdu._id = pending_msgs.msg_id" +
-                   "     WHERE proto_type = 1 AND err_type >= 10" +
-                   "     GROUP BY thread_id); " +
-                   "UPDATE threads SET error = 1 WHERE _id IN" +
-                   "  (SELECT thread_id FROM sms LEFT JOIN pending_msgs" +
-                   "     ON sms._id = pending_msgs.msg_id" +
-                   "     WHERE proto_type = 0 AND err_type >= 10" +
-                   "     GROUP BY thread_id); " +
-                   "END;");
-    }
-
-    private void upgradeDatabaseToVersion28(SQLiteDatabase db) {
-        db.execSQL("ALTER TABLE threads " +
-                   "ADD COLUMN snippet_cs INTEGER NOT NULL DEFAULT 0;");
-
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_on_insert");
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_date_subject_on_update");
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_read_on_update");
-        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_on_delete");
-
-        db.execSQL("CREATE TRIGGER pdu_update_thread_on_insert AFTER INSERT ON pdu " +
-                   "  WHEN new.msg_box!=5 AND new.msg_box!=3" +
-                   "    AND (new.m_type=132 OR new.m_type=130 OR new.m_type=128) " +
-                   "BEGIN" +
-                   "  UPDATE threads SET" +
-                   "    date = (strftime('%s','now') * 1000), " +
-                   "    snippet = new.sub, " +
-                   "    snippet_cs = new.sub_cs" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "  UPDATE threads SET read = " +
-                   "    CASE (SELECT COUNT(*)" +
-                   "          FROM pdu" +
-                   "          WHERE read = 0 AND thread_id = threads._id)" +
-                   "      WHEN 0 THEN 1 ELSE 0" +
-                   "    END" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER pdu_update_thread_date_subject_on_update AFTER" +
-                   "  UPDATE OF date, sub, msg_box ON pdu " +
-                   "  WHEN new.msg_box!=5 AND new.msg_box!=3" +
-                   "    AND (new.m_type=132 OR new.m_type=130 OR new.m_type=128) " +
-                   "BEGIN" +
-                   "  UPDATE threads SET" +
-                   "    date = (strftime('%s','now') * 1000), " +
-                   "    snippet = new.sub, " +
-                   "    snippet_cs = new.sub_cs" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "  UPDATE threads SET read = " +
-                   "    CASE (SELECT COUNT(*)" +
-                   "          FROM pdu" +
-                   "          WHERE read = 0 AND thread_id = threads._id)" +
-                   "      WHEN 0 THEN 1 ELSE 0" +
-                   "    END" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER pdu_update_thread_read_on_update AFTER" +
-                   "  UPDATE OF read ON pdu " +
-                   "  WHEN new.msg_box!=5 AND new.msg_box!=3" +
-                   "    AND (new.m_type=132 OR new.m_type=130 OR new.m_type=128) " +
-                   "BEGIN " +
-                   "  UPDATE threads SET read = " +
-                   "    CASE (SELECT COUNT(*)" +
-                   "          FROM pdu" +
-                   "          WHERE read = 0 AND thread_id = threads._id)" +
-                   "      WHEN 0 THEN 1 ELSE 0" +
-                   "    END" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER sms_update_thread_on_delete " +
-                   "AFTER DELETE ON sms " +
-                   "BEGIN " +
-                   "  UPDATE threads SET " +
-                   "     date = (strftime('%s','now') * 1000), " +
-                   "     snippet = (SELECT body FROM SMS ORDER BY date DESC LIMIT 1)" +
-                   "  WHERE threads._id = old.thread_id; " +
-                   "END;");
-    }
-
-    private void upgradeDatabaseToVersion29(SQLiteDatabase db) {
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_on_insert");
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_date_subject_on_update");
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_read_on_update");
-
-        db.execSQL("CREATE TRIGGER pdu_update_thread_on_insert AFTER INSERT ON pdu " +
-                   "  WHEN new.m_type=132 OR new.m_type=130 OR new.m_type=128 " +
-                   "BEGIN" +
-                   "  UPDATE threads SET" +
-                   "    date = (strftime('%s','now') * 1000), " +
-                   "    snippet = new.sub, " +
-                   "    snippet_cs = new.sub_cs" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "  UPDATE threads SET read = " +
-                   "    CASE (SELECT COUNT(*)" +
-                   "          FROM pdu" +
-                   "          WHERE read = 0 AND thread_id = threads._id)" +
-                   "      WHEN 0 THEN 1 ELSE 0" +
-                   "    END" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER pdu_update_thread_date_subject_on_update AFTER" +
-                   "  UPDATE OF date, sub, msg_box ON pdu " +
-                   "  WHEN new.m_type=132 OR new.m_type=130 OR new.m_type=128 " +
-                   "BEGIN" +
-                   "  UPDATE threads SET" +
-                   "    date = (strftime('%s','now') * 1000), " +
-                   "    snippet = new.sub, " +
-                   "    snippet_cs = new.sub_cs" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "  UPDATE threads SET read = " +
-                   "    CASE (SELECT COUNT(*)" +
-                   "          FROM pdu" +
-                   "          WHERE read = 0 AND thread_id = threads._id)" +
-                   "      WHEN 0 THEN 1 ELSE 0" +
-                   "    END" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER pdu_update_thread_read_on_update AFTER" +
-                   "  UPDATE OF read ON pdu " +
-                   "  WHEN new.m_type=132 OR new.m_type=130 OR new.m_type=128 " +
-                   "BEGIN " +
-                   "  UPDATE threads SET read = " +
-                   "    CASE (SELECT COUNT(*)" +
-                   "          FROM pdu" +
-                   "          WHERE read = 0 AND thread_id = threads._id)" +
-                   "      WHEN 0 THEN 1 ELSE 0" +
-                   "    END" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "END;");
-    }
-
-    private void upgradeDatabaseToVersion30(SQLiteDatabase db) {
-        // Since SQLite doesn't support altering constraints
-        // of an existing table, I have to create a new table
-        // with updated constraints, copy old data into this
-        // table, drop old table and then rename the new table
-        // to 'threads'.
-        db.execSQL("CREATE TABLE temp_threads (" +
-                   "_id INTEGER PRIMARY KEY," +
-                   "date INTEGER DEFAULT 0," +
-                   "subject TEXT," +
-                   "recipient_ids TEXT," +
-                   "snippet TEXT," +
-                   "snippet_cs INTEGER DEFAULT 0," +
-                   "read INTEGER DEFAULT 1," +
-                   "type INTEGER DEFAULT 0," +
-                   "error INTEGER DEFAULT 0);");
-        db.execSQL("INSERT INTO temp_threads SELECT * FROM threads;");
-        db.execSQL("DROP TABLE IF EXISTS threads;");
-        db.execSQL("ALTER TABLE temp_threads RENAME TO threads;");
-    }
-
-    private void upgradeDatabaseToVersion31(SQLiteDatabase db) {
-        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_on_delete");
-
-        // Update threads table whenever a message in sms is deleted
-        // (Usually an abandoned draft.)
-        db.execSQL("CREATE TRIGGER sms_update_thread_on_delete " +
-                   "AFTER DELETE ON sms " +
-                   "BEGIN " +
-                   "  UPDATE threads SET " +
-                   "     date = (strftime('%s','now') * 1000) " +
-                   "  WHERE threads._id = old.thread_id; " +
-                   "  UPDATE threads SET" +
-                   "    snippet = (SELECT snippet FROM" +
-                   "      (SELECT date * 1000 AS date, sub AS snippet," +
-                   "         sub_cs AS snippet_cs FROM pdu" +
-                   "       UNION SELECT date, body AS snippet, NULL AS snippet_cs" +
-                   "         FROM sms) ORDER BY date DESC LIMIT 1) " +
-                   "  WHERE threads._id = old.thread_id; " +
-                   "  UPDATE threads SET" +
-                   "    snippet_cs = (SELECT snippet_cs FROM" +
-                   "      (SELECT date * 1000 AS date, sub AS snippet," +
-                   "         sub_cs AS snippet_cs FROM pdu" +
-                   "       UNION SELECT date, body AS snippet, NULL AS snippet_cs" +
-                   "         FROM sms) ORDER BY date DESC LIMIT 1) " +
-                   "  WHERE threads._id = old.thread_id; " +
-                   "END;");
-
-        // Update threads table whenever a message in pdu is deleted
-        db.execSQL("CREATE TRIGGER pdu_update_thread_on_delete " +
-                   "AFTER DELETE ON pdu " +
-                   "BEGIN " +
-                   "  UPDATE threads SET " +
-                   "     date = (strftime('%s','now') * 1000)" +
-                   "  WHERE threads._id = old.thread_id;" +
-                   "  UPDATE threads SET" +
-                   "    snippet = (SELECT snippet FROM" +
-                   "      (SELECT date * 1000 AS date, sub AS snippet," +
-                   "         sub_cs AS snippet_cs FROM pdu" +
-                   "       UNION SELECT date, body AS snippet, NULL AS snippet_cs" +
-                   "         FROM sms) ORDER BY date DESC LIMIT 1) " +
-                   "  WHERE threads._id = old.thread_id; " +
-                   "  UPDATE threads SET" +
-                   "    snippet_cs = (SELECT snippet_cs FROM" +
-                   "      (SELECT date * 1000 AS date, sub AS snippet," +
-                   "         sub_cs AS snippet_cs FROM pdu" +
-                   "       UNION SELECT date, body AS snippet, NULL AS snippet_cs" +
-                   "         FROM sms) ORDER BY date DESC LIMIT 1) " +
-                   "  WHERE threads._id = old.thread_id; " +
-                   "END;");
-    }
-
-    private void upgradeDatabaseToVersion32(SQLiteDatabase db) {
-        db.execSQL("CREATE TABLE IF NOT EXISTS rate (sent_time INTEGER);");
-    }
-
-    private void upgradeDatabaseToVersion33(SQLiteDatabase db) {
-        db.execSQL("DROP TRIGGER IF EXISTS update_threads_error_on_update");
-        db.execSQL("DROP TRIGGER IF EXISTS update_threads_error_on_delete");
-
-        db.execSQL("CREATE TRIGGER update_threads_error_on_update_mms " +
-                   "  AFTER UPDATE OF err_type ON pending_msgs " +
-                   "  WHEN (OLD.err_type < 10 AND NEW.err_type >= 10)" +
-                   "    OR (OLD.err_type >= 10 AND NEW.err_type < 10) " +
-                   "BEGIN" +
-                   "  UPDATE threads SET error = " +
-                   "    CASE" +
-                   "      WHEN NEW.err_type >= 10 THEN error + 1" +
-                   "      ELSE error - 1" +
-                   "    END " +
-                   "  WHERE _id =" +
-                   "   (SELECT DISTINCT thread_id" +
-                   "    FROM pdu" +
-                   "    WHERE _id = NEW.msg_id); " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER update_threads_error_on_delete_mms " +
-                   "  BEFORE DELETE ON pdu" +
-                   "  WHEN OLD._id IN (SELECT DISTINCT msg_id" +
-                   "                   FROM pending_msgs" +
-                   "                   WHERE err_type >= 10) " +
-                   "BEGIN " +
-                   "  UPDATE threads SET error = error - 1" +
-                   "  WHERE _id = OLD.thread_id; " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER update_threads_error_on_update_sms " +
-                   "  AFTER UPDATE OF type ON sms" +
-                   "  WHEN (OLD.type != 5 AND NEW.type = 5)" +
-                   "    OR (OLD.type = 5 AND NEW.type != 5) " +
-                   "BEGIN " +
-                   "  UPDATE threads SET error = " +
-                   "    CASE" +
-                   "      WHEN NEW.type = 5 THEN error + 1" +
-                   "      ELSE error - 1" +
-                   "    END " +
-                   "  WHERE _id = NEW.thread_id; " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER update_threads_error_on_delete_sms " +
-                   "  AFTER DELETE ON sms" +
-                   "  WHEN (OLD.type = 5) " +
-                   "BEGIN " +
-                   "  UPDATE threads SET error = error - 1" +
-                   "  WHERE _id = OLD.thread_id; " +
-                   "END;");
-    }
-
-    private void upgradeDatabaseToVersion34(SQLiteDatabase db) {
-        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_on_insert");
-        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_date_subject_on_update");
-
-        db.execSQL("CREATE TRIGGER sms_update_thread_on_insert AFTER INSERT ON sms " +
-                   "BEGIN" +
-                   "  UPDATE threads SET" +
-                   "    date = (strftime('%s','now') * 1000), " +
-                   "    snippet = new.body," +
-                   "    snippet_cs = 0" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "  UPDATE threads SET read = " +
-                   "    CASE (SELECT COUNT(*)" +
-                   "          FROM sms" +
-                   "          WHERE read = 0" +
-                   "            AND thread_id = threads._id)" +
-                   "      WHEN 0 THEN 1" +
-                   "      ELSE 0" +
-                   "    END" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER sms_update_thread_date_subject_on_update AFTER" +
-                   "  UPDATE OF date, body, msg_box" +
-                   "  ON sms " +
-                   "BEGIN" +
-                   "  UPDATE threads SET" +
-                   "    date = (strftime('%s','now') * 1000), " +
-                   "    snippet = new.body," +
-                   "    snippet_cs = 0" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "  UPDATE threads SET read = " +
-                   "    CASE (SELECT COUNT(*)" +
-                   "          FROM sms" +
-                   "          WHERE read = 0" +
-                   "            AND thread_id = threads._id)" +
-                   "      WHEN 0 THEN 1" +
-                   "      ELSE 0" +
-                   "    END" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "END;");
-    }
-
-    private void upgradeDatabaseToVersion35(SQLiteDatabase db) {
-        db.execSQL("CREATE TABLE temp_threads (" +
-                   "_id INTEGER PRIMARY KEY," +
-                   "date INTEGER DEFAULT 0," +
-                   "message_count INTEGER DEFAULT 0," +
-                   "recipient_ids TEXT," +
-                   "snippet TEXT," +
-                   "snippet_cs INTEGER DEFAULT 0," +
-                   "read INTEGER DEFAULT 1," +
-                   "type INTEGER DEFAULT 0," +
-                   "error INTEGER DEFAULT 0);");
-        db.execSQL("INSERT INTO temp_threads " +
-                   "SELECT _id, date, 0 AS message_count, recipient_ids," +
-                   "       snippet, snippet_cs, read, type, error " +
-                   "FROM threads;");
-        db.execSQL("DROP TABLE IF EXISTS threads;");
-        db.execSQL("ALTER TABLE temp_threads RENAME TO threads;");
-
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_on_insert");
-        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_on_insert");
-        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_on_delete");
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_on_delete");
-        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_date_subject_on_update");
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_date_subject_on_update");
-
-        db.execSQL("CREATE TRIGGER pdu_update_thread_on_insert AFTER INSERT ON pdu " +
-                   "  WHEN new.m_type=132 OR new.m_type=130 OR new.m_type=128 " +
-                   "BEGIN" +
-                   "  UPDATE threads SET" +
-                   "    date = (strftime('%s','now') * 1000), " +
-                   "    snippet = new.sub, " +
-                   "    snippet_cs = new.sub_cs" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "  UPDATE threads SET message_count = " +
-                   "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                   "      ON threads._id = thread_id" +
-                   "      WHERE thread_id = new.thread_id" +
-                   "        AND sms.type != 3) + " +
-                   "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                   "      ON threads._id = thread_id" +
-                   "      WHERE thread_id = new.thread_id" +
-                   "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                   "        AND msg_box != 3) " +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "  UPDATE threads SET read = " +
-                   "    CASE (SELECT COUNT(*)" +
-                   "          FROM pdu" +
-                   "          WHERE read = 0 AND thread_id = threads._id)" +
-                   "      WHEN 0 THEN 1 ELSE 0" +
-                   "    END" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER sms_update_thread_on_insert AFTER INSERT ON sms " +
-                   "BEGIN" +
-                   "  UPDATE threads SET" +
-                   "    date = (strftime('%s','now') * 1000), " +
-                   "    snippet = new.body," +
-                   "    snippet_cs = 0" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "  UPDATE threads SET message_count = " +
-                   "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                   "      ON threads._id = thread_id" +
-                   "      WHERE thread_id = new.thread_id" +
-                   "        AND sms.type != 3) + " +
-                   "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                   "      ON threads._id = thread_id" +
-                   "      WHERE thread_id = new.thread_id" +
-                   "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                   "        AND msg_box != 3) " +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "  UPDATE threads SET read = " +
-                   "    CASE (SELECT COUNT(*)" +
-                   "          FROM sms" +
-                   "          WHERE read = 0" +
-                   "            AND thread_id = threads._id)" +
-                   "      WHEN 0 THEN 1" +
-                   "      ELSE 0" +
-                   "    END" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER sms_update_thread_on_delete " +
-                   "AFTER DELETE ON sms " +
-                   "BEGIN " +
-                   "  UPDATE threads SET " +
-                   "     date = (strftime('%s','now') * 1000) " +
-                   "  WHERE threads._id = old.thread_id; " +
-                   "  UPDATE threads SET message_count = " +
-                   "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                   "      ON threads._id = thread_id" +
-                   "      WHERE thread_id = old.thread_id" +
-                   "        AND sms.type != 3) + " +
-                   "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                   "      ON threads._id = thread_id" +
-                   "      WHERE thread_id = old.thread_id" +
-                   "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                   "        AND msg_box != 3) " +
-                   "  WHERE threads._id = old.thread_id; " +
-                   "  UPDATE threads SET" +
-                   "    snippet = (SELECT snippet FROM" +
-                   "      (SELECT date * 1000 AS date, sub AS snippet," +
-                   "         sub_cs AS snippet_cs FROM pdu" +
-                   "       UNION SELECT date, body AS snippet, NULL AS snippet_cs" +
-                   "         FROM sms) ORDER BY date DESC LIMIT 1) " +
-                   "  WHERE threads._id = old.thread_id; " +
-                   "  UPDATE threads SET" +
-                   "    snippet_cs = (SELECT snippet_cs FROM" +
-                   "      (SELECT date * 1000 AS date, sub AS snippet," +
-                   "         sub_cs AS snippet_cs FROM pdu" +
-                   "       UNION SELECT date, body AS snippet, NULL AS snippet_cs" +
-                   "         FROM sms) ORDER BY date DESC LIMIT 1) " +
-                   "  WHERE threads._id = old.thread_id; " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER pdu_update_thread_on_delete " +
-                   "AFTER DELETE ON pdu " +
-                   "BEGIN " +
-                   "  UPDATE threads SET " +
-                   "     date = (strftime('%s','now') * 1000)" +
-                   "  WHERE threads._id = old.thread_id;" +
-                   "  UPDATE threads SET message_count = " +
-                   "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                   "      ON threads._id = thread_id" +
-                   "      WHERE thread_id = old.thread_id" +
-                   "        AND sms.type != 3) + " +
-                   "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                   "      ON threads._id = thread_id" +
-                   "      WHERE thread_id = old.thread_id" +
-                   "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                   "        AND msg_box != 3) " +
-                   "  WHERE threads._id = old.thread_id; " +
-                   "  UPDATE threads SET" +
-                   "    snippet = (SELECT snippet FROM" +
-                   "      (SELECT date * 1000 AS date, sub AS snippet," +
-                   "         sub_cs AS snippet_cs FROM pdu" +
-                   "       UNION SELECT date, body AS snippet, NULL AS snippet_cs" +
-                   "         FROM sms) ORDER BY date DESC LIMIT 1) " +
-                   "  WHERE threads._id = old.thread_id; " +
-                   "  UPDATE threads SET" +
-                   "    snippet_cs = (SELECT snippet_cs FROM" +
-                   "      (SELECT date * 1000 AS date, sub AS snippet," +
-                   "         sub_cs AS snippet_cs FROM pdu" +
-                   "       UNION SELECT date, body AS snippet, NULL AS snippet_cs" +
-                   "         FROM sms) ORDER BY date DESC LIMIT 1) " +
-                   "  WHERE threads._id = old.thread_id; " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER sms_update_thread_date_subject_on_update AFTER" +
-                   "  UPDATE OF date, body, type" +
-                   "  ON sms " +
-                   "BEGIN" +
-                   "  UPDATE threads SET" +
-                   "    date = (strftime('%s','now') * 1000), " +
-                   "    snippet = new.body," +
-                   "    snippet_cs = 0" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "  UPDATE threads SET message_count = " +
-                   "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                   "      ON threads._id = thread_id" +
-                   "      WHERE thread_id = new.thread_id" +
-                   "        AND sms.type != 3) + " +
-                   "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                   "      ON threads._id = thread_id" +
-                   "      WHERE thread_id = new.thread_id" +
-                   "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                   "        AND msg_box != 3) " +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "  UPDATE threads SET read = " +
-                   "    CASE (SELECT COUNT(*)" +
-                   "          FROM sms" +
-                   "          WHERE read = 0" +
-                   "            AND thread_id = threads._id)" +
-                   "      WHEN 0 THEN 1" +
-                   "      ELSE 0" +
-                   "    END" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER pdu_update_thread_date_subject_on_update AFTER" +
-                   "  UPDATE OF date, sub, msg_box ON pdu " +
-                   "  WHEN new.m_type=132 OR new.m_type=130 OR new.m_type=128 " +
-                   "BEGIN" +
-                   "  UPDATE threads SET" +
-                   "    date = (strftime('%s','now') * 1000), " +
-                   "    snippet = new.sub, " +
-                   "    snippet_cs = new.sub_cs" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "  UPDATE threads SET message_count = " +
-                   "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                   "      ON threads._id = thread_id" +
-                   "      WHERE thread_id = new.thread_id" +
-                   "        AND sms.type != 3) + " +
-                   "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                   "      ON threads._id = thread_id" +
-                   "      WHERE thread_id = new.thread_id" +
-                   "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                   "        AND msg_box != 3) " +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "  UPDATE threads SET read = " +
-                   "    CASE (SELECT COUNT(*)" +
-                   "          FROM pdu" +
-                   "          WHERE read = 0 AND thread_id = threads._id)" +
-                   "      WHEN 0 THEN 1 ELSE 0" +
-                   "    END" +
-                   "  WHERE threads._id = new.thread_id; " +
-                   "END;");
-    }
-
-    private void upgradeDatabaseToVersion36(SQLiteDatabase db) {
-        db.execSQL("CREATE TABLE IF NOT EXISTS drm (_id INTEGER PRIMARY KEY, _data TEXT);");
-        db.execSQL("CREATE TRIGGER IF NOT EXISTS drm_file_cleanup DELETE ON drm " +
-                   "BEGIN SELECT _DELETE_FILE(old._data); END;");
-    }
-
-    private void upgradeDatabaseToVersion37(SQLiteDatabase db) {
-        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_on_delete");
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_on_delete");
-
-        db.execSQL("CREATE TRIGGER sms_update_thread_on_delete " +
-                   "AFTER DELETE ON sms " +
-                   "BEGIN " +
-                   "  UPDATE threads SET " +
-                   "     date = (strftime('%s','now') * 1000) " +
-                   "  WHERE threads._id = old.thread_id; " +
-                   "  UPDATE threads SET message_count = " +
-                   "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                   "      ON threads._id = thread_id" +
-                   "      WHERE thread_id = old.thread_id" +
-                   "        AND sms.type != 3) + " +
-                   "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                   "      ON threads._id = thread_id" +
-                   "      WHERE thread_id = old.thread_id" +
-                   "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                   "        AND msg_box != 3) " +
-                   "  WHERE threads._id = old.thread_id; " +
-                   "  UPDATE threads SET snippet = " +
-                   "   (SELECT snippet FROM" +
-                   "     (SELECT date * 1000 AS date, sub AS snippet, thread_id FROM pdu" +
-                   "      UNION SELECT date, body AS snippet, thread_id FROM sms)" +
-                   "    WHERE thread_id = OLD.thread_id ORDER BY date DESC LIMIT 1) " +
-                   "  WHERE threads._id = OLD.thread_id; " +
-                   "  UPDATE threads SET snippet_cs = " +
-                   "   (SELECT snippet_cs FROM" +
-                   "     (SELECT date * 1000 AS date, sub_cs AS snippet_cs, thread_id FROM pdu" +
-                   "      UNION SELECT date, 0 AS snippet_cs, thread_id FROM sms)" +
-                   "    WHERE thread_id = OLD.thread_id ORDER BY date DESC LIMIT 1) " +
-                   "  WHERE threads._id = OLD.thread_id; " +
-                   "END;");
-
-        db.execSQL("CREATE TRIGGER pdu_update_thread_on_delete " +
-                   "AFTER DELETE ON pdu " +
-                   "BEGIN " +
-                   "  UPDATE threads SET " +
-                   "     date = (strftime('%s','now') * 1000)" +
-                   "  WHERE threads._id = old.thread_id;" +
-                   "  UPDATE threads SET message_count = " +
-                   "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                   "      ON threads._id = thread_id" +
-                   "      WHERE thread_id = old.thread_id" +
-                   "        AND sms.type != 3) + " +
-                   "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                   "      ON threads._id = thread_id" +
-                   "      WHERE thread_id = old.thread_id" +
-                   "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                   "        AND msg_box != 3) " +
-                   "  WHERE threads._id = old.thread_id; " +
-                   "  UPDATE threads SET snippet = " +
-                   "   (SELECT snippet FROM" +
-                   "     (SELECT date * 1000 AS date, sub AS snippet, thread_id FROM pdu" +
-                   "      UNION SELECT date, body AS snippet, thread_id FROM sms)" +
-                   "    WHERE thread_id = OLD.thread_id ORDER BY date DESC LIMIT 1) " +
-                   "  WHERE threads._id = OLD.thread_id; " +
-                   "  UPDATE threads SET snippet_cs = " +
-                   "   (SELECT snippet_cs FROM" +
-                   "     (SELECT date * 1000 AS date, sub_cs AS snippet_cs, thread_id FROM pdu" +
-                   "      UNION SELECT date, 0 AS snippet_cs, thread_id FROM sms)" +
-                   "    WHERE thread_id = OLD.thread_id ORDER BY date DESC LIMIT 1) " +
-                   "  WHERE threads._id = OLD.thread_id; " +
-                   "END;");
-
-        db.execSQL("CREATE TABLE temp_part (" +
-                   "_id INTEGER PRIMARY KEY," +
-                   "mid INTEGER," +
-                   "seq INTEGER DEFAULT 0," +
-                   "ct TEXT," +
-                   "name TEXT," +
-                   "chset INTEGER," +
-                   "cd TEXT," +
-                   "fn TEXT," +
-                   "cid TEXT," +
-                   "cl TEXT," +
-                   "ctt_s INTEGER," +
-                   "ctt_t TEXT," +
-                   "_data TEXT);");
-        db.execSQL("INSERT INTO temp_part SELECT * FROM part;");
-        db.execSQL("UPDATE temp_part SET seq='0';");
-        db.execSQL("UPDATE temp_part SET seq='-1' WHERE ct='application/smil';");
-        db.execSQL("DROP TABLE IF EXISTS part;");
-        db.execSQL("ALTER TABLE temp_part RENAME TO part;");
-    }
-
-    private void upgradeDatabaseToVersion38(SQLiteDatabase db) {
-        db.execSQL("DROP TRIGGER IF EXISTS part_file_cleanup;");
-        db.execSQL("DROP TRIGGER IF EXISTS drm_file_cleanup;");
-    }
-
-    private void upgradeDatabaseToVersion39(SQLiteDatabase db) {
-        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_on_insert");
-        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_date_subject_on_update");
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_on_insert");
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_date_subject_on_update");
-
-        db.execSQL("CREATE TRIGGER sms_update_thread_on_insert AFTER INSERT ON sms " +
-                "BEGIN" +
-                "  UPDATE threads SET" +
-                "    date = (strftime('%s','now') * 1000), " +
-                "    snippet = new.body," +
-                "    snippet_cs = 0" +
-                "  WHERE threads._id = new.thread_id; " +
-                "  UPDATE threads SET message_count = " +
-                "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND sms.type != 3) + " +
-                "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                "        AND msg_box != 3 " +
-                "        AND pdu.m_id is NULL) + " +
-                "     (SELECT COUNT(DISTINCT pdu.m_id) FROM pdu LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                "        AND msg_box != 3 " +
-                "        AND pdu.m_id is not NULL) " +
-                "  WHERE threads._id = new.thread_id; " +
-                "  UPDATE threads SET read = " +
-                "    CASE (SELECT COUNT(*)" +
-                "          FROM sms" +
-                "          WHERE read = 0" +
-                "            AND thread_id = threads._id)" +
-                "      WHEN 0 THEN 1" +
-                "      ELSE 0" +
-                "    END" +
-                "  WHERE threads._id = new.thread_id; " +
-                "END;");
-
-        db.execSQL("CREATE TRIGGER sms_update_thread_date_subject_on_update AFTER" +
-                "  UPDATE OF date, body, type" +
-                "  ON sms " +
-                "BEGIN" +
-                "  UPDATE threads SET" +
-                "    date = (strftime('%s','now') * 1000), " +
-                "    snippet = new.body," +
-                "    snippet_cs = 0" +
-                "  WHERE threads._id = new.thread_id; " +
-                "  UPDATE threads SET message_count = " +
-                "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND sms.type != 3) + " +
-                "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                "        AND msg_box != 3 " +
-                "        AND pdu.m_id is NULL) + " +
-                "     (SELECT COUNT(DISTINCT pdu.m_id) FROM pdu LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                "        AND msg_box != 3 " +
-                "        AND pdu.m_id is not NULL) " +
-                "  WHERE threads._id = new.thread_id; " +
-                "  UPDATE threads SET read = " +
-                "    CASE (SELECT COUNT(*)" +
-                "          FROM sms" +
-                "          WHERE read = 0" +
-                "            AND thread_id = threads._id)" +
-                "      WHEN 0 THEN 1" +
-                "      ELSE 0" +
-                "    END" +
-                "  WHERE threads._id = new.thread_id; " +
-                "END;");
-
-        db.execSQL("CREATE TRIGGER pdu_update_thread_on_insert AFTER INSERT ON pdu " +
-                "  WHEN new.m_type=132 OR new.m_type=130 OR new.m_type=128 " +
-                "BEGIN" +
-                "  UPDATE threads SET" +
-                "    date = (strftime('%s','now') * 1000), " +
-                "    snippet = new.sub, " +
-                "    snippet_cs = new.sub_cs" +
-                "  WHERE threads._id = new.thread_id; " +
-                "  UPDATE threads SET message_count = " +
-                "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND sms.type != 3) + " +
-                "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                "        AND msg_box != 3 " +
-                "        AND pdu.m_id is NULL) + " +
-                "     (SELECT COUNT(DISTINCT pdu.m_id) FROM pdu LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                "        AND msg_box != 3 " +
-                "        AND pdu.m_id is not NULL) " +
-                "  WHERE threads._id = new.thread_id; " +
-                "  UPDATE threads SET read = " +
-                "    CASE (SELECT COUNT(*)" +
-                "          FROM pdu" +
-                "          WHERE read = 0 AND thread_id = threads._id)" +
-                "      WHEN 0 THEN 1 ELSE 0" +
-                "    END" +
-                "  WHERE threads._id = new.thread_id; " +
-                "END;");
-
-        db.execSQL("CREATE TRIGGER pdu_update_thread_date_subject_on_update AFTER" +
-                "  UPDATE OF date, sub, msg_box ON pdu " +
-                "  WHEN new.m_type=132 OR new.m_type=130 OR new.m_type=128 " +
-                "BEGIN" +
-                "  UPDATE threads SET" +
-                "    date = (strftime('%s','now') * 1000), " +
-                "    snippet = new.sub, " +
-                "    snippet_cs = new.sub_cs" +
-                "  WHERE threads._id = new.thread_id; " +
-                "  UPDATE threads SET message_count = " +
-                "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND sms.type != 3) + " +
-                "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                "        AND msg_box != 3 " +
-                "        AND pdu.m_id is NULL) + " +
-                "     (SELECT COUNT(DISTINCT pdu.m_id) FROM pdu LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                "        AND msg_box != 3 " +
-                "        AND pdu.m_id is not NULL) " +
-                "  WHERE threads._id = new.thread_id; " +
-                "  UPDATE threads SET read = " +
-                "    CASE (SELECT COUNT(*)" +
-                "          FROM pdu" +
-                "          WHERE read = 0 AND thread_id = threads._id)" +
-                "      WHEN 0 THEN 1 ELSE 0" +
-                "    END" +
-                "  WHERE threads._id = new.thread_id; " +
-                "END;");
-    }
-
-    private void upgradeDatabaseToVersion40(SQLiteDatabase db) {
-        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_on_insert");
-        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_date_subject_on_update");
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_on_insert");
-        db.execSQL("DROP TRIGGER IF EXISTS pdu_update_thread_date_subject_on_update");
-
-        db.execSQL("CREATE TRIGGER sms_update_thread_on_insert AFTER INSERT ON sms " +
-                "BEGIN" +
-                "  UPDATE threads SET" +
-                "    date = (strftime('%s','now') * 1000), " +
-                "    snippet = new.body," +
-                "    snippet_cs = 0" +
-                "  WHERE threads._id = new.thread_id; " +
-                "  UPDATE threads SET message_count = " +
-                "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND sms.type != 3) + " +
-                "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                "        AND msg_box != 3) " +
-                "  WHERE threads._id = new.thread_id; " +
-                "  UPDATE threads SET read = " +
-                "    CASE (SELECT COUNT(*)" +
-                "          FROM sms" +
-                "          WHERE read = 0" +
-                "            AND thread_id = threads._id)" +
-                "      WHEN 0 THEN 1" +
-                "      ELSE 0" +
-                "    END" +
-                "  WHERE threads._id = new.thread_id; " +
-                "END;");
-
-        db.execSQL("CREATE TRIGGER sms_update_thread_date_subject_on_update AFTER" +
-                "  UPDATE OF date, body, type" +
-                "  ON sms " +
-                "BEGIN" +
-                "  UPDATE threads SET" +
-                "    date = (strftime('%s','now') * 1000), " +
-                "    snippet = new.body," +
-                "    snippet_cs = 0" +
-                "  WHERE threads._id = new.thread_id; " +
-                "  UPDATE threads SET message_count = " +
-                "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND sms.type != 3) + " +
-                "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                "        AND msg_box != 3) " +
-                "  WHERE threads._id = new.thread_id; " +
-                "  UPDATE threads SET read = " +
-                "    CASE (SELECT COUNT(*)" +
-                "          FROM sms" +
-                "          WHERE read = 0" +
-                "            AND thread_id = threads._id)" +
-                "      WHEN 0 THEN 1" +
-                "      ELSE 0" +
-                "    END" +
-                "  WHERE threads._id = new.thread_id; " +
-                "END;");
-
-        db.execSQL("CREATE TRIGGER pdu_update_thread_on_insert AFTER INSERT ON pdu " +
-                "  WHEN new.m_type=132 OR new.m_type=130 OR new.m_type=128 " +
-                "BEGIN" +
-                "  UPDATE threads SET" +
-                "    date = (strftime('%s','now') * 1000), " +
-                "    snippet = new.sub, " +
-                "    snippet_cs = new.sub_cs" +
-                "  WHERE threads._id = new.thread_id; " +
-                "  UPDATE threads SET message_count = " +
-                "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND sms.type != 3) + " +
-                "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                "        AND msg_box != 3) " +
-                "  WHERE threads._id = new.thread_id; " +
-                "  UPDATE threads SET read = " +
-                "    CASE (SELECT COUNT(*)" +
-                "          FROM pdu" +
-                "          WHERE read = 0 AND thread_id = threads._id)" +
-                "      WHEN 0 THEN 1 ELSE 0" +
-                "    END" +
-                "  WHERE threads._id = new.thread_id; " +
-                "END;");
-
-        db.execSQL("CREATE TRIGGER pdu_update_thread_date_subject_on_update AFTER" +
-                "  UPDATE OF date, sub, msg_box ON pdu " +
-                "  WHEN new.m_type=132 OR new.m_type=130 OR new.m_type=128 " +
-                "BEGIN" +
-                "  UPDATE threads SET" +
-                "    date = (strftime('%s','now') * 1000), " +
-                "    snippet = new.sub, " +
-                "    snippet_cs = new.sub_cs" +
-                "  WHERE threads._id = new.thread_id; " +
-                "  UPDATE threads SET message_count = " +
-                "     (SELECT COUNT(sms._id) FROM sms LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND sms.type != 3) + " +
-                "     (SELECT COUNT(pdu._id) FROM pdu LEFT JOIN threads " +
-                "      ON threads._id = thread_id" +
-                "      WHERE thread_id = new.thread_id" +
-                "        AND (m_type=132 OR m_type=130 OR m_type=128)" +
-                "        AND msg_box != 3) " +
-                "  WHERE threads._id = new.thread_id; " +
-                "  UPDATE threads SET read = " +
-                "    CASE (SELECT COUNT(*)" +
-                "          FROM pdu" +
-                "          WHERE read = 0 AND thread_id = threads._id)" +
-                "      WHEN 0 THEN 1 ELSE 0" +
-                "    END" +
-                "  WHERE threads._id = new.thread_id; " +
-                "END;");
-    }
-
-    private void upgradeDatabaseToVersion41(SQLiteDatabase db) {
-        db.execSQL("DROP TRIGGER IF EXISTS update_threads_error_on_move_mms");
-        db.execSQL("CREATE TRIGGER update_threads_error_on_move_mms " +
-                   "  BEFORE UPDATE OF msg_box ON pdu " +
-                   "  WHEN (OLD.msg_box = 4 AND NEW.msg_box != 4) " +
-                   "  AND (OLD._id IN (SELECT DISTINCT msg_id" +
-                   "                   FROM pending_msgs" +
-                   "                   WHERE err_type >= 10)) " +
-                   "BEGIN " +
-                   "  UPDATE threads SET error = error - 1" +
-                   "  WHERE _id = OLD.thread_id; " +
-                   "END;");
-    }
-    
-    private void upgradeDatabaseToVersion42(SQLiteDatabase db) {
-        db.execSQL("DROP TRIGGER IF EXISTS sms_update_thread_on_delete");
-        db.execSQL("DROP TRIGGER IF EXISTS delete_obsolete_threads_sms");
-        db.execSQL("DROP TRIGGER IF EXISTS update_threads_error_on_delete_sms");
-    }
-}
diff --git a/src/com/android/providers/telephony/MmsSmsProvider.java b/src/com/android/providers/telephony/MmsSmsProvider.java
deleted file mode 100644
index b27e332..0000000
--- a/src/com/android/providers/telephony/MmsSmsProvider.java
+++ /dev/null
@@ -1,1019 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.providers.telephony;
-
-import com.google.android.mms.pdu.PduHeaders;
-
-import android.content.ContentProvider;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.UriMatcher;
-import android.database.Cursor;
-import android.database.DatabaseUtils;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.database.sqlite.SQLiteQueryBuilder;
-import android.net.Uri;
-import android.provider.BaseColumns;
-import android.provider.Telephony.CanonicalAddressesColumns;
-import android.provider.Telephony.Mms;
-import android.provider.Telephony.MmsSms;
-import android.provider.Telephony.Sms;
-import android.provider.Telephony.Threads;
-import android.provider.Telephony.ThreadsColumns;
-import android.provider.Telephony.MmsSms.PendingMessages;
-import android.provider.Telephony.Sms.Conversations;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * This class provides the ability to query the MMS and SMS databases
- * at the same time, mixing messages from both in a single thread
- * (A.K.A. conversation).
- *
- * A virtual column, MmsSms.TYPE_DISCRIMINATOR_COLUMN, may be
- * requested in the projection for a query.  Its value is either "mms"
- * or "sms", depending on whether the message represented by the row
- * is an MMS message or an SMS message, respectively.
- *
- * This class also provides the ability to find out what addresses
- * participated in a particular thread.  It doesn't support updates
- * for either of these.
- *
- * This class provides a way to allocate and retrieve thread IDs.
- * This is done atomically through a query.  There is no insert URI
- * for this.
- *
- * Finally, this class provides a way to delete or update all messages
- * in a thread.
- */
-public class MmsSmsProvider extends ContentProvider {
-    private static final UriMatcher URI_MATCHER =
-            new UriMatcher(UriMatcher.NO_MATCH);
-    private static final String LOG_TAG = "MmsSmsProvider";
-
-    private static final String NO_DELETES_INSERTS_OR_UPDATES =
-            "MmsSmsProvider does not support deletes, inserts, or updates for this URI.";
-    private static final int URI_CONVERSATIONS              = 0;
-    private static final int URI_CONVERSATIONS_MESSAGES     = 1;
-    private static final int URI_CONVERSATIONS_RECIPIENTS   = 2;
-    private static final int URI_MESSAGES_BY_PHONE          = 3;
-    private static final int URI_THREAD_ID                  = 4;
-    private static final int URI_CANONICAL_ADDRESS          = 5;
-    private static final int URI_PENDING_MSG                = 6;
-    private static final int URI_COMPLETE_CONVERSATIONS     = 7;
-    private static final int URI_UNDELIVERED_MSG            = 8;
-    private static final int URI_CONVERSATIONS_SUBJECT      = 9;
-    private static final int URI_NOTIFICATIONS              = 10;
-    private static final int URI_OBSOLETE_THREADS           = 11;
-    private static final int URI_DRAFT                      = 12;
-
-    /**
-     * the name of the table that is used to store the queue of
-     * messages(both MMS and SMS) to be sent/downloaded.
-     */
-    public static final String TABLE_PENDING_MSG = "pending_msgs";
-
-    // These constants are used to construct union queries across the
-    // MMS and SMS base tables.
-
-    // These are the columns that appear in both the MMS ("pdu") and
-    // SMS ("sms") message tables.
-    private static final String[] MMS_SMS_COLUMNS =
-            { BaseColumns._ID, Mms.DATE, Mms.READ, Mms.THREAD_ID };
-
-    // These are the columns that appear only in the MMS message
-    // table.
-    private static final String[] MMS_ONLY_COLUMNS = {
-        Mms.CONTENT_CLASS, Mms.CONTENT_LOCATION, Mms.CONTENT_TYPE,
-        Mms.DELIVERY_REPORT, Mms.EXPIRY, Mms.MESSAGE_CLASS, Mms.MESSAGE_ID,
-        Mms.MESSAGE_SIZE, Mms.MESSAGE_TYPE, Mms.MESSAGE_BOX, Mms.PRIORITY,
-        Mms.READ_STATUS, Mms.RESPONSE_STATUS, Mms.RESPONSE_TEXT,
-        Mms.RETRIEVE_STATUS, Mms.RETRIEVE_TEXT_CHARSET, Mms.REPORT_ALLOWED,
-        Mms.READ_REPORT, Mms.STATUS, Mms.SUBJECT, Mms.SUBJECT_CHARSET,
-        Mms.TRANSACTION_ID, Mms.MMS_VERSION };
-
-    // These are the columns that appear only in the SMS message
-    // table.
-    private static final String[] SMS_ONLY_COLUMNS =
-            { "address", "body", "person", "reply_path_present",
-              "service_center", "status", "subject", "type" };
-
-    // These are all the columns that appear in the "threads" table.
-    private static final String[] THREADS_COLUMNS = {
-        BaseColumns._ID,
-        ThreadsColumns.DATE,
-        ThreadsColumns.RECIPIENT_IDS,
-        ThreadsColumns.MESSAGE_COUNT
-    };
-
-    // These are all the columns that appear in the MMS and SMS
-    // message tables.
-    private static final String[] UNION_COLUMNS =
-            new String[MMS_SMS_COLUMNS.length
-                       + MMS_ONLY_COLUMNS.length
-                       + SMS_ONLY_COLUMNS.length];
-
-    // These are all the columns that appear in the MMS table.
-    private static final Set<String> MMS_COLUMNS = new HashSet<String>();
-
-    // These are all the columns that appear in the SMS table.
-    private static final Set<String> SMS_COLUMNS = new HashSet<String>();
-
-    private static final String VND_ANDROID_DIR_MMS_SMS =
-            "vnd.android-dir/mms-sms";
-
-    private static final String[] ID_PROJECTION = { BaseColumns._ID };
-
-    private static final String[] EMPTY_STRING_ARRAY = new String[0];
-
-    private static final String SMS_CONVERSATION_CONSTRAINT = "(" +
-            Sms.TYPE + " != " + Sms.MESSAGE_TYPE_DRAFT + ")";
-
-    private static final String MMS_CONVERSATION_CONSTRAINT = "(" +
-            Mms.MESSAGE_BOX + " != " + Mms.MESSAGE_BOX_DRAFTS + " AND (" +
-            Mms.MESSAGE_TYPE + " = " + PduHeaders.MESSAGE_TYPE_SEND_REQ + " OR " +
-            Mms.MESSAGE_TYPE + " = " + PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF + " OR " +
-            Mms.MESSAGE_TYPE + " = " + PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND + "))";
-
-    private static final String AUTHORITY = "mms-sms";
-
-    static {
-        URI_MATCHER.addURI(AUTHORITY, "conversations", URI_CONVERSATIONS);
-        URI_MATCHER.addURI(AUTHORITY, "complete-conversations", URI_COMPLETE_CONVERSATIONS);
-
-        // In these patterns, "#" is the thread ID.
-        URI_MATCHER.addURI(
-                AUTHORITY, "conversations/#", URI_CONVERSATIONS_MESSAGES);
-        URI_MATCHER.addURI(
-                AUTHORITY, "conversations/#/recipients",
-                URI_CONVERSATIONS_RECIPIENTS);
-
-        URI_MATCHER.addURI(
-                AUTHORITY, "conversations/#/subject",
-                URI_CONVERSATIONS_SUBJECT);
-
-        // URI for deleting obsolete threads.
-        URI_MATCHER.addURI(AUTHORITY, "conversations/obsolete", URI_OBSOLETE_THREADS);
-
-        URI_MATCHER.addURI(
-                AUTHORITY, "messages/byphone/*",
-                URI_MESSAGES_BY_PHONE);
-
-        // In this pattern, two query parameter names are expected:
-        // "subject" and "recipient."  Multiple "recipient" parameters
-        // may be present.
-        URI_MATCHER.addURI(AUTHORITY, "threadID", URI_THREAD_ID);
-
-        // Use this pattern to query the canonical address by given ID.
-        URI_MATCHER.addURI(AUTHORITY, "canonical-address/#", URI_CANONICAL_ADDRESS);
-
-        // In this pattern, two query parameters may be supplied:
-        // "protocol" and "message." For example:
-        //   content://mms-sms/pending?
-        //       -> Return all pending messages;
-        //   content://mms-sms/pending?protocol=sms
-        //       -> Only return pending SMs;
-        //   content://mms-sms/pending?protocol=mms&message=1
-        //       -> Return the the pending MM which ID equals '1'.
-        //
-        URI_MATCHER.addURI(AUTHORITY, "pending", URI_PENDING_MSG);
-
-        // Use this pattern to get a list of undelivered messages.
-        URI_MATCHER.addURI(AUTHORITY, "undelivered", URI_UNDELIVERED_MSG);
-
-        // Use this pattern to see what delivery status reports (for
-        // both MMS and SMS) have not been delivered to the user.
-        URI_MATCHER.addURI(AUTHORITY, "notifications", URI_NOTIFICATIONS);
-
-        URI_MATCHER.addURI(AUTHORITY, "draft", URI_DRAFT);
-        initializeColumnSets();
-    }
-
-    private SQLiteOpenHelper mOpenHelper;
-
-    @Override
-    public boolean onCreate() {
-        mOpenHelper = MmsSmsDatabaseHelper.getInstance(getContext());
-        return true;
-    }
-
-    @Override
-    public Cursor query(Uri uri, String[] projection,
-            String selection, String[] selectionArgs, String sortOrder) {
-        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
-        Cursor cursor = null;
-
-        switch(URI_MATCHER.match(uri)) {
-            case URI_COMPLETE_CONVERSATIONS:
-                cursor = getCompleteConversations(
-                        projection, selection, selectionArgs, sortOrder);
-                break;
-            case URI_CONVERSATIONS:
-                String simple = uri.getQueryParameter("simple");
-                if ((simple != null) && simple.equals("true")) {
-                    String threadType = uri.getQueryParameter("thread_type");
-                    if (!TextUtils.isEmpty(threadType)) {
-                        selection = concatSelections(
-                                selection, Threads.TYPE + "=" + threadType);
-                    }
-                    cursor = getSimpleConversations(
-                            projection, selection, selectionArgs, sortOrder);
-                } else {
-                    cursor = getConversations(
-                            projection, selection, selectionArgs, sortOrder);
-                }
-                break;
-            case URI_CONVERSATIONS_MESSAGES:
-                cursor = getConversationMessages(
-                        uri.getPathSegments().get(1), projection, selection,
-                        selectionArgs, sortOrder);
-                break;
-            case URI_CONVERSATIONS_RECIPIENTS:
-                cursor = getConversationById(
-                        uri.getPathSegments().get(1), projection, selection,
-                        selectionArgs, sortOrder);
-                break;
-            case URI_CONVERSATIONS_SUBJECT:
-                cursor = getConversationById(
-                        uri.getPathSegments().get(1), projection, selection,
-                        selectionArgs, sortOrder);
-                break;
-            case URI_MESSAGES_BY_PHONE:
-                cursor = getMessagesByPhoneNumber(
-                        uri.getPathSegments().get(2), projection, selection,
-                        selectionArgs, sortOrder);
-                break;
-            case URI_THREAD_ID:
-                List<String> recipients = uri.getQueryParameters("recipient");
-
-                cursor = getThreadId(recipients);
-                break;
-            case URI_CANONICAL_ADDRESS: {
-                String extraSelection = "_id=" + uri.getPathSegments().get(1);
-                String finalSelection = TextUtils.isEmpty(selection)
-                        ? extraSelection : extraSelection + " AND " + selection;
-                cursor = db.query("canonical_addresses",
-                        new String[] {"address"}, finalSelection, selectionArgs,
-                        null, null, sortOrder);
-                break;
-            }
-            case URI_PENDING_MSG: {
-                String protoName = uri.getQueryParameter("protocol");
-                String msgId = uri.getQueryParameter("message");
-                int proto = TextUtils.isEmpty(protoName) ? -1
-                        : (protoName.equals("sms") ? MmsSms.SMS_PROTO : MmsSms.MMS_PROTO);
-
-                String extraSelection = (proto != -1) ?
-                        (PendingMessages.PROTO_TYPE + "=" + proto) : " 0=0 ";
-                if (!TextUtils.isEmpty(msgId)) {
-                    extraSelection += " AND " + PendingMessages.MSG_ID + "=" + msgId;
-                }
-
-                String finalSelection = TextUtils.isEmpty(selection)
-                        ? extraSelection : ("(" + extraSelection + ") AND " + selection);
-                String finalOrder = TextUtils.isEmpty(sortOrder)
-                        ? PendingMessages.DUE_TIME : sortOrder;
-                cursor = db.query(TABLE_PENDING_MSG, null,
-                        finalSelection, selectionArgs, null, null, finalOrder);
-                break;
-            }
-            case URI_UNDELIVERED_MSG: {
-                cursor = getUndeliveredMessages(projection, selection,
-                        selectionArgs, sortOrder);
-                break;
-            }
-            case URI_DRAFT: {
-                cursor = getDraftThread(projection, selection, selectionArgs, sortOrder);
-                break;
-            }
-            default:
-                throw new IllegalStateException("Unrecognized URI:" + uri);
-        }
-
-        cursor.setNotificationUri(getContext().getContentResolver(), MmsSms.CONTENT_URI);
-        return cursor;
-    }
-
-    /**
-     * Return the canonical address ID for this address.
-     */
-    private long getSingleAddressId(String address) {
-        boolean isEmail = Mms.isEmailAddress(address);
-        String refinedAddress = isEmail ? address.toLowerCase() : address;
-        String selection =
-                isEmail
-                ? "address = ?"
-                : "PHONE_NUMBERS_EQUAL(address, ?)";
-        String[] selectionArgs = new String[] { refinedAddress };
-        Cursor cursor = null;
-
-        try {
-            SQLiteDatabase db = mOpenHelper.getReadableDatabase();
-            cursor = db.query(
-                    "canonical_addresses", ID_PROJECTION,
-                    selection, selectionArgs, null, null, null);
-
-            if (cursor.getCount() == 0) {
-                ContentValues contentValues = new ContentValues(1);
-                contentValues.put(CanonicalAddressesColumns.ADDRESS, refinedAddress);
-
-                db = mOpenHelper.getWritableDatabase();
-                return db.insert("canonical_addresses",
-                        CanonicalAddressesColumns.ADDRESS, contentValues);
-            }
-
-            if (cursor.moveToFirst()) {
-                return cursor.getLong(cursor.getColumnIndexOrThrow(BaseColumns._ID));
-            }
-        } finally {
-            if (cursor != null) {
-                cursor.close();
-            }
-        }
-
-        return -1L;
-    }
-
-    /**
-     * Return the canonical address IDs for these addresses.
-     */
-    private Set<Long> getAddressIds(List<String> addresses) {
-        Set<Long> result = new HashSet<Long>(addresses.size());
-
-        for (String address : addresses) {
-            if (!address.equals(PduHeaders.FROM_INSERT_ADDRESS_TOKEN_STR)) {
-                long id = getSingleAddressId(address);
-                if (id != -1L) {
-                    result.add(id);
-                } else {
-                    Log.e(LOG_TAG, "Address ID not found for: " + address);
-                }
-            }
-        }
-        return result;
-    }
-
-    /**
-     * Return a sorted array of the given Set of Longs.
-     */
-    private long[] getSortedSet(Set<Long> numbers) {
-        int size = numbers.size();
-        long[] result = new long[size];
-        int i = 0;
-
-        for (Long number : numbers) {
-            result[i++] = number;
-        }
-        Arrays.sort(result);
-        return result;
-    }
-
-    /**
-     * Return a String of the numbers in the given array, in order,
-     * separated by spaces.
-     */
-    private String getSpaceSeparatedNumbers(long[] numbers) {
-        int size = numbers.length;
-        StringBuilder buffer = new StringBuilder();
-
-        for (int i = 0; i < size; i++) {
-            if (i != 0) {
-                buffer.append(' ');
-            }
-            buffer.append(numbers[i]);
-        }
-        return buffer.toString();
-    }
-
-    /**
-     * Insert a record for a new thread.
-     */
-    private void insertThread(String recipientIds, int numberOfRecipients) {
-        ContentValues values = new ContentValues(4);
-
-        long date = System.currentTimeMillis();
-        values.put(ThreadsColumns.DATE, date - date % 1000);
-        values.put(ThreadsColumns.RECIPIENT_IDS, recipientIds);
-        if (numberOfRecipients > 1) {
-            values.put(Threads.TYPE, Threads.BROADCAST_THREAD);
-        }
-        values.put(ThreadsColumns.MESSAGE_COUNT, 0);
-
-        mOpenHelper.getWritableDatabase().insert("threads", null, values);
-        getContext().getContentResolver().notifyChange(MmsSms.CONTENT_URI, null);
-    }
-
-    /**
-     * Return the thread ID for this list of
-     * recipients IDs.  If no thread exists with this ID, create
-     * one and return it.  Callers should always use
-     * Threads.getThreadId to access this information.
-     */
-    private synchronized Cursor getThreadId(List<String> recipients) {
-        String recipientIds =
-                getSpaceSeparatedNumbers(
-                        getSortedSet(getAddressIds(recipients)));
-        String THREAD_QUERY = "SELECT _id FROM threads " +
-                "WHERE recipient_ids = ?";
-
-        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
-        Cursor cursor = db.rawQuery(THREAD_QUERY, new String[] { recipientIds });
-
-        if (cursor.getCount() == 0) {
-            cursor.close();
-            insertThread(recipientIds, recipients.size());
-            db = mOpenHelper.getReadableDatabase();  // In case insertThread closed it
-            cursor = db.rawQuery(THREAD_QUERY, new String[] { recipientIds });
-        }
-
-        return cursor;
-    }
-
-    private static String concatSelections(String selection1, String selection2) {
-        if (TextUtils.isEmpty(selection1)) {
-            return selection2;
-        } else if (TextUtils.isEmpty(selection2)) {
-            return selection1;
-        } else {
-            return selection1 + " AND " + selection2;
-        }
-    }
-
-    /**
-     * If a null projection is given, return the union of all columns
-     * in both the MMS and SMS messages tables.  Otherwise, return the
-     * given projection.
-     */
-    private static String[] handleNullMessageProjection(
-            String[] projection) {
-        return projection == null ? UNION_COLUMNS : projection;
-    }
-
-    /**
-     * If a null projection is given, return the set of all columns in
-     * the threads table.  Otherwise, return the given projection.
-     */
-    private static String[] handleNullThreadsProjection(
-            String[] projection) {
-        return projection == null ? THREADS_COLUMNS : projection;
-    }
-
-    /**
-     * If a null sort order is given, return "normalized_date ASC".
-     * Otherwise, return the given sort order.
-     */
-    private static String handleNullSortOrder (String sortOrder) {
-        return sortOrder == null ? "normalized_date ASC" : sortOrder;
-    }
-
-    /**
-     * Return existing threads in the database.
-     */
-    private Cursor getSimpleConversations(String[] projection, String selection,
-            String[] selectionArgs, String sortOrder) {
-        return mOpenHelper.getReadableDatabase().query("threads", projection,
-                selection, selectionArgs, null, null, " date DESC");
-    }
-
-    /**
-     * Return the thread which has draft in both MMS and SMS.
-     *
-     * Use this query:
-     *
-     *   SELECT ...
-     *     FROM (SELECT _id, thread_id, ...
-     *             FROM pdu
-     *             WHERE msg_box = 3 AND ...
-     *           UNION
-     *           SELECT _id, thread_id, ...
-     *             FROM sms
-     *             WHERE type = 3 AND ...
-     *          )
-     *   ;
-     */
-    private Cursor getDraftThread(String[] projection, String selection,
-            String[] selectionArgs, String sortOrder) {
-        String[] innerProjection = new String[] {BaseColumns._ID, Conversations.THREAD_ID};
-        SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
-        SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder();
-
-        mmsQueryBuilder.setTables(MmsProvider.TABLE_PDU);
-        smsQueryBuilder.setTables(SmsProvider.TABLE_SMS);
-
-        String mmsSubQuery = mmsQueryBuilder.buildUnionSubQuery(
-                MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerProjection,
-                MMS_COLUMNS, 1, "mms",
-                concatSelections(selection, Mms.MESSAGE_BOX + "=" + Mms.MESSAGE_BOX_DRAFTS),
-                selectionArgs, null, null);
-        String smsSubQuery = smsQueryBuilder.buildUnionSubQuery(
-                MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerProjection,
-                SMS_COLUMNS, 1, "sms",
-                concatSelections(selection, Sms.TYPE + "=" + Sms.MESSAGE_TYPE_DRAFT),
-                selectionArgs, null, null);
-        SQLiteQueryBuilder unionQueryBuilder = new SQLiteQueryBuilder();
-
-        unionQueryBuilder.setDistinct(true);
-
-        String unionQuery = unionQueryBuilder.buildUnionQuery(
-                new String[] { mmsSubQuery, smsSubQuery }, null, null);
-
-        SQLiteQueryBuilder outerQueryBuilder = new SQLiteQueryBuilder();
-
-        outerQueryBuilder.setTables("(" + unionQuery + ")");
-
-        String outerQuery = outerQueryBuilder.buildQuery(
-                projection, null, null, null, null, sortOrder, null);
-
-        return mOpenHelper.getReadableDatabase().rawQuery(outerQuery, EMPTY_STRING_ARRAY);
-    }
-
-    /**
-     * Return the most recent message in each conversation in both MMS
-     * and SMS.
-     *
-     * Use this query:
-     *
-     *   SELECT ...
-     *     FROM (SELECT thread_id AS tid, date * 1000 AS normalized_date, ...
-     *             FROM pdu
-     *             WHERE msg_box != 3 AND ...
-     *             GROUP BY thread_id
-     *             HAVING date = MAX(date)
-     *           UNION
-     *           SELECT thread_id AS tid, date AS normalized_date, ...
-     *             FROM sms
-     *             WHERE ...
-     *             GROUP BY thread_id
-     *             HAVING date = MAX(date))
-     *     GROUP BY tid
-     *     HAVING normalized_date = MAX(normalized_date);
-     *
-     * The msg_box != 3 comparisons ensure that we don't include draft
-     * messages.
-     */
-    private Cursor getConversations(String[] projection, String selection,
-            String[] selectionArgs, String sortOrder) {
-        SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
-        SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder();
-
-        mmsQueryBuilder.setTables(MmsProvider.TABLE_PDU);
-        smsQueryBuilder.setTables(SmsProvider.TABLE_SMS);
-
-        String[] columns = handleNullMessageProjection(projection);
-        String[] innerMmsProjection = makeProjectionWithDateAndThreadId(
-                UNION_COLUMNS, 1000);
-        String[] innerSmsProjection = makeProjectionWithDateAndThreadId(
-                UNION_COLUMNS, 1);
-        String mmsSubQuery = mmsQueryBuilder.buildUnionSubQuery(
-                MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerMmsProjection,
-                MMS_COLUMNS, 1, "mms",
-                concatSelections(selection, MMS_CONVERSATION_CONSTRAINT), selectionArgs,
-                "thread_id", "date = MAX(date)");
-        String smsSubQuery = smsQueryBuilder.buildUnionSubQuery(
-                MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerSmsProjection,
-                SMS_COLUMNS, 1, "sms",
-                concatSelections(selection, SMS_CONVERSATION_CONSTRAINT), selectionArgs,
-                "thread_id", "date = MAX(date)");
-        SQLiteQueryBuilder unionQueryBuilder = new SQLiteQueryBuilder();
-
-        unionQueryBuilder.setDistinct(true);
-
-        String unionQuery = unionQueryBuilder.buildUnionQuery(
-                new String[] { mmsSubQuery, smsSubQuery }, null, null);
-
-        SQLiteQueryBuilder outerQueryBuilder = new SQLiteQueryBuilder();
-
-        outerQueryBuilder.setTables("(" + unionQuery + ")");
-
-        String outerQuery = outerQueryBuilder.buildQuery(
-                columns, null, null, "tid",
-                "normalized_date = MAX(normalized_date)", sortOrder, null);
-
-        return mOpenHelper.getReadableDatabase().rawQuery(outerQuery, EMPTY_STRING_ARRAY);
-    }
-
-    /**
-     * Return every message in each conversation in both MMS
-     * and SMS.
-     */
-    private Cursor getCompleteConversations(String[] projection,
-            String selection, String[] selectionArgs, String sortOrder) {
-        String unionQuery = buildConversationQuery(
-                projection, selection, selectionArgs, sortOrder);
-
-        return mOpenHelper.getReadableDatabase().rawQuery(unionQuery, EMPTY_STRING_ARRAY);
-    }
-
-    /**
-     * Add normalized date and thread_id to the list of columns for an
-     * inner projection.  This is necessary so that the outer query
-     * can have access to these columns even if the caller hasn't
-     * requested them in the result.
-     */
-    private String[] makeProjectionWithDateAndThreadId(
-            String[] projection, int dateMultiple) {
-        int projectionSize = projection.length;
-        String[] result = new String[projectionSize + 2];
-
-        result[0] = "thread_id AS tid";
-        result[1] = "date * " + dateMultiple + " AS normalized_date";
-        for (int i = 0; i < projectionSize; i++) {
-            result[i + 2] = projection[i];
-        }
-        return result;
-    }
-
-    /**
-     * Return the union of MMS and SMS messages for this thread ID.
-     */
-    private Cursor getConversationMessages(
-            String threadIdString, String[] projection, String selection,
-            String[] selectionArgs, String sortOrder) {
-        try {
-            Long.parseLong(threadIdString);
-        } catch (NumberFormatException exception) {
-            Log.e(LOG_TAG, "Thread ID must be a Long.");
-            return null;
-        }
-
-        String finalSelection = concatSelections(
-                selection, "thread_id = " + threadIdString);
-        String unionQuery = buildConversationQuery(
-                projection, finalSelection, selectionArgs, sortOrder);
-
-        return mOpenHelper.getReadableDatabase().rawQuery(unionQuery, EMPTY_STRING_ARRAY);
-    }
-
-    /**
-     * Return the union of MMS and SMS messages whose recipients
-     * included this phone number.
-     *
-     * Use this query:
-     *
-     * SELECT ...
-     *   FROM pdu, (SELECT _id AS address_id
-     *              FROM addr
-     *              WHERE PHONE_NUMBERS_EQUAL(addr.address, '<phoneNumber>'))
-     *             AS matching_addresses
-     *   WHERE pdu._id = matching_addresses.address_id
-     * UNION
-     * SELECT ...
-     *   FROM sms
-     *   WHERE PHONE_NUMBERS_EQUAL(sms.address, '<phoneNumber>');
-     */
-    private Cursor getMessagesByPhoneNumber(
-            String phoneNumber, String[] projection, String selection,
-            String[] selectionArgs, String sortOrder) {
-        String escapedPhoneNumber = DatabaseUtils.sqlEscapeString(phoneNumber);
-        String finalMmsSelection =
-                concatSelections(
-                        selection,
-                        "pdu._id = matching_addresses.address_id");
-        String finalSmsSelection =
-                concatSelections(
-                        selection,
-                        "PHONE_NUMBERS_EQUAL(address, " +
-                        escapedPhoneNumber + ")");
-        SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
-        SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder();
-
-        mmsQueryBuilder.setDistinct(true);
-        smsQueryBuilder.setDistinct(true);
-        mmsQueryBuilder.setTables(
-                MmsProvider.TABLE_PDU +
-                ", (SELECT _id AS address_id " +
-                "FROM addr WHERE PHONE_NUMBERS_EQUAL(addr.address, " +
-                escapedPhoneNumber + ")) " +
-                "AS matching_addresses");
-        smsQueryBuilder.setTables(SmsProvider.TABLE_SMS);
-
-        String[] columns = handleNullMessageProjection(projection);
-        String mmsSubQuery = mmsQueryBuilder.buildUnionSubQuery(
-                MmsSms.TYPE_DISCRIMINATOR_COLUMN, columns, MMS_COLUMNS,
-                0, "mms", finalMmsSelection, selectionArgs, null, null);
-        String smsSubQuery = smsQueryBuilder.buildUnionSubQuery(
-                MmsSms.TYPE_DISCRIMINATOR_COLUMN, columns, SMS_COLUMNS,
-                0, "sms", finalSmsSelection, selectionArgs, null, null);
-        SQLiteQueryBuilder unionQueryBuilder = new SQLiteQueryBuilder();
-
-        unionQueryBuilder.setDistinct(true);
-
-        String unionQuery = unionQueryBuilder.buildUnionQuery(
-                new String[] { mmsSubQuery, smsSubQuery }, sortOrder, null);
-
-        return mOpenHelper.getReadableDatabase().rawQuery(unionQuery, EMPTY_STRING_ARRAY);
-    }
-
-    /**
-     * Return the conversation of certain thread ID.
-     */
-    private Cursor getConversationById(
-            String threadIdString, String[] projection, String selection,
-            String[] selectionArgs, String sortOrder) {
-        try {
-            Long.parseLong(threadIdString);
-        } catch (NumberFormatException exception) {
-            Log.e(LOG_TAG, "Thread ID must be a Long.");
-            return null;
-        }
-
-        String extraSelection = "_id=" + threadIdString;
-        String finalSelection = concatSelections(selection, extraSelection);
-        SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
-        String[] columns = handleNullThreadsProjection(projection);
-
-        queryBuilder.setDistinct(true);
-        queryBuilder.setTables("threads");
-        return queryBuilder.query(
-                mOpenHelper.getReadableDatabase(), columns, finalSelection,
-                selectionArgs, sortOrder, null, null);
-    }
-
-    private static String joinPduAndPendingMsgTables() {
-        return MmsProvider.TABLE_PDU + " LEFT JOIN " + TABLE_PENDING_MSG
-                + " ON pdu._id = pending_msgs.msg_id";
-    }
-
-    private static String[] createMmsProjection(String[] old) {
-        String[] newProjection = new String[old.length];
-        for (int i = 0; i < old.length; i++) {
-            if (old[i].equals(BaseColumns._ID)) {
-                newProjection[i] = "pdu._id";
-            } else {
-                newProjection[i] = old[i];
-            }
-        }
-        return newProjection;
-    }
-
-    private Cursor getUndeliveredMessages(
-            String[] projection, String selection, String[] selectionArgs,
-            String sortOrder) {
-        String[] mmsProjection = createMmsProjection(projection);
-
-        SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
-        SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder();
-
-        mmsQueryBuilder.setTables(joinPduAndPendingMsgTables());
-        smsQueryBuilder.setTables(SmsProvider.TABLE_SMS);
-
-        String finalMmsSelection = concatSelections(
-                selection, Mms.MESSAGE_BOX + " = " + Mms.MESSAGE_BOX_OUTBOX);
-        String finalSmsSelection = concatSelections(
-                selection, "(" + Sms.TYPE + " = " + Sms.MESSAGE_TYPE_OUTBOX
-                + " OR " + Sms.TYPE + " = " + Sms.MESSAGE_TYPE_FAILED
-                + " OR " + Sms.TYPE + " = " + Sms.MESSAGE_TYPE_QUEUED + ")");
-
-        String[] smsColumns = handleNullMessageProjection(projection);
-        String[] mmsColumns = handleNullMessageProjection(mmsProjection);
-        String[] innerMmsProjection = makeProjectionWithDateAndThreadId(
-                mmsColumns, 1000);
-        String[] innerSmsProjection = makeProjectionWithDateAndThreadId(
-                smsColumns, 1);
-
-        Set<String> columnsPresentInTable = new HashSet<String>(MMS_COLUMNS);
-        columnsPresentInTable.add("pdu._id");
-        columnsPresentInTable.add(PendingMessages.ERROR_TYPE);
-        String mmsSubQuery = mmsQueryBuilder.buildUnionSubQuery(
-                MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerMmsProjection,
-                columnsPresentInTable, 1, "mms", finalMmsSelection, selectionArgs,
-                null, null);
-        String smsSubQuery = smsQueryBuilder.buildUnionSubQuery(
-                MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerSmsProjection,
-                SMS_COLUMNS, 1, "sms", finalSmsSelection, selectionArgs,
-                null, null);
-        SQLiteQueryBuilder unionQueryBuilder = new SQLiteQueryBuilder();
-
-        unionQueryBuilder.setDistinct(true);
-
-        String unionQuery = unionQueryBuilder.buildUnionQuery(
-                new String[] { smsSubQuery, mmsSubQuery }, null, null);
-
-        SQLiteQueryBuilder outerQueryBuilder = new SQLiteQueryBuilder();
-
-        outerQueryBuilder.setTables("(" + unionQuery + ")");
-
-        String outerQuery = outerQueryBuilder.buildQuery(
-                smsColumns, null, null, null, null, sortOrder, null);
-
-        return mOpenHelper.getReadableDatabase().rawQuery(outerQuery, EMPTY_STRING_ARRAY);
-    }
-
-    /**
-     * Add normalized date to the list of columns for an inner
-     * projection.
-     */
-    private static String[] makeProjectionWithNormalizedDate(
-            String[] projection, int dateMultiple) {
-        int projectionSize = projection.length;
-        String[] result = new String[projectionSize + 1];
-
-        result[0] = "date * " + dateMultiple + " AS normalized_date";
-        System.arraycopy(projection, 0, result, 1, projectionSize);
-        return result;
-    }
-
-    private static String buildConversationQuery(String[] projection,
-            String selection, String[] selectionArgs, String sortOrder) {
-        String[] mmsProjection = createMmsProjection(projection);
-
-        SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder();
-        SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder();
-
-        mmsQueryBuilder.setDistinct(true);
-        smsQueryBuilder.setDistinct(true);
-        mmsQueryBuilder.setTables(joinPduAndPendingMsgTables());
-        smsQueryBuilder.setTables(SmsProvider.TABLE_SMS);
-
-        String[] smsColumns = handleNullMessageProjection(projection);
-        String[] mmsColumns = handleNullMessageProjection(mmsProjection);
-        String[] innerMmsProjection = makeProjectionWithNormalizedDate(mmsColumns, 1000);
-        String[] innerSmsProjection = makeProjectionWithNormalizedDate(smsColumns, 1);
-
-        Set<String> columnsPresentInTable = new HashSet<String>(MMS_COLUMNS);
-        columnsPresentInTable.add("pdu._id");
-        columnsPresentInTable.add(PendingMessages.ERROR_TYPE);
-
-        String mmsSelection = concatSelections(selection,
-                                Mms.MESSAGE_BOX + " != " + Mms.MESSAGE_BOX_DRAFTS);
-        String mmsSubQuery = mmsQueryBuilder.buildUnionSubQuery(
-                MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerMmsProjection,
-                columnsPresentInTable, 0, "mms",
-                concatSelections(mmsSelection, MMS_CONVERSATION_CONSTRAINT),
-                selectionArgs, null, null);
-        String smsSubQuery = smsQueryBuilder.buildUnionSubQuery(
-                MmsSms.TYPE_DISCRIMINATOR_COLUMN, innerSmsProjection, SMS_COLUMNS,
-                0, "sms", concatSelections(selection, SMS_CONVERSATION_CONSTRAINT),
-                selectionArgs, null, null);
-        SQLiteQueryBuilder unionQueryBuilder = new SQLiteQueryBuilder();
-
-        unionQueryBuilder.setDistinct(true);
-
-        String unionQuery = unionQueryBuilder.buildUnionQuery(
-                new String[] { smsSubQuery, mmsSubQuery },
-                handleNullSortOrder(sortOrder), null);
-
-        SQLiteQueryBuilder outerQueryBuilder = new SQLiteQueryBuilder();
-
-        outerQueryBuilder.setTables("(" + unionQuery + ")");
-
-        return outerQueryBuilder.buildQuery(
-                smsColumns, null, null, null, null, sortOrder, null);
-    }
-
-    @Override
-    public String getType(Uri uri) {
-        return VND_ANDROID_DIR_MMS_SMS;
-    }
-
-    @Override
-    public int delete(Uri uri, String selection,
-            String[] selectionArgs) {
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        Context context = getContext();
-        int affectedRows = 0;
-        
-        switch(URI_MATCHER.match(uri)) {
-            case URI_CONVERSATIONS_MESSAGES:
-                long threadId;
-                try {
-                    threadId = Long.parseLong(uri.getLastPathSegment());
-                } catch (NumberFormatException e) {
-                    Log.e(LOG_TAG, "Thread ID must be a long.");
-                    break;
-                }
-                affectedRows = deleteConversation(uri, selection, selectionArgs);
-                MmsSmsDatabaseHelper.updateThread(db, threadId);
-                break;
-            case URI_CONVERSATIONS:
-                affectedRows = MmsProvider.deleteMessages(context, db,
-                                        selection, selectionArgs, uri)
-                        + db.delete("sms", selection, selectionArgs);
-                MmsSmsDatabaseHelper.updateAllThreads(db, selection, selectionArgs);
-                break;
-            case URI_OBSOLETE_THREADS:
-                affectedRows = db.delete("threads",
-                        "_id NOT IN (SELECT DISTINCT thread_id FROM sms " +
-                        "UNION SELECT DISTINCT thread_id FROM pdu)", null);
-                break;
-            default:
-                throw new UnsupportedOperationException(NO_DELETES_INSERTS_OR_UPDATES);
-        }
-
-        if (affectedRows > 0) {
-            context.getContentResolver().notifyChange(MmsSms.CONTENT_URI, null);
-        }
-        return affectedRows;
-    }
-
-    /**
-     * Delete the conversation with the given thread ID.
-     */
-    private int deleteConversation(Uri uri, String selection, String[] selectionArgs) {
-        String threadId = uri.getLastPathSegment();
-
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        String finalSelection = concatSelections(selection, "thread_id = " + threadId);
-        return MmsProvider.deleteMessages(getContext(), db, finalSelection,
-                                          selectionArgs, uri)
-                + db.delete("sms", finalSelection, selectionArgs);
-    }
-
-    @Override
-    public Uri insert(Uri uri, ContentValues values) {
-        throw new UnsupportedOperationException(NO_DELETES_INSERTS_OR_UPDATES);
-    }
-
-    @Override
-    public int update(Uri uri, ContentValues values,
-            String selection, String[] selectionArgs) {
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        int affectedRows = 0;
-        switch(URI_MATCHER.match(uri)) {
-            case URI_CONVERSATIONS_MESSAGES:
-                String threadIdString = uri.getPathSegments().get(1);
-                affectedRows = updateConversation(threadIdString, values,
-                        selection, selectionArgs);
-                break;
-            case URI_PENDING_MSG:
-                affectedRows = db.update(TABLE_PENDING_MSG, values, selection, null);
-                break;
-            default:
-                throw new UnsupportedOperationException(
-                        NO_DELETES_INSERTS_OR_UPDATES);
-        }
-
-        if (affectedRows > 0) {
-            getContext().getContentResolver().notifyChange(
-                    MmsSms.CONTENT_URI, null);
-        }
-        return affectedRows;
-    }
-
-    private int updateConversation(
-            String threadIdString, ContentValues values, String selection,
-            String[] selectionArgs) {
-        try {
-            Long.parseLong(threadIdString);
-        } catch (NumberFormatException exception) {
-            Log.e(LOG_TAG, "Thread ID must be a Long.");
-            return 0;
-        }
-
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        String finalSelection = concatSelections(selection, "thread_id=" + threadIdString);
-        return db.update(MmsProvider.TABLE_PDU, values, finalSelection, selectionArgs)
-                + db.update("sms", values, finalSelection, selectionArgs);
-    }
-
-    /**
-     * Construct Sets of Strings containing exactly the columns
-     * present in each table.  We will use this when constructing
-     * UNION queries across the MMS and SMS tables.
-     */
-    private static void initializeColumnSets() {
-        int commonColumnCount = MMS_SMS_COLUMNS.length;
-        int mmsOnlyColumnCount = MMS_ONLY_COLUMNS.length;
-        int smsOnlyColumnCount = SMS_ONLY_COLUMNS.length;
-        Set<String> unionColumns = new HashSet<String>();
-
-        for (int i = 0; i < commonColumnCount; i++) {
-            MMS_COLUMNS.add(MMS_SMS_COLUMNS[i]);
-            SMS_COLUMNS.add(MMS_SMS_COLUMNS[i]);
-            unionColumns.add(MMS_SMS_COLUMNS[i]);
-        }
-        for (int i = 0; i < mmsOnlyColumnCount; i++) {
-            MMS_COLUMNS.add(MMS_ONLY_COLUMNS[i]);
-            unionColumns.add(MMS_ONLY_COLUMNS[i]);
-        }
-        for (int i = 0; i < smsOnlyColumnCount; i++) {
-            SMS_COLUMNS.add(SMS_ONLY_COLUMNS[i]);
-            unionColumns.add(SMS_ONLY_COLUMNS[i]);
-        }
-
-        int i = 0;
-        for (String columnName : unionColumns) {
-            UNION_COLUMNS[i++] = columnName;
-        }
-    }
-}
diff --git a/src/com/android/providers/telephony/SmsProvider.java b/src/com/android/providers/telephony/SmsProvider.java
deleted file mode 100644
index 56b39de..0000000
--- a/src/com/android/providers/telephony/SmsProvider.java
+++ /dev/null
@@ -1,718 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.providers.telephony;
-
-import android.content.ContentProvider;
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.UriMatcher;
-import com.android.internal.database.ArrayListCursor;
-import android.database.Cursor;
-import android.database.DatabaseUtils;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.database.sqlite.SQLiteQueryBuilder;
-import android.net.Uri;
-import android.provider.Contacts;
-import android.provider.Telephony.Mms;
-import android.provider.Telephony.MmsSms;
-import android.provider.Telephony.Sms;
-import android.provider.Telephony.TextBasedSmsColumns;
-import android.provider.Telephony.Threads;
-import android.telephony.gsm.SmsManager;
-import android.telephony.gsm.SmsMessage;
-import android.text.TextUtils;
-import android.util.Config;
-import android.util.Log;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-public class SmsProvider extends ContentProvider {
-    private static final Uri NOTIFICATION_URI = Uri.parse("content://sms");
-    private static final Uri SIM_URI = Uri.parse("content://sms/sim");
-    static final String TABLE_SMS = "sms";
-
-    private static final Integer ONE = Integer.valueOf(1);
-
-    /**
-     * These are the columns that are available when reading SMS
-     * messages from the SIM.  Columns whose names begin with "is_"
-     * have either "true" or "false" as their values.
-     */
-    private final static String[] SIM_COLUMNS = new String[] {
-        // N.B.: These columns must appear in the same order as the
-        // calls to add appear in convertSimToSms.
-        "service_center_address",       // getServiceCenterAddress
-        "address",                      // getDisplayOriginatingAddress
-        "message_class",                // getMessageClass
-        "body",                         // getDisplayMessageBody
-        "date",                         // getTimestampMillis
-        "status",                       // getStatusOnSim
-        "index_on_sim",                 // getIndexOnSim
-        "is_status_report",             // isStatusReportMessage
-        "transport_type",               // Always "sms".
-        "type"                          // Always MESSAGE_TYPE_ALL.
-    };
-
-    @Override
-    public boolean onCreate() {
-        mOpenHelper = MmsSmsDatabaseHelper.getInstance(getContext());
-        return true;
-    }
-
-    @Override
-    public Cursor query(Uri url, String[] projectionIn, String selection,
-            String[] selectionArgs, String sort) {
-        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
-
-        // Generate the body of the query.
-        int match = sURLMatcher.match(url);
-        switch (match) {
-            case SMS_ALL:
-                constructQueryForBox(qb, Sms.MESSAGE_TYPE_ALL);
-                break;
-
-            case SMS_UNDELIVERED:
-                constructQueryForUndelivered(qb);
-                break;
-                
-            case SMS_FAILED:
-                constructQueryForBox(qb, Sms.MESSAGE_TYPE_FAILED);
-                break;
-
-            case SMS_QUEUED:
-                constructQueryForBox(qb, Sms.MESSAGE_TYPE_QUEUED);
-                break;
-                
-            case SMS_INBOX:
-                constructQueryForBox(qb, Sms.MESSAGE_TYPE_INBOX);
-                break;
-
-            case SMS_SENT:
-                constructQueryForBox(qb, Sms.MESSAGE_TYPE_SENT);
-                break;
-
-            case SMS_DRAFT:
-                constructQueryForBox(qb, Sms.MESSAGE_TYPE_DRAFT);
-                break;
-
-            case SMS_OUTBOX:
-                constructQueryForBox(qb, Sms.MESSAGE_TYPE_OUTBOX);
-                break;
-
-            case SMS_ALL_ID:
-                qb.setTables(TABLE_SMS);
-                qb.appendWhere("(_id = " + url.getPathSegments().get(0) + ")");
-                break;
-
-            case SMS_INBOX_ID:
-            case SMS_FAILED_ID:
-            case SMS_SENT_ID:
-            case SMS_DRAFT_ID:
-            case SMS_OUTBOX_ID:
-                qb.setTables(TABLE_SMS);
-                qb.appendWhere("(_id = " + url.getPathSegments().get(1) + ")");
-                break;
-
-            case SMS_CONVERSATIONS_ID:
-                int threadID;
-
-                try {
-                    threadID = Integer.parseInt(url.getPathSegments().get(1));
-                    if (Config.LOGD) {
-                        Log.d(TAG, "query conversations: threadID=" + threadID);
-                    }
-                }
-                catch (Exception ex) {
-                    Log.e(TAG,
-                          "Bad conversation thread id: "
-                          + url.getPathSegments().get(1));
-                    return null;
-                }
-
-                qb.setTables(TABLE_SMS);
-                qb.appendWhere("thread_id = " + threadID);
-                break;
-
-            case SMS_CONVERSATIONS:
-                qb.setTables("sms, (SELECT thread_id AS group_thread_id, MAX(date) AS group_date, COUNT(*) AS msg_count FROM sms GROUP BY thread_id) AS groups");
-                qb.appendWhere("sms.thread_id = groups.group_thread_id AND sms.date = groups.group_date");
-                qb.setProjectionMap(sConversationProjectionMap);
-                break;
-
-            case SMS_RAW_MESSAGE:
-                qb.setTables("raw");
-                break;
-
-            case SMS_STATUS_PENDING:
-                qb.setTables("sr_pending");
-                break;
-
-            case SMS_ATTACHMENT:
-                qb.setTables("attachments");
-                break;
-
-            case SMS_ATTACHMENT_ID:
-                qb.setTables("attachments");
-                qb.appendWhere(
-                        "(sms_id = " + url.getPathSegments().get(1) + ")");
-                break;
-
-            case SMS_QUERY_THREAD_ID:
-                qb.setTables("canonical_addresses");
-                if (projectionIn == null) {
-                    projectionIn = sIDProjection;
-                }
-                break;
-
-            case SMS_STATUS_ID:
-                qb.setTables(TABLE_SMS);
-                qb.appendWhere("(_id = " + url.getPathSegments().get(1) + ")");
-                break;
-
-            case SMS_ALL_SIM:
-                return getAllMessagesFromSim();
-
-            case SMS_SIM:
-                String messageIndexString = url.getPathSegments().get(1);
-
-                return getSingleMessageFromSim(messageIndexString);
-
-            default:
-                Log.e(TAG, "Invalid request: " + url);
-                return null;
-        }
-
-        String orderBy = null;
-
-        if (!TextUtils.isEmpty(sort)) {
-            orderBy = sort;
-        } else if (qb.getTables().equals(TABLE_SMS)) {
-            orderBy = Sms.DEFAULT_SORT_ORDER;
-        }
-
-        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
-        Cursor ret = qb.query(db, projectionIn, selection, selectionArgs,
-                              null, null, orderBy);
-
-        // TODO: Since the URLs are a mess, always use content://sms
-        ret.setNotificationUri(getContext().getContentResolver(),
-                NOTIFICATION_URI);
-        return ret;
-    }
-
-    private ArrayList<String> convertSimToSms(SmsMessage message) {
-        ArrayList result = new ArrayList();
-
-        // N.B.: These calls must appear in the same order as the
-        // columns appear in SIM_COLUMNS.
-        result.add(message.getServiceCenterAddress());
-        result.add(message.getDisplayOriginatingAddress());
-        result.add(message.getMessageClass().toString());
-        result.add(message.getDisplayMessageBody());
-        result.add(message.getTimestampMillis());
-        result.add(Sms.STATUS_NONE);
-        result.add(message.getIndexOnSim());
-        result.add(message.isStatusReportMessage());
-        result.add("sms");
-        result.add(TextBasedSmsColumns.MESSAGE_TYPE_ALL);
-        return result;
-    }
-
-    /**
-     * Return a Cursor containing just one message from the SIM.
-     */
-    private Cursor getSingleMessageFromSim(String messageIndexString) {
-        try {
-            int messageIndex = Integer.parseInt(messageIndexString);
-            SmsManager smsManager = SmsManager.getDefault();
-            ArrayList<SmsMessage> messages = smsManager.getAllMessagesFromSim();
-            ArrayList<ArrayList> singleRow = new ArrayList<ArrayList>();
-
-            singleRow.add(convertSimToSms(messages.get(messageIndex)));
-            return withSimNotificationUri(
-                    new ArrayListCursor(SIM_COLUMNS, singleRow));
-        } catch (NumberFormatException exception) {
-            throw new IllegalArgumentException(
-                    "Bad SMS SIM ID: " + messageIndexString);
-        }
-    }
-
-    /**
-     * Return a Cursor listing all the messages stored on the SIM.
-     */
-    private Cursor getAllMessagesFromSim() {
-        SmsManager smsManager = SmsManager.getDefault();
-        ArrayList<SmsMessage> messages = smsManager.getAllMessagesFromSim();
-        ArrayList<ArrayList> rows = new ArrayList<ArrayList>();
-
-        for (int count = messages.size(), i = 0; i < count; i++) {
-            rows.add(convertSimToSms(messages.get(i)));
-        }
-        return withSimNotificationUri(new ArrayListCursor(SIM_COLUMNS, rows));
-    }
-
-    private Cursor withSimNotificationUri(Cursor cursor) {
-        cursor.setNotificationUri(getContext().getContentResolver(),
-                                  SIM_URI);
-        return cursor;
-    }
-
-    private void constructQueryForBox(SQLiteQueryBuilder qb, int type) {
-        qb.setTables(TABLE_SMS);
-
-        if (type != Sms.MESSAGE_TYPE_ALL) {
-            qb.appendWhere("type=" + type);
-        }
-    }
-
-    private void constructQueryForUndelivered(SQLiteQueryBuilder qb) {
-        qb.setTables(TABLE_SMS);
-
-        qb.appendWhere("(type=" + Sms.MESSAGE_TYPE_OUTBOX +
-                       " OR type=" + Sms.MESSAGE_TYPE_FAILED +
-                       " OR type=" + Sms.MESSAGE_TYPE_QUEUED + ")");
-    }
-    
-    @Override
-    public String getType(Uri url) {
-        switch (url.getPathSegments().size()) {
-        case 0:
-            return VND_ANDROID_DIR_SMS;
-            case 1:
-                try {
-                    Integer.parseInt(url.getPathSegments().get(0));
-                    return VND_ANDROID_SMS;
-                } catch (NumberFormatException ex) {
-                    return VND_ANDROID_DIR_SMS;
-                }
-            case 2:
-                // TODO: What about "threadID"?
-                if (url.getPathSegments().get(0).equals("conversations")) {
-                    return VND_ANDROID_SMSCHAT;
-                } else {
-                    return VND_ANDROID_SMS;
-                }
-        }
-        return null;
-    }
-
-    @Override
-    public Uri insert(Uri url, ContentValues initialValues) {
-        ContentValues values;
-        long rowID;
-        int type = Sms.MESSAGE_TYPE_ALL;
-
-        int match = sURLMatcher.match(url);
-        if (Config.LOGD) {
-            Log.d(TAG, "insert url=" + url + ", match=" + match);
-        }
-
-        String table = TABLE_SMS;
-
-        switch (match) {
-            case SMS_ALL:
-                Integer typeObj = initialValues.getAsInteger(Sms.TYPE);
-                if (typeObj != null) {
-                    type = typeObj.intValue();
-                } else {
-                    // default to inbox
-                    type = Sms.MESSAGE_TYPE_INBOX;
-                }
-                break;
-
-            case SMS_INBOX:
-                type = Sms.MESSAGE_TYPE_INBOX;
-                break;
-
-            case SMS_FAILED:
-                type = Sms.MESSAGE_TYPE_FAILED;
-                break;
-
-            case SMS_QUEUED:
-                type = Sms.MESSAGE_TYPE_QUEUED;
-                break;
-                
-            case SMS_SENT:
-                type = Sms.MESSAGE_TYPE_SENT;
-                break;
-
-            case SMS_DRAFT:
-                type = Sms.MESSAGE_TYPE_DRAFT;
-                break;
-
-            case SMS_OUTBOX:
-                type = Sms.MESSAGE_TYPE_OUTBOX;
-                break;
-
-            case SMS_RAW_MESSAGE:
-                table = "raw";
-                break;
-
-            case SMS_STATUS_PENDING:
-                table = "sr_pending";
-                break;
-
-            case SMS_ATTACHMENT:
-                table = "attachments";
-                break;
-
-            case SMS_NEW_THREAD_ID:
-                table = "canonical_addresses";
-                break;
-
-            default:
-                Log.e(TAG, "Invalid request: " + url);
-                return null;
-        }
-
-        if (table.equals(TABLE_SMS)) {
-            boolean addDate = false;
-            boolean addType = false;
-
-            // Make sure that the date and type are set
-            if (initialValues == null) {
-                values = new ContentValues(1);
-                addDate = true;
-                addType = true;
-            } else {
-                values = new ContentValues(initialValues);
-
-                if (!initialValues.containsKey(Sms.DATE)) {
-                    addDate = true;
-                }
-
-                if (!initialValues.containsKey(Sms.TYPE)) {
-                    addType = true;
-                }
-            }
-
-            if (addDate) {
-                values.put(Sms.DATE, new Long(System.currentTimeMillis()));
-            }
-
-            if (addType && (type != Sms.MESSAGE_TYPE_ALL)) {
-                values.put(Sms.TYPE, Integer.valueOf(type));
-            }
-
-            // thread_id
-            Long threadId = values.getAsLong(Sms.THREAD_ID);
-            String address = values.getAsString(Sms.ADDRESS);
-
-            if (((threadId == null) || (threadId == 0)) && (address != null)) {
-                values.put(Sms.THREAD_ID, Threads.getOrCreateThreadId(
-                                   getContext(), address));
-            }
-
-            if (type == Sms.MESSAGE_TYPE_INBOX) {
-                // Look up the person if not already filled in.
-                if ((values.getAsLong(Sms.PERSON) == null)
-                        && (!TextUtils.isEmpty(address))) {
-                    Cursor cursor = getContext().getContentResolver().query(
-                            Uri.withAppendedPath(
-                                    Contacts.Phones.CONTENT_FILTER_URL, address),
-                            new String[] { Contacts.Phones.PERSON_ID },
-                            null, null, null);
-                    if (cursor != null) {
-                        if (cursor.getCount() > 0) {
-                            cursor.moveToFirst();
-                            Long id = Long.valueOf(cursor.getLong(0));
-                                values.put(Sms.PERSON, id);
-                        }
-                        cursor.deactivate();
-                    }
-                }
-            } else {
-                // Mark all non-inbox messages read.
-                values.put(Sms.READ, ONE);
-            }
-        } else {
-            if (initialValues == null) {
-                values = new ContentValues(1);
-            } else {
-                values = initialValues;
-            }
-        }
-
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        rowID = db.insert(table, "body", values);
-        if (rowID > 0) {
-            Uri uri = Uri.parse("content://" + table + "/" + rowID);
-            notifyChange(uri);
-            return uri;
-        } else {
-            Log.e(TAG,
-                  "SmsProvider.insert: failed! " + values.toString());
-        }
-
-        return null;
-    }
-
-    @Override
-    public int delete(Uri url, String where, String[] whereArgs) {
-        int count;
-        int match = sURLMatcher.match(url);
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        switch (match) {
-            case SMS_ALL:
-                count = db.delete(TABLE_SMS, where, whereArgs);
-                if (count != 0) {
-                    // Don't update threads unless something changed.
-                    MmsSmsDatabaseHelper.updateAllThreads(db, where, whereArgs);
-                }
-                break;
-             
-            case SMS_ALL_ID:
-                try {
-                    int message_id = Integer.parseInt(url.getPathSegments().get(0));
-                    count = MmsSmsDatabaseHelper.deleteOneSms(db, message_id);
-                } catch (Exception e) {
-                    throw new IllegalArgumentException(
-                        "Bad message id: " + url.getPathSegments().get(0));
-                }
-                break;
-
-            case SMS_CONVERSATIONS_ID:
-                int threadID;
-
-                try {
-                    threadID = Integer.parseInt(url.getPathSegments().get(1));
-                } catch (Exception ex) {
-                    throw new IllegalArgumentException(
-                            "Bad conversation thread id: "
-                            + url.getPathSegments().get(1));
-                }
-
-                // delete the messages from the sms table
-                where = DatabaseUtils.concatenateWhere("thread_id=" + threadID, where);
-                count = db.delete(TABLE_SMS, where, whereArgs);
-                MmsSmsDatabaseHelper.updateThread(db, threadID);
-                break;
-
-            case SMS_RAW_MESSAGE:
-                count = db.delete("raw", where, whereArgs);
-                break;
-
-            case SMS_STATUS_PENDING:
-                count = db.delete("sr_pending", where, whereArgs);
-                break;
-
-            case SMS_SIM:
-                String messageIndexString = url.getPathSegments().get(1);
-
-                return deleteMessageFromSim(messageIndexString);
-
-            default:
-                throw new IllegalArgumentException("Unknown URL");
-        }
-
-        if (count > 0) {
-            notifyChange(url);
-        }
-        return count;
-    }
-
-    /**
-     * Delete the message at index from SIM.  Return true iff
-     * successful.
-     */
-    private int deleteMessageFromSim(String messageIndexString) {
-        SmsManager smsManager = SmsManager.getDefault();
-
-        try {
-            return smsManager.deleteMessageFromSim(
-                    Integer.parseInt(messageIndexString))
-                    ? 1 : 0;
-        } catch (NumberFormatException exception) {
-            throw new IllegalArgumentException(
-                    "Bad SMS SIM ID: " + messageIndexString);
-        } finally {
-            ContentResolver cr = getContext().getContentResolver();
-
-            cr.notifyChange(SIM_URI, null);
-        }
-    }
-
-    @Override
-    public int update(
-            Uri url, ContentValues values, String where, String[] whereArgs) {
-        int count = 0;
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        switch (sURLMatcher.match(url)) {
-            case SMS_RAW_MESSAGE:
-                count = db.update("raw", values, where, whereArgs);
-                break;
-
-            case SMS_STATUS_PENDING:
-                count = db.update("sr_pending", values, where, whereArgs);
-                break;
-
-            case SMS_ALL:
-            case SMS_FAILED:
-            case SMS_QUEUED:
-            case SMS_INBOX:
-            case SMS_SENT:
-            case SMS_DRAFT:
-            case SMS_OUTBOX:
-            case SMS_CONVERSATIONS:
-                count = db.update(
-                        TABLE_SMS, values, where, whereArgs);
-                break;
-
-            case SMS_ALL_ID:
-                if (where != null) {
-                    throw new UnsupportedOperationException(
-                            "WHERE not supported");
-                }
-                count = db.update(TABLE_SMS, values, "_id="
-                        + url.getPathSegments().get(0), null);
-                break;
-
-            case SMS_INBOX_ID:
-            case SMS_FAILED_ID:
-            case SMS_SENT_ID:
-            case SMS_DRAFT_ID:
-            case SMS_OUTBOX_ID:
-                if (where != null) {
-                    throw new UnsupportedOperationException(
-                            "WHERE not supported for this URI");
-                }
-                count = db.update(TABLE_SMS, values, "_id="
-                        + url.getPathSegments().get(1), null);
-                break;
-
-            case SMS_CONVERSATIONS_ID: {
-                int threadId;
-
-                try {
-                    threadId = Integer.parseInt(url.getPathSegments().get(1));
-                } catch (Exception ex) {
-                    Log.e(TAG, "Bad conversation thread id: "
-                            + url.getPathSegments().get(1));
-                    count = 0;
-                    break;
-                }
-
-                if (where != null) {
-                    throw new UnsupportedOperationException(
-                            "WHERE not supported for this URI");
-                }
-                count = db.update(
-                        TABLE_SMS, values, "thread_id = " + threadId,
-                        null);
-                break;
-            }
-
-            case SMS_STATUS_ID:
-                String idString = url.getPathSegments().get(1); 
-
-                count = db.update(TABLE_SMS, values, "_id=" + idString, null);
-                break;  
-                    
-            default:
-                throw new UnsupportedOperationException(
-                        "URI " + url + " not supported");
-        }
-
-        if (count > 0) {
-            notifyChange(url);
-        }
-        return count;
-    }
-
-    private void notifyChange(Uri uri) {
-        ContentResolver cr = getContext().getContentResolver();
-        cr.notifyChange(uri, null);
-        cr.notifyChange(MmsSms.CONTENT_URI, null);
-        cr.notifyChange(Uri.parse("content://mms-sms/conversations/"), null);
-    }
-
-    private SQLiteOpenHelper mOpenHelper;
-
-    private final static String TAG = "SmsProvider";
-    private final static String VND_ANDROID_SMS = "vnd.android.cursor.item/sms";
-    private final static String VND_ANDROID_SMSCHAT =
-            "vnd.android.cursor.item/sms-chat";
-    private final static String VND_ANDROID_DIR_SMS =
-            "vnd.android.cursor.dir/sms";
-
-    private static final HashMap<String, String> sConversationProjectionMap =
-            new HashMap<String, String>();
-    private static final String[] sIDProjection = new String[] { "_id" };
-
-    private static final int SMS_ALL = 0;
-    private static final int SMS_ALL_ID = 1;
-    private static final int SMS_INBOX = 2;
-    private static final int SMS_INBOX_ID = 3;
-    private static final int SMS_SENT = 4;
-    private static final int SMS_SENT_ID = 5;
-    private static final int SMS_DRAFT = 6;
-    private static final int SMS_DRAFT_ID = 7;
-    private static final int SMS_OUTBOX = 8;
-    private static final int SMS_OUTBOX_ID = 9;
-    private static final int SMS_CONVERSATIONS = 10;
-    private static final int SMS_CONVERSATIONS_ID = 11;
-    private static final int SMS_RAW_MESSAGE = 15;
-    private static final int SMS_ATTACHMENT = 16;
-    private static final int SMS_ATTACHMENT_ID = 17;
-    private static final int SMS_NEW_THREAD_ID = 18;
-    private static final int SMS_QUERY_THREAD_ID = 19;
-    private static final int SMS_STATUS_ID = 20;
-    private static final int SMS_STATUS_PENDING = 21;
-    private static final int SMS_ALL_SIM = 22;
-    private static final int SMS_SIM = 23;
-    private static final int SMS_FAILED = 24;
-    private static final int SMS_FAILED_ID = 25;
-    private static final int SMS_QUEUED = 26;
-    private static final int SMS_UNDELIVERED = 27;
-    
-    private static final UriMatcher sURLMatcher =
-            new UriMatcher(UriMatcher.NO_MATCH);
-
-    static {
-        sURLMatcher.addURI("sms", null, SMS_ALL);
-        sURLMatcher.addURI("sms", "#", SMS_ALL_ID);
-        sURLMatcher.addURI("sms", "inbox", SMS_INBOX);
-        sURLMatcher.addURI("sms", "inbox/#", SMS_INBOX_ID);
-        sURLMatcher.addURI("sms", "sent", SMS_SENT);
-        sURLMatcher.addURI("sms", "sent/#", SMS_SENT_ID);
-        sURLMatcher.addURI("sms", "draft", SMS_DRAFT);
-        sURLMatcher.addURI("sms", "draft/#", SMS_DRAFT_ID);
-        sURLMatcher.addURI("sms", "outbox", SMS_OUTBOX);
-        sURLMatcher.addURI("sms", "outbox/#", SMS_OUTBOX_ID);
-        sURLMatcher.addURI("sms", "undelivered", SMS_UNDELIVERED);        
-        sURLMatcher.addURI("sms", "failed", SMS_FAILED);
-        sURLMatcher.addURI("sms", "failed/#", SMS_FAILED_ID);
-        sURLMatcher.addURI("sms", "queued", SMS_QUEUED);
-        sURLMatcher.addURI("sms", "conversations", SMS_CONVERSATIONS);
-        sURLMatcher.addURI("sms", "conversations/*", SMS_CONVERSATIONS_ID);
-        sURLMatcher.addURI("sms", "raw", SMS_RAW_MESSAGE);
-        sURLMatcher.addURI("sms", "attachments", SMS_ATTACHMENT);
-        sURLMatcher.addURI("sms", "attachments/#", SMS_ATTACHMENT_ID);
-        sURLMatcher.addURI("sms", "threadID", SMS_NEW_THREAD_ID);
-        sURLMatcher.addURI("sms", "threadID/*", SMS_QUERY_THREAD_ID);
-        sURLMatcher.addURI("sms", "status/#", SMS_STATUS_ID);
-        sURLMatcher.addURI("sms", "sr_pending", SMS_STATUS_PENDING);
-        sURLMatcher.addURI("sms", "sim", SMS_ALL_SIM);
-        sURLMatcher.addURI("sms", "sim/#", SMS_SIM);
-
-        sConversationProjectionMap.put(Sms.Conversations.SNIPPET,
-                "body AS snippet");
-        sConversationProjectionMap.put("delta", null);
-    }
-}
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
deleted file mode 100644
index 95018be..0000000
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ /dev/null
@@ -1,497 +0,0 @@
-/* //device/content/providers/telephony/TelephonyProvider.java
-**
-** Copyright 2006, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
-
-package com.android.providers.telephony;
-
-import android.content.*;
-import android.content.res.Resources;
-import android.content.res.XmlResourceParser;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.database.sqlite.SQLiteQueryBuilder;
-import android.net.Uri;
-import android.os.Environment;
-import android.provider.Telephony;
-import android.util.Config;
-import android.util.Log;
-import android.util.Xml;
-import com.android.internal.util.XmlUtils;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-
-public class TelephonyProvider extends ContentProvider
-{
-    private static final String DATABASE_NAME = "telephony.db";
-    // DATABASE_VERSION needs to be in-sync with version in apns.xml.
-    private static final int DATABASE_VERSION = 4 << 16;
-    private static final int URL_TELEPHONY = 1;
-    private static final int URL_CURRENT = 2;
-    private static final int URL_ID = 3;
-
-    private static final String TAG = "TelephonyProvider";
-    private static final String CARRIERS_TABLE = "carriers";
-    private static final String PARTNER_APNS_PATH = "etc/apns-conf.xml";
-
-    private static final UriMatcher s_urlMatcher = new UriMatcher(UriMatcher.NO_MATCH);
-
-    private static final ContentValues s_currentNullMap;
-    private static final ContentValues s_currentSetMap;
-
-    static {
-        s_urlMatcher.addURI("telephony", "carriers", URL_TELEPHONY);
-        s_urlMatcher.addURI("telephony", "carriers/current", URL_CURRENT);
-        s_urlMatcher.addURI("telephony", "carriers/#", URL_ID);
-
-        s_currentNullMap = new ContentValues(1);
-        s_currentNullMap.put("current", (Long) null);
-
-        s_currentSetMap = new ContentValues(1);
-        s_currentSetMap.put("current", "1");
-    }
-
-    private static class DatabaseHelper extends SQLiteOpenHelper {
-        // Context to access resources with
-        private Context mContext;
-
-        /**
-         * DatabaseHelper helper class for loading apns into a database.
-         *
-         * @param parser the system-default parser for apns.xml
-         * @param confidential an optional parser for confidential APNS (stored separately)
-         */
-        public DatabaseHelper(Context context) {
-            super(context, DATABASE_NAME, null, getVersion(context));
-            mContext = context;
-        }
-
-        private static int getVersion(Context context) {
-            // Get the database version, combining a static schema version and the XML version
-            Resources r = context.getResources();
-            XmlResourceParser parser = r.getXml(com.android.internal.R.xml.apns);
-            try {
-                XmlUtils.beginDocument(parser, "apns");
-                int publicversion = Integer.parseInt(parser.getAttributeValue(null, "version"));
-                return DATABASE_VERSION | publicversion;
-            } catch (Exception e) {
-                Log.e(TAG, "Can't get version of APN database", e);
-                return DATABASE_VERSION;
-            } finally {
-                parser.close();
-            }
-        }
-
-        @Override
-        public void onCreate(SQLiteDatabase db) {
-            // Set up the database schema
-            db.execSQL("CREATE TABLE " + CARRIERS_TABLE +
-                "(_id INTEGER PRIMARY KEY," +
-                    "name TEXT," +
-                    "numeric TEXT," +
-                    "mcc TEXT," +
-                    "mnc TEXT," +
-                    "apn TEXT," +
-                    "user TEXT," +
-                    "server TEXT," +
-                    "password TEXT," +
-                    "proxy TEXT," +
-                    "port TEXT," +
-                    "mmsproxy TEXT," +
-                    "mmsport TEXT," +
-                    "mmsc TEXT," +
-                    "type TEXT," +
-                    "current INTEGER);");
-
-            // Read internal APNS data
-            Resources r = mContext.getResources();
-            XmlResourceParser parser = r.getXml(com.android.internal.R.xml.apns);
-            int publicversion = -1;
-            try {
-                XmlUtils.beginDocument(parser, "apns");
-                publicversion = Integer.parseInt(parser.getAttributeValue(null, "version"));
-                loadApns(db, parser);
-            } catch (Exception e) {
-                Log.e(TAG, "Got execption while loading APN database.", e);
-            } finally {
-                parser.close();
-            }
-
-            // Read external APNS data (partner-provided)
-            XmlPullParser confparser = null;
-            // Environment.getRootDirectory() is a fancy way of saying ANDROID_ROOT or "/system".
-            File confFile = new File(Environment.getRootDirectory(), PARTNER_APNS_PATH);
-            FileReader confreader = null;
-            try {
-                confreader = new FileReader(confFile);
-                confparser = Xml.newPullParser();
-                confparser.setInput(confreader);
-                XmlUtils.beginDocument(confparser, "apns");
-
-                // Sanity check. Force internal version and confidential versions to agree
-                int confversion = Integer.parseInt(confparser.getAttributeValue(null, "version"));
-                if (publicversion != confversion) {
-                    throw new IllegalStateException("Internal APNS file version doesn't match "
-                            + confFile.getAbsolutePath());
-                }
-
-                loadApns(db, confparser);
-            } catch (FileNotFoundException e) {
-                // It's ok if the file isn't found. It means there isn't a confidential file
-                // Log.e(TAG, "File not found: '" + confFile.getAbsolutePath() + "'");
-            } catch (Exception e) {
-                Log.e(TAG, "Exception while parsing '" + confFile.getAbsolutePath() + "'", e);
-            } finally {
-                try { if (confreader != null) confreader.close(); } catch (IOException e) { }
-            }
-        }
-
-        @Override
-        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-            db.execSQL("DROP TABLE IF EXISTS " + CARRIERS_TABLE + ";");
-            onCreate(db);
-        }
-
-        /**
-         * Gets the next row of apn values.
-         *
-         * @param parser the parser
-         * @return the row or null if it's not an apn
-         */
-        private ContentValues getRow(XmlPullParser parser) {
-            if (!"apn".equals(parser.getName())) {
-                return null;
-            }
-
-            ContentValues map = new ContentValues();
-
-            String mcc = parser.getAttributeValue(null, "mcc");
-            String mnc = parser.getAttributeValue(null, "mnc");
-            String numeric = mcc + mnc;
-
-            map.put(Telephony.Carriers.NUMERIC,numeric);
-            map.put(Telephony.Carriers.MCC, mcc);
-            map.put(Telephony.Carriers.MNC, mnc);
-            map.put(Telephony.Carriers.NAME, parser.getAttributeValue(null, "carrier"));
-            map.put(Telephony.Carriers.APN, parser.getAttributeValue(null, "apn"));
-            map.put(Telephony.Carriers.USER, parser.getAttributeValue(null, "user"));
-            map.put(Telephony.Carriers.SERVER, parser.getAttributeValue(null, "server"));
-            map.put(Telephony.Carriers.PASSWORD, parser.getAttributeValue(null, "password"));
-
-            // do not add NULL to the map so that insert() will set the default value
-            String proxy = parser.getAttributeValue(null, "proxy");
-            if (proxy != null) {
-                map.put(Telephony.Carriers.PROXY, proxy);
-            }
-            String port = parser.getAttributeValue(null, "port");
-            if (port != null) {
-                map.put(Telephony.Carriers.PORT, port);
-            }
-            String mmsproxy = parser.getAttributeValue(null, "mmsproxy");
-            if (mmsproxy != null) {
-                map.put(Telephony.Carriers.MMSPROXY, mmsproxy);
-            }
-            String mmsport = parser.getAttributeValue(null, "mmsport");
-            if (mmsport != null) {
-                map.put(Telephony.Carriers.MMSPORT, mmsport);
-            }
-            map.put(Telephony.Carriers.MMSC, parser.getAttributeValue(null, "mmsc"));
-            String type = parser.getAttributeValue(null, "type");
-            if (type != null) {
-                map.put(Telephony.Carriers.TYPE, type);
-            }
-
-            return map;
-        }
-
-        /*
-         * Loads apns from xml file into the database
-         *
-         * @param db the sqlite database to write to
-         * @param parser the xml parser
-         *
-         */
-        private void loadApns(SQLiteDatabase db, XmlPullParser parser) {
-            if (parser != null) {
-                try {
-                    while (true) {
-                        XmlUtils.nextElement(parser);
-                        ContentValues row = getRow(parser);
-                        if (row != null) {
-                            db.insert(CARRIERS_TABLE, null, row);
-                        } else {
-                            break;  // do we really want to skip the rest of the file?
-                        }
-                    }
-                } catch (XmlPullParserException e)  {
-                    Log.e(TAG, "Got execption while getting perferred time zone.", e);
-                } catch (IOException e) {
-                    Log.e(TAG, "Got execption while getting perferred time zone.", e);
-                }
-            }
-        }
-    }
-
-    @Override
-    public boolean onCreate() {
-        mOpenHelper = new DatabaseHelper(getContext());
-        return true;
-    }
-
-    @Override
-    public Cursor query(Uri url, String[] projectionIn, String selection,
-            String[] selectionArgs, String sort) {
-        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
-        qb.setTables("carriers");
-
-        int match = s_urlMatcher.match(url);
-        switch (match) {
-            // do nothing
-            case URL_TELEPHONY: {
-                break;
-            }
-
-
-            case URL_CURRENT: {
-                qb.appendWhere("current IS NOT NULL");
-                break;
-            }
-
-            case URL_ID: {
-                qb.appendWhere("_id = " + url.getPathSegments().get(1));
-                break;
-            }
-
-            default: {
-                return null;
-            }
-        }
-
-        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
-        Cursor ret = qb.query(db, projectionIn, selection, selectionArgs, null, null, sort);
-        ret.setNotificationUri(getContext().getContentResolver(), url);
-        return ret;
-    }
-
-    @Override
-    public String getType(Uri url)
-    {
-        switch (s_urlMatcher.match(url)) {
-        case URL_TELEPHONY:
-            return "vnd.android.cursor.dir/telephony-carrier";
-
-        case URL_ID:
-            return "vnd.android.cursor.item/telephony-carrier";
-
-        default:
-            throw new IllegalArgumentException("Unknown URL " + url);
-        }
-    }
-
-    @Override
-    public Uri insert(Uri url, ContentValues initialValues)
-    {
-        Uri result = null;
-
-        checkPermission();
-
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        int match = s_urlMatcher.match(url);
-        boolean notify = false;
-        switch (match)
-        {
-            case URL_TELEPHONY:
-            {
-                ContentValues values;
-                if (initialValues != null) {
-                    values = new ContentValues(initialValues);
-                } else {
-                    values = new ContentValues();
-                }
-
-                // TODO Review this. This code should probably not bet here.
-                // It is valid for the database to return a null string.
-                if (values.containsKey(Telephony.Carriers.NAME) == false) {
-                    values.put(Telephony.Carriers.NAME, "");
-                }
-                if (values.containsKey(Telephony.Carriers.APN) == false) {
-                    values.put(Telephony.Carriers.APN, "");
-                }
-                if (values.containsKey(Telephony.Carriers.PORT) == false) {
-                    values.put(Telephony.Carriers.PORT, "");
-                }
-                if (values.containsKey(Telephony.Carriers.PROXY) == false) {
-                    values.put(Telephony.Carriers.PROXY, "");
-                }
-                if (values.containsKey(Telephony.Carriers.USER) == false) {
-                    values.put(Telephony.Carriers.USER, "");
-                }
-                if (values.containsKey(Telephony.Carriers.SERVER) == false) {
-                    values.put(Telephony.Carriers.SERVER, "");
-                }
-                if (values.containsKey(Telephony.Carriers.PASSWORD) == false) {
-                    values.put(Telephony.Carriers.PASSWORD, "");
-                }
-                if (values.containsKey(Telephony.Carriers.MMSPORT) == false) {
-                    values.put(Telephony.Carriers.MMSPORT, "");
-                }
-                if (values.containsKey(Telephony.Carriers.MMSPROXY) == false) {
-                    values.put(Telephony.Carriers.MMSPROXY, "");
-                }
-
-                long rowID = db.insert(CARRIERS_TABLE, null, values);
-                if (rowID > 0)
-                {
-                    result = ContentUris.withAppendedId(Telephony.Carriers.CONTENT_URI, rowID);
-                    notify = true;
-                }
-
-                if (Config.LOGD) Log.d(TAG, "inserted " + values.toString() + " rowID = " + rowID);
-                break;
-            }
-
-            case URL_CURRENT:
-            {
-                // null out the previous operator
-                db.update("carriers", s_currentNullMap, "current IS NOT NULL", null);
-
-                String numeric = initialValues.getAsString("numeric");
-                int updated = db.update("carriers", s_currentSetMap,
-                        "numeric = '" + numeric + "'", null);
-
-                if (updated > 0)
-                {
-                    if (Config.LOGD) {
-                        Log.d(TAG, "Setting numeric '" + numeric + "' to be the current operator");
-                    }
-                }
-                else
-                {
-                    Log.e(TAG, "Failed setting numeric '" + numeric + "' to the current operator");
-                }
-                break;
-            }
-        }
-
-        if (notify) {
-            getContext().getContentResolver().notifyChange(Telephony.Carriers.CONTENT_URI, null);
-        }
-
-        return result;
-    }
-
-    @Override
-    public int delete(Uri url, String where, String[] whereArgs)
-    {
-        int count;
-
-        checkPermission();
-        
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        int match = s_urlMatcher.match(url);
-        switch (match)
-        {
-            case URL_TELEPHONY:
-            {
-                count = db.delete(CARRIERS_TABLE, where, whereArgs);
-                break;
-            }
-
-            case URL_CURRENT:
-            {
-                count = db.delete(CARRIERS_TABLE, where, whereArgs);
-                break;
-            }
-            
-            case URL_ID:
-            {
-                count = db.delete(CARRIERS_TABLE, Telephony.Carriers._ID + "=?",
-                        new String[] { url.getLastPathSegment() });
-                break;
-            }
-
-            default: {
-                throw new UnsupportedOperationException("Cannot delete that URL: " + url);
-            }
-        }
-
-        if (count > 0) {
-            getContext().getContentResolver().notifyChange(Telephony.Carriers.CONTENT_URI, null);
-        }
-
-        return count;
-    }
-
-    @Override
-    public int update(Uri url, ContentValues values, String where, String[] whereArgs)
-    {
-        int count;
-
-        checkPermission();
-
-        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-        int match = s_urlMatcher.match(url);
-        switch (match)
-        {
-            case URL_TELEPHONY:
-            {
-                count = db.update(CARRIERS_TABLE, values, where, whereArgs);
-                break;
-            }
-
-            case URL_CURRENT:
-            {
-                count = db.update(CARRIERS_TABLE, values, where, whereArgs);
-                break;
-            }
-
-            case URL_ID:
-            {
-                if (where != null || whereArgs != null) {
-                    throw new UnsupportedOperationException(
-                            "Cannot update URL " + url + " with a where clause");
-                }
-                count = db.update(CARRIERS_TABLE, values, Telephony.Carriers._ID + "=?",
-                        new String[] { url.getLastPathSegment() });
-                break;
-            }
-            
-            default: {
-                throw new UnsupportedOperationException("Cannot update that URL: " + url);
-            }
-        }
-
-        if (count > 0) {
-            getContext().getContentResolver().notifyChange(Telephony.Carriers.CONTENT_URI, null);
-        }
-
-        return count;
-    }
-
-    private void checkPermission() {
-        // Check the permissions
-        getContext().enforceCallingOrSelfPermission("android.permission.WRITE_APN_SETTINGS",
-                "No permission to write APN settings");
-    }
-
-    private SQLiteOpenHelper mOpenHelper;
-}
