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