1ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng/*
2ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng * Copyright (C) 2012 The Android Open Source Project
3ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng *
4ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng * Licensed under the Apache License, Version 2.0 (the "License");
5ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng * you may not use this file except in compliance with the License.
6ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng * You may obtain a copy of the License at
7ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng *
8ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng *      http://www.apache.org/licenses/LICENSE-2.0
9ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng *
10ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng * Unless required by applicable law or agreed to in writing, software
11ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng * distributed under the License is distributed on an "AS IS" BASIS,
12ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng * See the License for the specific language governing permissions and
14ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng * limitations under the License.
15ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng */
16ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng
17ddd4e821226395fd977d87b6692f761c90d59139Chiao Chengpackage com.android.contacts.editor;
18ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng
190a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport static android.provider.ContactsContract.CommonDataKinds.GroupMembership;
200a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport static android.provider.ContactsContract.CommonDataKinds.StructuredName;
210a49afa2ad697307cc04ef4cb86570574fa720f2Gary Mai
220a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport static com.android.contacts.util.MaterialColorMapUtils.getDefaultPrimaryAndSecondaryColors;
230a49afa2ad697307cc04ef4cb86570574fa720f2Gary Mai
242d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jangimport android.content.Context;
2531a74ad969b650eb733e536569254ed3978c4f54Walter Jangimport android.content.res.Resources;
2631a74ad969b650eb733e536569254ed3978c4f54Walter Jangimport android.graphics.Bitmap;
2731a74ad969b650eb733e536569254ed3978c4f54Walter Jangimport android.graphics.BitmapFactory;
28f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.graphics.drawable.Drawable;
29fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport android.media.RingtoneManager;
30fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport android.net.Uri;
31fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerottimport android.os.Build;
32f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.provider.ContactsContract.CommonDataKinds.Email;
33f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.provider.ContactsContract.CommonDataKinds.Event;
34f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.provider.ContactsContract.CommonDataKinds.Im;
35f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.provider.ContactsContract.CommonDataKinds.Note;
36f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.provider.ContactsContract.CommonDataKinds.Organization;
37f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.provider.ContactsContract.CommonDataKinds.Phone;
38f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.provider.ContactsContract.CommonDataKinds.Photo;
39f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.provider.ContactsContract.CommonDataKinds.Relation;
40f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.provider.ContactsContract.CommonDataKinds.SipAddress;
41f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
42f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jangimport android.provider.ContactsContract.CommonDataKinds.Website;
433cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerottimport android.support.v4.content.res.ResourcesCompat;
442d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jangimport android.text.TextUtils;
4531a74ad969b650eb733e536569254ed3978c4f54Walter Jangimport android.widget.ImageView;
4631a74ad969b650eb733e536569254ed3978c4f54Walter Jang
470a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport com.android.contacts.ContactPhotoManager;
480a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport com.android.contacts.ContactPhotoManager.DefaultImageProvider;
490a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport com.android.contacts.ContactPhotoManager.DefaultImageRequest;
500a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport com.android.contacts.ContactsUtils;
51ddd4e821226395fd977d87b6692f761c90d59139Chiao Chengimport com.android.contacts.R;
5269c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.ValuesDelta;
5369c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.account.AccountDisplayInfo;
544bd50d69d2b8934dbd4cbd634ad83807d9b02735Marcus Hagerottimport com.android.contacts.model.account.AccountInfo;
550a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport com.android.contacts.model.dataitem.DataKind;
5631a74ad969b650eb733e536569254ed3978c4f54Walter Jangimport com.android.contacts.util.ContactPhotoUtils;
570a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport com.android.contacts.util.MaterialColorMapUtils.MaterialPalette;
5831a74ad969b650eb733e536569254ed3978c4f54Walter Jangimport com.android.contacts.widget.QuickContactImageView;
590a49afa2ad697307cc04ef4cb86570574fa720f2Gary Mai
60ddd4e821226395fd977d87b6692f761c90d59139Chiao Chengimport com.google.common.collect.Maps;
61ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng
6231a74ad969b650eb733e536569254ed3978c4f54Walter Jangimport java.io.FileNotFoundException;
63ddd4e821226395fd977d87b6692f761c90d59139Chiao Chengimport java.util.HashMap;
64ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng
65ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng/**
66ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng * Utility methods for creating contact editor.
67ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng */
68ddd4e821226395fd977d87b6692f761c90d59139Chiao Chengpublic class EditorUiUtils {
69ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng
70ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng    // Maps DataKind.mimeType to editor view layouts.
71ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng    private static final HashMap<String, Integer> mimetypeLayoutMap = Maps.newHashMap();
72ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng    static {
73ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        // Generally there should be a layout mapped to each existing DataKind mimetype but lots of
74ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        // them use the default text_fields_editor_view which we return as default so they don't
75ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        // need to be mapped.
76ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        //
77ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        // Other possible mime mappings are:
78ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        // DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME
79ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        // Nickname.CONTENT_ITEM_TYPE
80ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        // Email.CONTENT_ITEM_TYPE
81ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        // StructuredPostal.CONTENT_ITEM_TYPE
82ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        // Im.CONTENT_ITEM_TYPE
83ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        // Note.CONTENT_ITEM_TYPE
84ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        // Organization.CONTENT_ITEM_TYPE
85ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        // Phone.CONTENT_ITEM_TYPE
86ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        // SipAddress.CONTENT_ITEM_TYPE
87ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        // Website.CONTENT_ITEM_TYPE
88ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        // Relation.CONTENT_ITEM_TYPE
89ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        //
90ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        // Un-supported mime types need to mapped with -1.
91ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        mimetypeLayoutMap.put(StructuredName.CONTENT_ITEM_TYPE,
92ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng                R.layout.structured_name_editor_view);
93ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        mimetypeLayoutMap.put(GroupMembership.CONTENT_ITEM_TYPE, -1);
94ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        mimetypeLayoutMap.put(Photo.CONTENT_ITEM_TYPE, -1);
95ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        mimetypeLayoutMap.put(Event.CONTENT_ITEM_TYPE, R.layout.event_field_editor_view);
96ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng    }
97ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng
98ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng    /**
99ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng     * Fetches a layout for a given mimetype.
100ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng     *
101ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng     * @param mimetype The mime type (e.g. StructuredName.CONTENT_ITEM_TYPE)
102ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng     * @return The layout resource id.
103ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng     */
104ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng    public static int getLayoutResourceId(String mimetype) {
105ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        final Integer id = mimetypeLayoutMap.get(mimetype);
106ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        if (id == null) {
107ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng            return R.layout.text_fields_editor_view;
108ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        }
109ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng        return id;
110ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng    }
1112d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang
112c4cecc7e7534c7f5d887222d9e6f1a43364f7665Walter Jang
113fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott    public static String getAccountHeaderLabelForMyProfile(Context context,
1144bd50d69d2b8934dbd4cbd634ad83807d9b02735Marcus Hagerott            AccountInfo accountInfo) {
1154bd50d69d2b8934dbd4cbd634ad83807d9b02735Marcus Hagerott        if (accountInfo.isDeviceAccount()) {
116fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott            return context.getString(R.string.local_profile_title);
117541743ce471222a1eacf8a6366eebc0ee7c1e273Wenyi Wang        } else {
118fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott            return context.getString(R.string.external_profile_title,
1194bd50d69d2b8934dbd4cbd634ad83807d9b02735Marcus Hagerott                    accountInfo.getTypeLabel());
120defc69ce69b25daa4e3f41b7c7c6cbd1aa3e83ceWalter Jang        }
121fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott    }
122c4cecc7e7534c7f5d887222d9e6f1a43364f7665Walter Jang
123fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott    public static String getAccountTypeHeaderLabel(Context context, AccountDisplayInfo
124fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott            displayableAccount)  {
125fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott        if (displayableAccount.isDeviceAccount()) {
126fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott            // Do nothing. Type label should be "Device"
127fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott            return displayableAccount.getTypeLabel().toString();
128fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott        } else if (displayableAccount.isGoogleAccount()) {
129fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott            return context.getString(R.string.google_account_type_format,
130fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott                    displayableAccount.getTypeLabel());
131fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott        } else {
132fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott            return context.getString(R.string.account_type_format,
133fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott                    displayableAccount.getTypeLabel());
1342d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang        }
1352d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang    }
1362d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang
1372d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang    /**
1382d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang     * Returns a content description String for the container of the account information
139fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott     * returned by {@link #getAccountTypeHeaderLabel(Context, AccountDisplayInfo)}.
1402d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang     */
1412d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang    public static String getAccountInfoContentDescription(CharSequence accountName,
1422d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang            CharSequence accountType) {
1432d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang        final StringBuilder builder = new StringBuilder();
1442d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang        if (!TextUtils.isEmpty(accountType)) {
1452d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang            builder.append(accountType).append('\n');
1462d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang        }
1472d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang        if (!TextUtils.isEmpty(accountName)) {
148be5e1b109ce134c7f3f45cd4fc27b69454d7ad31Walter Jang            builder.append(accountName);
1492d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang        }
1502d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang        return builder.toString();
1512d3f31c210ffc617e82e3b41fc32b54ec2a5011aWalter Jang    }
152f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang
153f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    /**
154f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang     * Return an icon that represents {@param mimeType}.
155f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang     */
156f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    public static Drawable getMimeTypeDrawable(Context context, String mimeType) {
157f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        switch (mimeType) {
1583e5ae0db65e842d49d047568fb5d6f331298da32Walter Jang            case StructuredName.CONTENT_ITEM_TYPE:
1593cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                return ResourcesCompat.getDrawable(context.getResources(),
1603cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                        R.drawable.quantum_ic_person_vd_theme_24, null);
161f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            case StructuredPostal.CONTENT_ITEM_TYPE:
1623cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                return ResourcesCompat.getDrawable(context.getResources(),
1633cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                        R.drawable.quantum_ic_place_vd_theme_24, null);
164f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            case SipAddress.CONTENT_ITEM_TYPE:
1653cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                return ResourcesCompat.getDrawable(context.getResources(),
1663cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                        R.drawable.quantum_ic_dialer_sip_vd_theme_24, null);
167f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            case Phone.CONTENT_ITEM_TYPE:
1683cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                return ResourcesCompat.getDrawable(context.getResources(),
1693cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                        R.drawable.quantum_ic_phone_vd_theme_24, null);
170f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            case Im.CONTENT_ITEM_TYPE:
1713cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                return ResourcesCompat.getDrawable(context.getResources(),
1723cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                        R.drawable.quantum_ic_message_vd_theme_24, null);
173f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            case Event.CONTENT_ITEM_TYPE:
1743cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                return ResourcesCompat.getDrawable(context.getResources(),
1753cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                        R.drawable.quantum_ic_event_vd_theme_24, null);
176f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            case Email.CONTENT_ITEM_TYPE:
1773cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                return ResourcesCompat.getDrawable(context.getResources(),
1783cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                        R.drawable.quantum_ic_email_vd_theme_24, null);
179f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            case Website.CONTENT_ITEM_TYPE:
1803cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                return ResourcesCompat.getDrawable(context.getResources(),
1813cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                        R.drawable.quantum_ic_public_vd_theme_24, null);
182f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            case Photo.CONTENT_ITEM_TYPE:
1833cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                return ResourcesCompat.getDrawable(context.getResources(),
1843cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                        R.drawable.quantum_ic_camera_alt_vd_theme_24, null);
185f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            case GroupMembership.CONTENT_ITEM_TYPE:
1863cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                return ResourcesCompat.getDrawable(context.getResources(),
1873cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                        R.drawable.quantum_ic_label_vd_theme_24, null);
188f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            case Organization.CONTENT_ITEM_TYPE:
1893cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                return ResourcesCompat.getDrawable(context.getResources(),
1903cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                        R.drawable.quantum_ic_business_vd_theme_24, null);
191f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            case Note.CONTENT_ITEM_TYPE:
1923cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                return ResourcesCompat.getDrawable(context.getResources(),
1933cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                        R.drawable.quantum_ic_insert_comment_vd_theme_24, null);
194f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            case Relation.CONTENT_ITEM_TYPE:
1953cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                return ResourcesCompat.getDrawable(context.getResources(),
1963cbc7482cf5eb745f9ac0b51420a295f51aa46b3Marcus Hagerott                        R.drawable.quantum_ic_circles_ext_vd_theme_24, null);
197f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang            default:
198f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang                return null;
199f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang        }
200f5dfea4a5c94382a632eae5c538881f7da726a50Walter Jang    }
2013daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang
2023daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang    /**
2033daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang     * Returns a ringtone string based on the ringtone URI and version #.
2043daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang     */
2053daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang    public static String getRingtoneStringFromUri(Uri pickedUri, int currentVersion) {
2063daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang        if (isNewerThanM(currentVersion)) {
2073daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang            if (pickedUri == null) return ""; // silent ringtone
2083daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang            if (RingtoneManager.isDefault(pickedUri)) return null; // default ringtone
2093daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang        }
2103daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang        if (pickedUri == null || RingtoneManager.isDefault(pickedUri)) return null;
2113daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang        return pickedUri.toString();
2123daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang    }
2133daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang
2143daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang    /**
2153daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang     * Returns a ringtone URI, based on the string and version #.
2163daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang     */
2173daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang    public static Uri getRingtoneUriFromString(String str, int currentVersion) {
2183daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang        if (str != null) {
2193daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang            if (isNewerThanM(currentVersion) && TextUtils.isEmpty(str)) return null;
2203daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang            return Uri.parse(str);
2213daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang        }
2223daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang        return RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
2233daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang    }
2243daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang
2253daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang    private static boolean isNewerThanM(int currentVersion) {
2263daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang        return currentVersion > Build.VERSION_CODES.M;
2273daa9a34380f0368292f366c397c26f7e90db0dfWenyi Wang    }
22831a74ad969b650eb733e536569254ed3978c4f54Walter Jang
2293f18d6197a54aad10bea9c5cc2c89ca82809e793Walter Jang    /** Returns the {@link Photo#PHOTO_FILE_ID} from the given ValuesDelta. */
23031a74ad969b650eb733e536569254ed3978c4f54Walter Jang    public static Long getPhotoFileId(ValuesDelta valuesDelta) {
23131a74ad969b650eb733e536569254ed3978c4f54Walter Jang        if (valuesDelta == null) return null;
2322a4848adcae11e3ee3d5483268d251cccc043e33Wenyi Wang        if (valuesDelta.getAfter() == null || valuesDelta.getAfter().get(Photo.PHOTO) == null) {
23331a74ad969b650eb733e536569254ed3978c4f54Walter Jang            return valuesDelta.getAsLong(Photo.PHOTO_FILE_ID);
23431a74ad969b650eb733e536569254ed3978c4f54Walter Jang        }
23531a74ad969b650eb733e536569254ed3978c4f54Walter Jang        return null;
23631a74ad969b650eb733e536569254ed3978c4f54Walter Jang    }
23731a74ad969b650eb733e536569254ed3978c4f54Walter Jang
23831a74ad969b650eb733e536569254ed3978c4f54Walter Jang    /** Binds the full resolution image at the given Uri to the provided ImageView. */
23931a74ad969b650eb733e536569254ed3978c4f54Walter Jang    static void loadPhoto(ContactPhotoManager contactPhotoManager, ImageView imageView,
24031a74ad969b650eb733e536569254ed3978c4f54Walter Jang            Uri photoUri) {
24131a74ad969b650eb733e536569254ed3978c4f54Walter Jang        final DefaultImageProvider fallbackToPreviousImage = new DefaultImageProvider() {
24231a74ad969b650eb733e536569254ed3978c4f54Walter Jang            @Override
24331a74ad969b650eb733e536569254ed3978c4f54Walter Jang            public void applyDefaultImage(ImageView view, int extent, boolean darkTheme,
24431a74ad969b650eb733e536569254ed3978c4f54Walter Jang                    DefaultImageRequest defaultImageRequest) {
24531a74ad969b650eb733e536569254ed3978c4f54Walter Jang                // Before we finish setting the full sized image, don't change the current
24631a74ad969b650eb733e536569254ed3978c4f54Walter Jang                // image that is set in any way.
24731a74ad969b650eb733e536569254ed3978c4f54Walter Jang            }
24831a74ad969b650eb733e536569254ed3978c4f54Walter Jang        };
24931a74ad969b650eb733e536569254ed3978c4f54Walter Jang        contactPhotoManager.loadPhoto(imageView, photoUri, imageView.getWidth(),
25031a74ad969b650eb733e536569254ed3978c4f54Walter Jang                /* darkTheme =*/ false, /* isCircular =*/ false,
25131a74ad969b650eb733e536569254ed3978c4f54Walter Jang                /* defaultImageRequest =*/ null, fallbackToPreviousImage);
25231a74ad969b650eb733e536569254ed3978c4f54Walter Jang    }
25331a74ad969b650eb733e536569254ed3978c4f54Walter Jang
25431a74ad969b650eb733e536569254ed3978c4f54Walter Jang    /** Decodes the Bitmap from the photo bytes from the given ValuesDelta. */
25531a74ad969b650eb733e536569254ed3978c4f54Walter Jang    public static Bitmap getPhotoBitmap(ValuesDelta valuesDelta) {
25631a74ad969b650eb733e536569254ed3978c4f54Walter Jang        if (valuesDelta == null) return null;
25731a74ad969b650eb733e536569254ed3978c4f54Walter Jang        final byte[] bytes = valuesDelta.getAsByteArray(Photo.PHOTO);
25831a74ad969b650eb733e536569254ed3978c4f54Walter Jang        if (bytes == null) return null;
25931a74ad969b650eb733e536569254ed3978c4f54Walter Jang        return BitmapFactory.decodeByteArray(bytes, /* offset =*/ 0, bytes.length);
26031a74ad969b650eb733e536569254ed3978c4f54Walter Jang    }
26131a74ad969b650eb733e536569254ed3978c4f54Walter Jang
26231a74ad969b650eb733e536569254ed3978c4f54Walter Jang    /** Binds the default avatar to the given ImageView and tints it to match QuickContacts. */
26331a74ad969b650eb733e536569254ed3978c4f54Walter Jang    public static void setDefaultPhoto(ImageView imageView , Resources resources,
26431a74ad969b650eb733e536569254ed3978c4f54Walter Jang            MaterialPalette materialPalette) {
26531a74ad969b650eb733e536569254ed3978c4f54Walter Jang        // Use the default avatar drawable
26631a74ad969b650eb733e536569254ed3978c4f54Walter Jang        imageView.setImageDrawable(ContactPhotoManager.getDefaultAvatarDrawableForContact(
26731a74ad969b650eb733e536569254ed3978c4f54Walter Jang                resources, /* hires =*/ false, /* defaultImageRequest =*/ null));
26831a74ad969b650eb733e536569254ed3978c4f54Walter Jang
26931a74ad969b650eb733e536569254ed3978c4f54Walter Jang        // Tint it to match the quick contacts
27031a74ad969b650eb733e536569254ed3978c4f54Walter Jang        if (imageView instanceof QuickContactImageView) {
27131a74ad969b650eb733e536569254ed3978c4f54Walter Jang            ((QuickContactImageView) imageView).setTint(materialPalette == null
27231a74ad969b650eb733e536569254ed3978c4f54Walter Jang                    ? getDefaultPrimaryAndSecondaryColors(resources).mPrimaryColor
27331a74ad969b650eb733e536569254ed3978c4f54Walter Jang                    : materialPalette.mPrimaryColor);
27431a74ad969b650eb733e536569254ed3978c4f54Walter Jang        }
27531a74ad969b650eb733e536569254ed3978c4f54Walter Jang    }
27631a74ad969b650eb733e536569254ed3978c4f54Walter Jang
27731a74ad969b650eb733e536569254ed3978c4f54Walter Jang    /**  Returns compressed bitmap bytes from the given Uri, scaled to the thumbnail dimensions. */
27831a74ad969b650eb733e536569254ed3978c4f54Walter Jang    public static byte[] getCompressedThumbnailBitmapBytes(Context context, Uri uri)
27931a74ad969b650eb733e536569254ed3978c4f54Walter Jang            throws FileNotFoundException {
28031a74ad969b650eb733e536569254ed3978c4f54Walter Jang        final Bitmap bitmap = ContactPhotoUtils.getBitmapFromUri(context, uri);
28131a74ad969b650eb733e536569254ed3978c4f54Walter Jang        final int size = ContactsUtils.getThumbnailSize(context);
28231a74ad969b650eb733e536569254ed3978c4f54Walter Jang        final Bitmap bitmapScaled = Bitmap.createScaledBitmap(
28331a74ad969b650eb733e536569254ed3978c4f54Walter Jang                bitmap, size, size, /* filter =*/ false);
28431a74ad969b650eb733e536569254ed3978c4f54Walter Jang        return ContactPhotoUtils.compressBitmap(bitmapScaled);
28531a74ad969b650eb733e536569254ed3978c4f54Walter Jang    }
2867b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang
287ddd4e821226395fd977d87b6692f761c90d59139Chiao Cheng}
288