RecipientsAdapter.java revision 3e54d384bed81d27dbe15a2a69344d5e64a1c018
172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/* 272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2008 Esmertec AG. 372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * you may not use this file except in compliance with the License. 772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * You may obtain a copy of the License at 872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 1072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 1172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * See the License for the specific language governing permissions and 1572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * limitations under the License. 1672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 1772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 1872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpackage com.android.mms.ui; 1972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 204759133e3c935e751815bf4f997d029caa64d889Bai Taoimport com.android.mms.MmsApp; 2172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.R; 2220b79e068c8aebff46f24fd3803cf7697df4eac4Ficus Kirkpatrickimport com.android.mms.data.Contact; 2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.ContentResolver; 2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Context; 2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.Cursor; 27c6932610f10140be0781946c868624ef13cdccadJeff Brownimport android.database.MatrixCursor; 2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.MergeCursor; 29afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikovimport android.net.Uri; 30afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikovimport android.provider.ContactsContract.Contacts; 31afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone; 325e1c97e1f90901c48bfde61a1ddb5fbc7e0a0c39Tom Taylorimport android.provider.ContactsContract.DataUsageFeedback; 3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.telephony.PhoneNumberUtils; 3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.Annotation; 3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.Spannable; 3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.SpannableString; 3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.TextUtils; 3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.View; 3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.ResourceCursorAdapter; 4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.TextView; 4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/** 4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * This adapter is used to filter contacts on both name and number. 4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class RecipientsAdapter extends ResourceCursorAdapter { 4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 47afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov public static final int CONTACT_ID_INDEX = 1; 48afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov public static final int TYPE_INDEX = 2; 49afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov public static final int NUMBER_INDEX = 3; 50afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov public static final int LABEL_INDEX = 4; 51afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov public static final int NAME_INDEX = 5; 524759133e3c935e751815bf4f997d029caa64d889Bai Tao public static final int NORMALIZED_NUMBER = 6; 5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final String[] PROJECTION_PHONE = { 559caba7e7dd6de58e9aac69cd3eb04ee518e39b64Dmitri Plotnikov Phone._ID, // 0 569caba7e7dd6de58e9aac69cd3eb04ee518e39b64Dmitri Plotnikov Phone.CONTACT_ID, // 1 57afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov Phone.TYPE, // 2 58afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov Phone.NUMBER, // 3 59afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov Phone.LABEL, // 4 609caba7e7dd6de58e9aac69cd3eb04ee518e39b64Dmitri Plotnikov Phone.DISPLAY_NAME, // 5 614759133e3c935e751815bf4f997d029caa64d889Bai Tao Phone.NORMALIZED_NUMBER, // 6 6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 64afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov private static final String SORT_ORDER = Contacts.TIMES_CONTACTED + " DESC," 65afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov + Contacts.DISPLAY_NAME + "," + Phone.TYPE; 6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private final Context mContext; 6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private final ContentResolver mContentResolver; 694759133e3c935e751815bf4f997d029caa64d889Bai Tao private final String mDefaultCountryIso; 7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public RecipientsAdapter(Context context) { 72f1ab045ff991e1ec3e4161d213627b8629971c0eTom Taylor // Note that the RecipientsAdapter doesn't support auto-requeries. If we 73f1ab045ff991e1ec3e4161d213627b8629971c0eTom Taylor // want to respond to changes in the contacts we're displaying in the drop-down, 74f1ab045ff991e1ec3e4161d213627b8629971c0eTom Taylor // code using this adapter would have to add a line such as: 75f1ab045ff991e1ec3e4161d213627b8629971c0eTom Taylor // mRecipientsAdapter.setOnDataSetChangedListener(mDataSetChangedListener); 76f1ab045ff991e1ec3e4161d213627b8629971c0eTom Taylor // See ComposeMessageActivity for an example. 77f1ab045ff991e1ec3e4161d213627b8629971c0eTom Taylor super(context, R.layout.recipient_filter_item, null, false /* no auto-requery */); 7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mContext = context; 7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mContentResolver = context.getContentResolver(); 804759133e3c935e751815bf4f997d029caa64d889Bai Tao mDefaultCountryIso = MmsApp.getApplication().getCurrentCountryIso(); 8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project @Override 8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public final CharSequence convertToString(Cursor cursor) { 859ec8e53a995088b9413280868d77a801d1e4b8ecTom Taylor String number = cursor.getString(RecipientsAdapter.NUMBER_INDEX); 869ec8e53a995088b9413280868d77a801d1e4b8ecTom Taylor if (number == null) { 879ec8e53a995088b9413280868d77a801d1e4b8ecTom Taylor return ""; 889ec8e53a995088b9413280868d77a801d1e4b8ecTom Taylor } 899ec8e53a995088b9413280868d77a801d1e4b8ecTom Taylor number = number.trim(); 909ec8e53a995088b9413280868d77a801d1e4b8ecTom Taylor 9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String name = cursor.getString(RecipientsAdapter.NAME_INDEX); 9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int type = cursor.getInt(RecipientsAdapter.TYPE_INDEX); 9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String label = cursor.getString(RecipientsAdapter.LABEL_INDEX); 95afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov CharSequence displayLabel = Phone.getDisplayLabel(mContext, type, label); 9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (name == null) { 9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project name = ""; 99bdf9b796ffd86c9f4cbeff413f957a88a492f43fTom Taylor } else { 100bdf9b796ffd86c9f4cbeff413f957a88a492f43fTom Taylor // Names with commas are the bane of the recipient editor's existence. 101bdf9b796ffd86c9f4cbeff413f957a88a492f43fTom Taylor // We've worked around them by using spans, but there are edge cases 102bdf9b796ffd86c9f4cbeff413f957a88a492f43fTom Taylor // where the spans get deleted. Furthermore, having commas in names 103bdf9b796ffd86c9f4cbeff413f957a88a492f43fTom Taylor // can be confusing to the user since commas are used as separators 104bdf9b796ffd86c9f4cbeff413f957a88a492f43fTom Taylor // between recipients. The best solution is to simply remove commas 105bdf9b796ffd86c9f4cbeff413f957a88a492f43fTom Taylor // from names. 1061224b6560c48e146ee304f9c807296f6c22cdefbTom Taylor name = name.replace(", ", " ") 1071224b6560c48e146ee304f9c807296f6c22cdefbTom Taylor .replace(",", " "); // Make sure we leave a space between parts of names. 108bdf9b796ffd86c9f4cbeff413f957a88a492f43fTom Taylor } 109afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov 1103e54d384bed81d27dbe15a2a69344d5e64a1c018Tom Taylor String nameAndNumber = Contact.formatNameAndNumber( name, number, 1113e54d384bed81d27dbe15a2a69344d5e64a1c018Tom Taylor cursor.getString(NORMALIZED_NUMBER)); 11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project SpannableString out = new SpannableString(nameAndNumber); 11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int len = out.length(); 11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (!TextUtils.isEmpty(name)) { 11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project out.setSpan(new Annotation("name", name), 0, len, 11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project out.setSpan(new Annotation("name", number), 0, len, 12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 124afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov String person_id = cursor.getString(RecipientsAdapter.CONTACT_ID_INDEX); 12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project out.setSpan(new Annotation("person_id", person_id), 0, len, 12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project out.setSpan(new Annotation("label", displayLabel.toString()), 0, len, 12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project out.setSpan(new Annotation("number", number), 0, len, 13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return out; 13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project @Override 13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public final void bindView(View view, Context context, Cursor cursor) { 13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project TextView name = (TextView) view.findViewById(R.id.name); 13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project name.setText(cursor.getString(NAME_INDEX)); 13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project TextView label = (TextView) view.findViewById(R.id.label); 14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int type = cursor.getInt(TYPE_INDEX); 14217daf81a930e664d254cabcef00981a4c9a1f785Tom Taylor CharSequence labelText = Phone.getDisplayLabel(mContext, type, 14317daf81a930e664d254cabcef00981a4c9a1f785Tom Taylor cursor.getString(LABEL_INDEX)); 14417daf81a930e664d254cabcef00981a4c9a1f785Tom Taylor // When there's no label, getDisplayLabel() returns a CharSequence of length==1 containing 14517daf81a930e664d254cabcef00981a4c9a1f785Tom Taylor // a unicode non-breaking space. Need to check for that and consider that as "no label". 14617daf81a930e664d254cabcef00981a4c9a1f785Tom Taylor if (labelText.length() == 0 || 14717daf81a930e664d254cabcef00981a4c9a1f785Tom Taylor (labelText.length() == 1 && labelText.charAt(0) == '\u00A0')) { 14817daf81a930e664d254cabcef00981a4c9a1f785Tom Taylor label.setVisibility(View.GONE); 14917daf81a930e664d254cabcef00981a4c9a1f785Tom Taylor } else { 15017daf81a930e664d254cabcef00981a4c9a1f785Tom Taylor label.setText(labelText); 15117daf81a930e664d254cabcef00981a4c9a1f785Tom Taylor label.setVisibility(View.VISIBLE); 15217daf81a930e664d254cabcef00981a4c9a1f785Tom Taylor } 15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project TextView number = (TextView) view.findViewById(R.id.number); 1554759133e3c935e751815bf4f997d029caa64d889Bai Tao number.setText( 1564759133e3c935e751815bf4f997d029caa64d889Bai Tao PhoneNumberUtils.formatNumber(cursor.getString(NUMBER_INDEX), 1574759133e3c935e751815bf4f997d029caa64d889Bai Tao cursor.getString(NORMALIZED_NUMBER), mDefaultCountryIso)); 15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project @Override 16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public Cursor runQueryOnBackgroundThread(CharSequence constraint) { 16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String phone = ""; 16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String cons = null; 16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (constraint != null) { 16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project cons = constraint.toString(); 16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (usefulAsDigits(cons)) { 16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project phone = PhoneNumberUtils.convertKeypadLettersToDigits(cons); 17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (phone.equals(cons)) { 17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project phone = ""; 17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project phone = phone.trim(); 17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 1785e1c97e1f90901c48bfde61a1ddb5fbc7e0a0c39Tom Taylor Uri uri = Phone.CONTENT_FILTER_URI.buildUpon() 1792b70bdd3ff232c972ff6275afd8aeef2cda403d3Daisuke Miyakawa .appendPath(cons) 1805e1c97e1f90901c48bfde61a1ddb5fbc7e0a0c39Tom Taylor .appendQueryParameter(DataUsageFeedback.USAGE_TYPE, 1815e1c97e1f90901c48bfde61a1ddb5fbc7e0a0c39Tom Taylor DataUsageFeedback.USAGE_TYPE_SHORT_TEXT) 1825e1c97e1f90901c48bfde61a1ddb5fbc7e0a0c39Tom Taylor .build(); 1839cb9fd6e387ed9f7278d47bc8743c79b18bbeb5bMark Wagner /* 1849cb9fd6e387ed9f7278d47bc8743c79b18bbeb5bMark Wagner * if we decide to filter based on phone types use a selection 1859cb9fd6e387ed9f7278d47bc8743c79b18bbeb5bMark Wagner * like this. 186f8d043174b15c48438c441635f29824bb525951bTom Taylor String selection = String.format("%s=%s OR %s=%s OR %s=%s", 187f8d043174b15c48438c441635f29824bb525951bTom Taylor Phone.TYPE, 188f8d043174b15c48438c441635f29824bb525951bTom Taylor Phone.TYPE_MOBILE, 189f8d043174b15c48438c441635f29824bb525951bTom Taylor Phone.TYPE, 190f8d043174b15c48438c441635f29824bb525951bTom Taylor Phone.TYPE_WORK_MOBILE, 191f8d043174b15c48438c441635f29824bb525951bTom Taylor Phone.TYPE, 192f8d043174b15c48438c441635f29824bb525951bTom Taylor Phone.TYPE_MMS); 1939cb9fd6e387ed9f7278d47bc8743c79b18bbeb5bMark Wagner */ 194afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov Cursor phoneCursor = 1959efd5d4913cb4c4da7802cb1be922b32223141e6Wei Huang mContentResolver.query(uri, 1969caba7e7dd6de58e9aac69cd3eb04ee518e39b64Dmitri Plotnikov PROJECTION_PHONE, 1979cb9fd6e387ed9f7278d47bc8743c79b18bbeb5bMark Wagner null, //selection, 1989efd5d4913cb4c4da7802cb1be922b32223141e6Wei Huang null, 1995e1c97e1f90901c48bfde61a1ddb5fbc7e0a0c39Tom Taylor null); 20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (phone.length() > 0) { 202c6932610f10140be0781946c868624ef13cdccadJeff Brown Object[] result = new Object[7]; 203c6932610f10140be0781946c868624ef13cdccadJeff Brown result[0] = Integer.valueOf(-1); // ID 204c6932610f10140be0781946c868624ef13cdccadJeff Brown result[1] = Long.valueOf(-1); // CONTACT_ID 205c6932610f10140be0781946c868624ef13cdccadJeff Brown result[2] = Integer.valueOf(Phone.TYPE_CUSTOM); // TYPE 206c6932610f10140be0781946c868624ef13cdccadJeff Brown result[3] = phone; // NUMBER 20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project /* 209afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov * The "\u00A0" keeps Phone.getDisplayLabel() from deciding 21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * to display the default label ("Home") next to the transformation 21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * of the letters into numbers. 21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 213c6932610f10140be0781946c868624ef13cdccadJeff Brown result[4] = "\u00A0"; // LABEL 214c6932610f10140be0781946c868624ef13cdccadJeff Brown result[5] = cons; // NAME 215c6932610f10140be0781946c868624ef13cdccadJeff Brown result[6] = phone; // NORMALIZED_NUMBER 21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 217c6932610f10140be0781946c868624ef13cdccadJeff Brown MatrixCursor translated = new MatrixCursor(PROJECTION_PHONE, 1); 218c6932610f10140be0781946c868624ef13cdccadJeff Brown translated.addRow(result); 21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return new MergeCursor(new Cursor[] { translated, phoneCursor }); 22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return phoneCursor; 22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 22572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project /** 22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Returns true if all the characters are meaningful as digits 22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * in a phone number -- letters, digits, and a few punctuation marks. 22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private boolean usefulAsDigits(CharSequence cons) { 23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int len = cons.length(); 23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project for (int i = 0; i < len; i++) { 23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project char c = cons.charAt(i); 23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 235afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov if ((c >= '0') && (c <= '9')) { 23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project continue; 23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 238afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov if ((c == ' ') || (c == '-') || (c == '(') || (c == ')') || (c == '.') || (c == '+') 239afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov || (c == '#') || (c == '*')) { 24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project continue; 24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 242afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov if ((c >= 'A') && (c <= 'Z')) { 24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project continue; 24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 245afab47f1ea6db50df7f045131fed5dba9cead6b0Dmitri Plotnikov if ((c >= 'a') && (c <= 'z')) { 24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project continue; 24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return false; 25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return true; 25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project} 255