RecipientsAdapterpublic 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 void | bindView(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.CharSequence | convertToString(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.Cursor | runQueryOnBackgroundThread(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 boolean | usefulAsDigits(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;
|
|