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