am d3f15bb5: am 9410265e: am 888ebca7: Merge "Send next message if current one fails"

# By Bin Li
# Via Android Git Automerger (2) and others
* commit 'd3f15bb57a3dde269f2fbcf5e3a6ee25646a23e8':
  Send next message if current one fails
diff --git a/src/com/android/mms/ui/ConversationList.java b/src/com/android/mms/ui/ConversationList.java
index ac71baa..884f484 100644
--- a/src/com/android/mms/ui/ConversationList.java
+++ b/src/com/android/mms/ui/ConversationList.java
@@ -171,6 +171,9 @@
     public void onPause() {
         super.onPause();
 
+        // Don't listen for changes while we're paused.
+        mListAdapter.setOnContentChangedListener(null);
+
         // Remember where the list is scrolled to so we can restore the scroll position
         // when we come back to this activity and *after* we complete querying for the
         // conversations.
@@ -180,6 +183,13 @@
         mSavedFirstItemOffset = (firstChild == null) ? 0 : firstChild.getTop();
     }
 
+    @Override
+    protected void onResume() {
+        super.onResume();
+
+        mListAdapter.setOnContentChangedListener(mContentChangedListener);
+    }
+
     private void setupActionBar() {
         ActionBar actionBar = getActionBar();
 
diff --git a/src/com/android/mms/ui/RecipientsAdapter.java b/src/com/android/mms/ui/RecipientsAdapter.java
deleted file mode 100644
index bafb410..0000000
--- a/src/com/android/mms/ui/RecipientsAdapter.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Copyright (C) 2008 Esmertec AG.
- * 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.mms.ui;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.database.Cursor;
-import android.database.MatrixCursor;
-import android.database.MergeCursor;
-import android.net.Uri;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.DataUsageFeedback;
-import android.telephony.PhoneNumberUtils;
-import android.text.Annotation;
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.TextUtils;
-import android.view.View;
-import android.widget.ResourceCursorAdapter;
-import android.widget.TextView;
-
-import com.android.mms.MmsApp;
-import com.android.mms.R;
-import com.android.mms.data.Contact;
-
-/**
- * This adapter is used to filter contacts on both name and number.
- */
-public class RecipientsAdapter extends ResourceCursorAdapter {
-
-    public static final int CONTACT_ID_INDEX = 1;
-    public static final int TYPE_INDEX       = 2;
-    public static final int NUMBER_INDEX     = 3;
-    public static final int LABEL_INDEX      = 4;
-    public static final int NAME_INDEX       = 5;
-    public static final int NORMALIZED_NUMBER = 6;
-
-    private static final String[] PROJECTION_PHONE = {
-        Phone._ID,                  // 0
-        Phone.CONTACT_ID,           // 1
-        Phone.TYPE,                 // 2
-        Phone.NUMBER,               // 3
-        Phone.LABEL,                // 4
-        Phone.DISPLAY_NAME,         // 5
-        Phone.NORMALIZED_NUMBER,    // 6
-    };
-
-    private static final String SORT_ORDER = Contacts.TIMES_CONTACTED + " DESC,"
-            + Contacts.DISPLAY_NAME + "," + Phone.TYPE;
-
-    private final Context mContext;
-    private final ContentResolver mContentResolver;
-    private final String mDefaultCountryIso;
-
-    public RecipientsAdapter(Context context) {
-        // Note that the RecipientsAdapter doesn't support auto-requeries. If we
-        // want to respond to changes in the contacts we're displaying in the drop-down,
-        // code using this adapter would have to add a line such as:
-        //   mRecipientsAdapter.setOnDataSetChangedListener(mDataSetChangedListener);
-        // See ComposeMessageActivity for an example.
-        super(context, R.layout.recipient_filter_item, null, false /* no auto-requery */);
-        mContext = context;
-        mContentResolver = context.getContentResolver();
-        mDefaultCountryIso = MmsApp.getApplication().getCurrentCountryIso();
-    }
-
-    @Override
-    public final CharSequence convertToString(Cursor cursor) {
-        String number = cursor.getString(RecipientsAdapter.NUMBER_INDEX);
-        if (number == null) {
-            return "";
-        }
-        number = number.trim();
-
-        String name = cursor.getString(RecipientsAdapter.NAME_INDEX);
-        int type = cursor.getInt(RecipientsAdapter.TYPE_INDEX);
-
-        String label = cursor.getString(RecipientsAdapter.LABEL_INDEX);
-        CharSequence displayLabel = Phone.getDisplayLabel(mContext, type, label);
-
-        if (name == null) {
-            name = "";
-        } else {
-            // Names with commas are the bane of the recipient editor's existence.
-            // We've worked around them by using spans, but there are edge cases
-            // where the spans get deleted. Furthermore, having commas in names
-            // can be confusing to the user since commas are used as separators
-            // between recipients. The best solution is to simply remove commas
-            // from names.
-            name = name.replace(", ", " ")
-                       .replace(",", " ");  // Make sure we leave a space between parts of names.
-        }
-
-        String nameAndNumber = Contact.formatNameAndNumber( name, number,
-                cursor.getString(NORMALIZED_NUMBER));
-
-        SpannableString out = new SpannableString(nameAndNumber);
-        int len = out.length();
-
-        if (!TextUtils.isEmpty(name)) {
-            out.setSpan(new Annotation("name", name), 0, len,
-                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-        } else {
-            out.setSpan(new Annotation("name", number), 0, len,
-                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-        }
-
-        String person_id = cursor.getString(RecipientsAdapter.CONTACT_ID_INDEX);
-        out.setSpan(new Annotation("person_id", person_id), 0, len,
-                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-        out.setSpan(new Annotation("label", displayLabel.toString()), 0, len,
-                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-        out.setSpan(new Annotation("number", number), 0, len,
-                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-
-        return out;
-    }
-
-    @Override
-    public final void bindView(View view, Context context, Cursor cursor) {
-        TextView name = (TextView) view.findViewById(R.id.name);
-        name.setText(cursor.getString(NAME_INDEX));
-
-        TextView label = (TextView) view.findViewById(R.id.label);
-        int type = cursor.getInt(TYPE_INDEX);
-        CharSequence labelText = Phone.getDisplayLabel(mContext, type,
-                cursor.getString(LABEL_INDEX));
-        // When there's no label, getDisplayLabel() returns a CharSequence of length==1 containing
-        // a unicode non-breaking space. Need to check for that and consider that as "no label".
-        if (labelText.length() == 0 ||
-                (labelText.length() == 1 && labelText.charAt(0) == '\u00A0')) {
-            label.setVisibility(View.GONE);
-        } else {
-            label.setText(labelText);
-            label.setVisibility(View.VISIBLE);
-        }
-
-        TextView number = (TextView) view.findViewById(R.id.number);
-        number.setText(
-                PhoneNumberUtils.formatNumber(cursor.getString(NUMBER_INDEX),
-                        cursor.getString(NORMALIZED_NUMBER), mDefaultCountryIso));
-    }
-
-    @Override
-    public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
-        String phone = "";
-        String cons = null;
-
-        if (constraint != null) {
-            cons = constraint.toString();
-
-            if (usefulAsDigits(cons)) {
-                phone = PhoneNumberUtils.convertKeypadLettersToDigits(cons);
-                if (phone.equals(cons)) {
-                    phone = "";
-                } else {
-                    phone = phone.trim();
-                }
-            }
-        }
-
-        Uri uri = Phone.CONTENT_FILTER_URI.buildUpon()
-                .appendPath(cons)
-                .appendQueryParameter(DataUsageFeedback.USAGE_TYPE,
-                        DataUsageFeedback.USAGE_TYPE_SHORT_TEXT)
-                .build();
-        /*
-         * if we decide to filter based on phone types use a selection
-         * like this.
-        String selection = String.format("%s=%s OR %s=%s OR %s=%s",
-                Phone.TYPE,
-                Phone.TYPE_MOBILE,
-                Phone.TYPE,
-                Phone.TYPE_WORK_MOBILE,
-                Phone.TYPE,
-                Phone.TYPE_MMS);
-         */
-        Cursor phoneCursor =
-            mContentResolver.query(uri,
-                    PROJECTION_PHONE,
-                    null, //selection,
-                    null,
-                    null);
-
-        if (phone.length() > 0) {
-            Object[] result = new Object[7];
-            result[0] = Integer.valueOf(-1);                    // ID
-            result[1] = Long.valueOf(-1);                       // CONTACT_ID
-            result[2] = Integer.valueOf(Phone.TYPE_CUSTOM);     // TYPE
-            result[3] = phone;                                  // NUMBER
-
-            /*
-             * The "\u00A0" keeps Phone.getDisplayLabel() from deciding
-             * to display the default label ("Home") next to the transformation
-             * of the letters into numbers.
-             */
-            result[4] = "\u00A0";                               // LABEL
-            result[5] = cons;                                   // NAME
-            result[6] = phone;                                  // NORMALIZED_NUMBER
-
-            MatrixCursor translated = new MatrixCursor(PROJECTION_PHONE, 1);
-            translated.addRow(result);
-            return new MergeCursor(new Cursor[] { translated, phoneCursor });
-        } else {
-            return phoneCursor;
-        }
-    }
-
-    /**
-     * Returns true if all the characters are meaningful as digits
-     * in a phone number -- letters, digits, and a few punctuation marks.
-     */
-    private boolean usefulAsDigits(CharSequence cons) {
-        int len = cons.length();
-
-        for (int i = 0; i < len; i++) {
-            char c = cons.charAt(i);
-
-            if ((c >= '0') && (c <= '9')) {
-                continue;
-            }
-            if ((c == ' ') || (c == '-') || (c == '(') || (c == ')') || (c == '.') || (c == '+')
-                    || (c == '#') || (c == '*')) {
-                continue;
-            }
-            if ((c >= 'A') && (c <= 'Z')) {
-                continue;
-            }
-            if ((c >= 'a') && (c <= 'z')) {
-                continue;
-            }
-
-            return false;
-        }
-
-        return true;
-    }
-}