1863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton/*
2863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * Copyright (C) 2009 The Android Open Source Project
3863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton *
4863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * Licensed under the Apache License, Version 2.0 (the "License");
5863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * you may not use this file except in compliance with the License.
6863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * You may obtain a copy of the License at
7863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton *
8863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton *      http://www.apache.org/licenses/LICENSE-2.0
9863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton *
10863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * Unless required by applicable law or agreed to in writing, software
11863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * distributed under the License is distributed on an "AS IS" BASIS,
12863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * See the License for the specific language governing permissions and
14863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * limitations under the License.
15863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton */
16863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
17863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonpackage com.android.loaderapp.util;
18863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
19863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
20863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
21863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.content.ContentResolver;
22863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.content.ContentUris;
23863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.content.ContentValues;
24863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.content.Context;
25863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.content.Intent;
26863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.database.Cursor;
27863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.graphics.Bitmap;
28863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.graphics.BitmapFactory;
29863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.net.Uri;
30863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.Contacts;
31863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.Data;
32863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.RawContacts;
33863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.Email;
34863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.Im;
35863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.Organization;
36863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.Phone;
37863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.Photo;
38863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
39863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.telephony.PhoneNumberUtils;
40863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.text.TextUtils;
41863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
42863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport java.util.ArrayList;
43863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
44863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonpublic class ContactsUtils {
45863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    private static final String TAG = "ContactsUtils";
46863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
47863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Build the display title for the {@link Data#CONTENT_URI} entry in the
48863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * provided cursor, assuming the given mimeType.
49863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
50863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static final CharSequence getDisplayLabel(Context context,
51863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            String mimeType, Cursor cursor) {
52863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        // Try finding the type and label for this mimetype
53863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        int colType;
54863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        int colLabel;
55863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
56863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)
57863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                || Constants.MIME_SMS_ADDRESS.equals(mimeType)) {
58863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            // Reset to phone mimetype so we generate a label for SMS case
59863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            mimeType = Phone.CONTENT_ITEM_TYPE;
60863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            colType = cursor.getColumnIndex(Phone.TYPE);
61863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            colLabel = cursor.getColumnIndex(Phone.LABEL);
62863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else if (Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
63863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            colType = cursor.getColumnIndex(Email.TYPE);
64863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            colLabel = cursor.getColumnIndex(Email.LABEL);
65863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else if (StructuredPostal.CONTENT_ITEM_TYPE.equals(mimeType)) {
66863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            colType = cursor.getColumnIndex(StructuredPostal.TYPE);
67863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            colLabel = cursor.getColumnIndex(StructuredPostal.LABEL);
68863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else if (Organization.CONTENT_ITEM_TYPE.equals(mimeType)) {
69863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            colType = cursor.getColumnIndex(Organization.TYPE);
70863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            colLabel = cursor.getColumnIndex(Organization.LABEL);
71863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else {
72863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return null;
73863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
74863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
75863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        final int type = cursor.getInt(colType);
76863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        final CharSequence label = cursor.getString(colLabel);
77863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
78863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return getDisplayLabel(context, mimeType, type, label);
79863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
80863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
81863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static final CharSequence getDisplayLabel(Context context, String mimetype, int type,
82863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            CharSequence label) {
83863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        CharSequence display = "";
84863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        final int customType;
85863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        final int defaultType;
86863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        final int arrayResId;
87863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
88863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (Phone.CONTENT_ITEM_TYPE.equals(mimetype)) {
89863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            defaultType = Phone.TYPE_HOME;
90863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            customType = Phone.TYPE_CUSTOM;
91863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            arrayResId = com.android.internal.R.array.phoneTypes;
92863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else if (Email.CONTENT_ITEM_TYPE.equals(mimetype)) {
93863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            defaultType = Email.TYPE_HOME;
94863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            customType = Email.TYPE_CUSTOM;
95863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            arrayResId = com.android.internal.R.array.emailAddressTypes;
96863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else if (StructuredPostal.CONTENT_ITEM_TYPE.equals(mimetype)) {
97863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            defaultType = StructuredPostal.TYPE_HOME;
98863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            customType = StructuredPostal.TYPE_CUSTOM;
99863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            arrayResId = com.android.internal.R.array.postalAddressTypes;
100863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else if (Organization.CONTENT_ITEM_TYPE.equals(mimetype)) {
101863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            defaultType = Organization.TYPE_WORK;
102863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            customType = Organization.TYPE_CUSTOM;
103863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            arrayResId = com.android.internal.R.array.organizationTypes;
104863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else {
105863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            // Can't return display label for given mimetype.
106863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return display;
107863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
108863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
109863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (type != customType) {
110863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            CharSequence[] labels = context.getResources().getTextArray(arrayResId);
111863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            try {
112863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                display = labels[type - 1];
113863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            } catch (ArrayIndexOutOfBoundsException e) {
114863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                display = labels[defaultType - 1];
115863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
116863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else {
117863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (!TextUtils.isEmpty(label)) {
118863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                display = label;
119863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
120863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
121863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return display;
122863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
123863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
124863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
125863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Opens an InputStream for the person's photo and returns the photo as a Bitmap.
126863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * If the person's photo isn't present returns null.
127863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     *
128863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param aggCursor the Cursor pointing to the data record containing the photo.
129863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param bitmapColumnIndex the column index where the photo Uri is stored.
130863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param options the decoding options, can be set to null
131863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @return the photo Bitmap
132863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
133863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static Bitmap loadContactPhoto(Cursor cursor, int bitmapColumnIndex,
134863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            BitmapFactory.Options options) {
135863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (cursor == null) {
136863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return null;
137863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
138863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
139863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        byte[] data = cursor.getBlob(bitmapColumnIndex);
140863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return BitmapFactory.decodeByteArray(data, 0, data.length, options);
141863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
142863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
143863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
144863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Loads a placeholder photo.
145863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     *
146863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param placeholderImageResource the resource to use for the placeholder image
147863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param context the Context
148863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param options the decoding options, can be set to null
149863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @return the placeholder Bitmap.
150863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
151863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static Bitmap loadPlaceholderPhoto(int placeholderImageResource, Context context,
152863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            BitmapFactory.Options options) {
153863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (placeholderImageResource == 0) {
154863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return null;
155863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
156863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return BitmapFactory.decodeResource(context.getResources(),
157863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                placeholderImageResource, options);
158863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
159863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
160863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static Bitmap loadContactPhoto(Context context, long photoId,
161863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            BitmapFactory.Options options) {
162863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        Cursor photoCursor = null;
163863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        Bitmap photoBm = null;
164863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
165863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        try {
166863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            photoCursor = context.getContentResolver().query(
167863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                    ContentUris.withAppendedId(Data.CONTENT_URI, photoId),
168863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                    new String[] { Photo.PHOTO },
169863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                    null, null, null);
170863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
171863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (photoCursor.moveToFirst() && !photoCursor.isNull(0)) {
172863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                byte[] photoData = photoCursor.getBlob(0);
173863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                photoBm = BitmapFactory.decodeByteArray(photoData, 0,
174863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                        photoData.length, options);
175863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
176863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } finally {
177863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (photoCursor != null) {
178863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                photoCursor.close();
179863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
180863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
181863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
182863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return photoBm;
183863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
184863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
185863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    // TODO find a proper place for the canonical version of these
186863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public interface ProviderNames {
187863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        String YAHOO = "Yahoo";
188863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        String GTALK = "GTalk";
189863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        String MSN = "MSN";
190863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        String ICQ = "ICQ";
191863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        String AIM = "AIM";
192863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        String XMPP = "XMPP";
193863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        String JABBER = "JABBER";
194863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        String SKYPE = "SKYPE";
195863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        String QQ = "QQ";
196863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
197863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
198863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
199863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * This looks up the provider name defined in
200863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * ProviderNames from the predefined IM protocol id.
201863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * This is used for interacting with the IM application.
202863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     *
203863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param protocol the protocol ID
204863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @return the provider name the IM app uses for the given protocol, or null if no
205863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * provider is defined for the given protocol
206863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @hide
207863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
208863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static String lookupProviderNameFromId(int protocol) {
209863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        switch (protocol) {
210863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            case Im.PROTOCOL_GOOGLE_TALK:
211863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                return ProviderNames.GTALK;
212863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            case Im.PROTOCOL_AIM:
213863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                return ProviderNames.AIM;
214863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            case Im.PROTOCOL_MSN:
215863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                return ProviderNames.MSN;
216863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            case Im.PROTOCOL_YAHOO:
217863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                return ProviderNames.YAHOO;
218863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            case Im.PROTOCOL_ICQ:
219863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                return ProviderNames.ICQ;
220863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            case Im.PROTOCOL_JABBER:
221863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                return ProviderNames.JABBER;
222863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            case Im.PROTOCOL_SKYPE:
223863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                return ProviderNames.SKYPE;
224863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            case Im.PROTOCOL_QQ:
225863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                return ProviderNames.QQ;
226863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
227863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return null;
228863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
229863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
230863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
231863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Build {@link Intent} to launch an action for the given {@link Im} or
232863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * {@link Email} row. Returns null when missing protocol or data.
233863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
234863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static Intent buildImIntent(ContentValues values) {
235863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        final boolean isEmail = Email.CONTENT_ITEM_TYPE.equals(values.getAsString(Data.MIMETYPE));
236863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
237863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (!isEmail && !isProtocolValid(values)) {
238863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return null;
239863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
240863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
241863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        final int protocol = isEmail ? Im.PROTOCOL_GOOGLE_TALK : values.getAsInteger(Im.PROTOCOL);
242863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
243863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        String host = values.getAsString(Im.CUSTOM_PROTOCOL);
244863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        String data = values.getAsString(isEmail ? Email.DATA : Im.DATA);
245863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (protocol != Im.PROTOCOL_CUSTOM) {
246863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            // Try bringing in a well-known host for specific protocols
247863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            host = ContactsUtils.lookupProviderNameFromId(protocol);
248863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
249863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
250863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (!TextUtils.isEmpty(host) && !TextUtils.isEmpty(data)) {
251863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            final String authority = host.toLowerCase();
252863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            final Uri imUri = new Uri.Builder().scheme(Constants.SCHEME_IMTO).authority(
253863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                    authority).appendPath(data).build();
254863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return new Intent(Intent.ACTION_SENDTO, imUri);
255863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else {
256863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return null;
257863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
258863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
259863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
260863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    private static boolean isProtocolValid(ContentValues values) {
261863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        String protocolString = values.getAsString(Im.PROTOCOL);
262863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (protocolString == null) {
263863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return false;
264863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
265863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        try {
266863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            Integer.valueOf(protocolString);
267863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } catch (NumberFormatException e) {
268863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return false;
269863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
270863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return true;
271863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
272863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
273863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static long queryForContactId(ContentResolver cr, long rawContactId) {
274863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        Cursor contactIdCursor = null;
275863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        long contactId = -1;
276863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        try {
277863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            contactIdCursor = cr.query(RawContacts.CONTENT_URI,
278863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                    new String[] {RawContacts.CONTACT_ID},
279863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                    RawContacts._ID + "=" + rawContactId, null, null);
280863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (contactIdCursor != null && contactIdCursor.moveToFirst()) {
281863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                contactId = contactIdCursor.getLong(0);
282863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
283863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } finally {
284863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (contactIdCursor != null) {
285863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                contactIdCursor.close();
286863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
287863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
288863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return contactId;
289863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
290863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
291863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static String querySuperPrimaryPhone(ContentResolver cr, long contactId) {
292863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        Cursor c = null;
293863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        String phone = null;
294863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        try {
295863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            Uri baseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
296863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            Uri dataUri = Uri.withAppendedPath(baseUri, Contacts.Data.CONTENT_DIRECTORY);
297863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
298863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            c = cr.query(dataUri,
299863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                    new String[] {Phone.NUMBER},
300863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                    Data.MIMETYPE + "=" + Phone.MIMETYPE +
301863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                        " AND " + Data.IS_SUPER_PRIMARY + "=1",
302863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                    null, null);
303863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (c != null && c.moveToFirst()) {
304863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                // Just return the first one.
305863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                phone = c.getString(0);
306863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
307863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } finally {
308863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (c != null) {
309863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                c.close();
310863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
311863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
312863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return phone;
313863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
314863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
315863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static long queryForRawContactId(ContentResolver cr, long contactId) {
316863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        Cursor rawContactIdCursor = null;
317863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        long rawContactId = -1;
318863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        try {
319863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            rawContactIdCursor = cr.query(RawContacts.CONTENT_URI,
320863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                    new String[] {RawContacts._ID},
321863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                    RawContacts.CONTACT_ID + "=" + contactId, null, null);
322863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (rawContactIdCursor != null && rawContactIdCursor.moveToFirst()) {
323863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                // Just return the first one.
324863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                rawContactId = rawContactIdCursor.getLong(0);
325863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
326863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } finally {
327863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (rawContactIdCursor != null) {
328863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                rawContactIdCursor.close();
329863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
330863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
331863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return rawContactId;
332863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
333863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
334863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static ArrayList<Long> queryForAllRawContactIds(ContentResolver cr, long contactId) {
335863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        Cursor rawContactIdCursor = null;
336863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        ArrayList<Long> rawContactIds = new ArrayList<Long>();
337863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        try {
338863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            rawContactIdCursor = cr.query(RawContacts.CONTENT_URI,
339863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                    new String[] {RawContacts._ID},
340863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                    RawContacts.CONTACT_ID + "=" + contactId, null, null);
341863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (rawContactIdCursor != null) {
342863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                while (rawContactIdCursor.moveToNext()) {
343863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                    rawContactIds.add(rawContactIdCursor.getLong(0));
344863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                }
345863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
346863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } finally {
347863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (rawContactIdCursor != null) {
348863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                rawContactIdCursor.close();
349863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
350863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
351863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return rawContactIds;
352863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
353863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
354863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
355863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
356863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Kick off an intent to initiate a call.
357863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     *
358863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param phoneNumber must not be null.
359863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @throws NullPointerException when the given argument is null.
360863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
361863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static void initiateCall(Context context, CharSequence phoneNumber) {
362863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
363863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                Uri.fromParts("tel", phoneNumber.toString(), null));
364863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        context.startActivity(intent);
365863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
366863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
367863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
368863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Kick off an intent to initiate an Sms/Mms message.
369863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     *
370863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @param phoneNumber must not be null.
371863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * @throws NullPointerException when the given argument is null.
372863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
373863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static void initiateSms(Context context, CharSequence phoneNumber) {
374863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        Intent intent = new Intent(Intent.ACTION_SENDTO,
375863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                Uri.fromParts("sms", phoneNumber.toString(), null));
376863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        context.startActivity(intent);
377863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
378863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
379863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
380863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Test if the given {@link CharSequence} contains any graphic characters,
381863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * first checking {@link TextUtils#isEmpty(CharSequence)} to handle null.
382863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
383863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static boolean isGraphic(CharSequence str) {
384863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return !TextUtils.isEmpty(str) && TextUtils.isGraphic(str);
385863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
386863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
387863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
388863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Returns true if two objects are considered equal.  Two null references are equal here.
389863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
390863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static boolean areObjectsEqual(Object a, Object b) {
391863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return a == b || (a != null && a.equals(b));
392863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
393863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
394863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
395863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Returns true if two data with mimetypes which represent values in contact entries are
396863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * considered equal.
397863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
398863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static final boolean areDataEqual(Context context, CharSequence mimetype1,
399863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            CharSequence data1, CharSequence mimetype2, CharSequence data2) {
400863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (TextUtils.equals(Phone.CONTENT_ITEM_TYPE, mimetype1)
401863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                && TextUtils.equals(Phone.CONTENT_ITEM_TYPE, mimetype2)) {
402863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (data1 == data2) {
403863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                return true;
404863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
405863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (data1 == null || data2 == null) {
406863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                return false;
407863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
408863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return PhoneNumberUtils.compare(context, data1.toString(), data2.toString());
409863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else {
410863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (mimetype1 == mimetype2 && data1 == data2) {
411863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                return true;
412863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
413863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return TextUtils.equals(mimetype1, mimetype2) && TextUtils.equals(data1, data2);
414863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
415863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
416863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
417863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
418863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Returns true if two {@link Intent}s are both null, or have the same action.
419863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
420863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static final boolean areIntentActionEqual(Intent a, Intent b) {
421863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (a == b) {
422863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return true;
423863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
424863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (a == null || b == null) {
425863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return false;
426863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
427863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return TextUtils.equals(a.getAction(), b.getAction());
428863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
429863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton}
430