FileDocCategorySizeDatePackage
RecipientsAdapter.javaAPI DocAndroid 1.5 API7881Wed May 06 22:42:46 BST 2009com.android.mms.ui

RecipientsAdapter

public class RecipientsAdapter extends android.widget.ResourceCursorAdapter
This adapter is used to filter contacts on both name and number.

Fields Summary
public static final int
PERSON_ID_INDEX
public static final int
TYPE_INDEX
public static final int
NUMBER_INDEX
public static final int
LABEL_INDEX
public static final int
NAME_INDEX
private static final String[]
PROJECTION_PHONE
private static final String
SORT_ORDER
private final android.content.Context
mContext
private final android.content.ContentResolver
mContentResolver
Constructors Summary
public RecipientsAdapter(android.content.Context context)


       
        super(context, R.layout.recipient_filter_item, null);
        mContext = context;
        mContentResolver = context.getContentResolver();
    
Methods Summary
public final voidbindView(android.view.View view, android.content.Context context, android.database.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);
        label.setText(Phones.getDisplayLabel(mContext, type, cursor.getString(LABEL_INDEX)));

        TextView number = (TextView) view.findViewById(R.id.number);
        number.setText("(" + cursor.getString(NUMBER_INDEX) + ")");
    
public final java.lang.CharSequenceconvertToString(android.database.Cursor cursor)

        String name = cursor.getString(RecipientsAdapter.NAME_INDEX);
        int type = cursor.getInt(RecipientsAdapter.TYPE_INDEX);
        String number = cursor.getString(RecipientsAdapter.NUMBER_INDEX).trim();

        String label = cursor.getString(RecipientsAdapter.LABEL_INDEX);
        CharSequence displayLabel = Phones.getDisplayLabel(mContext, type, label);

        if (number.length() == 0) {
            return number;
        }

        if (name == null) {
            name = "";
        }
        
        String nameAndNumber = Recipient.buildNameAndNumber(name, 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.PERSON_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;
    
public android.database.CursorrunQueryOnBackgroundThread(java.lang.CharSequence constraint)

        String wherePhone = null;
        String whereEmail = null;
        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();
                }
            }

            String filter = DatabaseUtils.sqlEscapeString(cons + '%");
            String filterLastName = DatabaseUtils.sqlEscapeString("% " + cons + '%");

            StringBuilder s = new StringBuilder();
            s.append("((name LIKE ");
            s.append(filter);
            s.append(") OR (name LIKE ");
            s.append(filterLastName);
            s.append(") OR (REPLACE(REPLACE(REPLACE(REPLACE(number, ' ', ''), '(', ''), ')', ''), '-', '') LIKE ");
            s.append(filter);
            s.append(")) AND type = ");
            s.append(Phones.TYPE_MOBILE);
            wherePhone = s.toString();
        }

        Cursor phoneCursor = SqliteWrapper.query(mContext, mContentResolver,
                Phones.CONTENT_URI, PROJECTION_PHONE, wherePhone, null, SORT_ORDER);

        if (phone.length() > 0) {
            ArrayList result = new ArrayList();
            result.add(Integer.valueOf(-1));                    // ID
            result.add(Long.valueOf(-1));                       // PERSON_ID
            result.add(Integer.valueOf(Phones.TYPE_CUSTOM));    // TYPE
            result.add(phone);                                  // NUMBER

            /*
             * The "\u00A0" keeps Phones.getDisplayLabel() from deciding
             * to display the default label ("Home") next to the transformation
             * of the letters into numbers.
             */
            result.add("\u00A0");                               // LABEL
            result.add(cons);                                   // NAME

            ArrayList<ArrayList> wrap = new ArrayList<ArrayList>();
            wrap.add(result);

            ArrayListCursor translated = new ArrayListCursor(PROJECTION_PHONE, wrap);

            return new MergeCursor(new Cursor[] { translated, phoneCursor });
        } else {
            return phoneCursor;
        }
    
private booleanusefulAsDigits(java.lang.CharSequence cons)
Returns true if all the characters are meaningful as digits in a phone number -- letters, digits, and a few punctuation marks.

        int len = cons.length();

        for (int i = 0; i < len; i++) {
            char c = cons.charAt(i);

            if ((c == ' ") || (c == '-") || (c == '(") || (c == ')") || (c == '.")) {
                continue;
            }
            if ((c >= 'A") && (c <= 'Z")) {
                continue;
            }
            if ((c >= 'a") && (c <= 'z")) {
                continue;
            }
            if ((c >= '0") && (c <= '9")) {
                continue;
            }

            return false;
        }

        return true;