Yorke Lee | b3d841a | 2014-07-10 11:38:55 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2010 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
Gary Mai | 69c182a | 2016-12-05 13:07:03 -0800 | [diff] [blame] | 17 | package com.android.contacts.preference; |
Yorke Lee | b3d841a | 2014-07-10 11:38:55 -0700 | [diff] [blame] | 18 | |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 19 | import android.app.Activity; |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 20 | import android.app.LoaderManager; |
Marcus Hagerott | 819214d | 2016-09-29 14:58:27 -0700 | [diff] [blame] | 21 | import android.content.BroadcastReceiver; |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 22 | import android.content.ContentUris; |
Wenyi Wang | 9342fbb | 2015-11-17 19:36:35 -0800 | [diff] [blame] | 23 | import android.content.Context; |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 24 | import android.content.CursorLoader; |
| 25 | import android.content.Intent; |
Marcus Hagerott | 819214d | 2016-09-29 14:58:27 -0700 | [diff] [blame] | 26 | import android.content.IntentFilter; |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 27 | import android.content.Loader; |
Walter Jang | 5665f36 | 2016-01-20 21:44:10 +0000 | [diff] [blame] | 28 | import android.content.res.Resources; |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 29 | import android.database.Cursor; |
| 30 | import android.net.Uri; |
Yorke Lee | b3d841a | 2014-07-10 11:38:55 -0700 | [diff] [blame] | 31 | import android.os.Bundle; |
Tingting Wang | debe2da | 2015-11-01 20:19:03 -0800 | [diff] [blame] | 32 | import android.preference.Preference; |
Brian Attwell | c2e912c | 2014-10-27 12:29:44 -0700 | [diff] [blame] | 33 | import android.preference.PreferenceFragment; |
Wenyi Wang | ae5c3a0 | 2016-06-27 12:43:31 -0700 | [diff] [blame] | 34 | import android.provider.BlockedNumberContract; |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 35 | import android.provider.ContactsContract.Contacts; |
taiki tsutsumi | ae4208e | 2017-07-21 16:57:32 +0900 | [diff] [blame] | 36 | import android.provider.ContactsContract.DisplayNameSources; |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 37 | import android.provider.ContactsContract.Profile; |
Aurimas Liutikas | 1f8811c | 2019-01-30 21:39:48 -0800 | [diff] [blame] | 38 | import com.google.android.material.snackbar.Snackbar; |
Aravind Sreekumar | 7121285 | 2018-04-06 15:47:45 -0700 | [diff] [blame] | 39 | import androidx.localbroadcastmanager.content.LocalBroadcastManager; |
Tingting Wang | f5b1258 | 2016-06-30 18:27:22 -0700 | [diff] [blame] | 40 | import android.telecom.TelecomManager; |
| 41 | import android.telephony.TelephonyManager; |
taiki tsutsumi | ae4208e | 2017-07-21 16:57:32 +0900 | [diff] [blame] | 42 | import android.text.BidiFormatter; |
| 43 | import android.text.TextDirectionHeuristics; |
Marcus Hagerott | 819214d | 2016-09-29 14:58:27 -0700 | [diff] [blame] | 44 | import android.view.LayoutInflater; |
| 45 | import android.view.View; |
| 46 | import android.view.ViewGroup; |
| 47 | import android.widget.FrameLayout; |
Yorke Lee | b3d841a | 2014-07-10 11:38:55 -0700 | [diff] [blame] | 48 | |
Gary Mai | 0a49afa | 2016-12-05 15:53:58 -0800 | [diff] [blame] | 49 | import com.android.contacts.ContactsUtils; |
Marcus Hagerott | 819214d | 2016-09-29 14:58:27 -0700 | [diff] [blame] | 50 | import com.android.contacts.R; |
Marcus Hagerott | 95246bb | 2016-11-11 10:56:09 -0800 | [diff] [blame] | 51 | import com.android.contacts.SimImportService; |
Gary Mai | 69c182a | 2016-12-05 13:07:03 -0800 | [diff] [blame] | 52 | import com.android.contacts.compat.TelecomManagerUtil; |
| 53 | import com.android.contacts.compat.TelephonyManagerCompat; |
| 54 | import com.android.contacts.interactions.ExportDialogFragment; |
| 55 | import com.android.contacts.interactions.ImportDialogFragment; |
| 56 | import com.android.contacts.list.ContactListFilter; |
| 57 | import com.android.contacts.list.ContactListFilterController; |
| 58 | import com.android.contacts.logging.ScreenEvent.ScreenType; |
| 59 | import com.android.contacts.model.AccountTypeManager; |
Marcus Hagerott | dc91dd6 | 2016-12-21 16:57:32 -0800 | [diff] [blame] | 60 | import com.android.contacts.model.account.AccountInfo; |
Marcus Hagerott | dc91dd6 | 2016-12-21 16:57:32 -0800 | [diff] [blame] | 61 | import com.android.contacts.model.account.AccountsLoader; |
Gary Mai | 69c182a | 2016-12-05 13:07:03 -0800 | [diff] [blame] | 62 | import com.android.contacts.util.AccountFilterUtil; |
| 63 | import com.android.contacts.util.ImplicitIntentsUtil; |
James Laskey | ff9a19d | 2016-11-15 13:36:34 -0800 | [diff] [blame] | 64 | import com.android.contactsbind.HelpUtils; |
Tingting Wang | c939ae3 | 2015-09-01 16:45:08 -0700 | [diff] [blame] | 65 | |
| 66 | import java.util.List; |
Yorke Lee | b3d841a | 2014-07-10 11:38:55 -0700 | [diff] [blame] | 67 | |
| 68 | /** |
Wenyi Wang | cc3016e | 2015-12-30 16:54:05 -0800 | [diff] [blame] | 69 | * This fragment shows the preferences for "display options" |
Yorke Lee | b3d841a | 2014-07-10 11:38:55 -0700 | [diff] [blame] | 70 | */ |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 71 | public class DisplayOptionsPreferenceFragment extends PreferenceFragment |
Marcus Hagerott | 8c6b5bd | 2016-12-21 17:14:52 -0800 | [diff] [blame] | 72 | implements Preference.OnPreferenceClickListener, AccountsLoader.AccountsListener { |
Yorke Lee | b3d841a | 2014-07-10 11:38:55 -0700 | [diff] [blame] | 73 | |
Walter Jang | f2cad22 | 2016-07-14 19:49:06 +0000 | [diff] [blame] | 74 | private static final int REQUEST_CODE_CUSTOM_CONTACTS_FILTER = 0; |
| 75 | |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 76 | private static final String ARG_CONTACTS_AVAILABLE = "are_contacts_available"; |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 77 | private static final String ARG_NEW_LOCAL_PROFILE = "new_local_profile"; |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 78 | |
| 79 | private static final String KEY_ABOUT = "about"; |
| 80 | private static final String KEY_ACCOUNTS = "accounts"; |
Tingting Wang | 940f015 | 2016-06-30 13:15:49 -0700 | [diff] [blame] | 81 | private static final String KEY_DEFAULT_ACCOUNT = "defaultAccount"; |
Tingting Wang | f5b1258 | 2016-06-30 18:27:22 -0700 | [diff] [blame] | 82 | private static final String KEY_BLOCKED_NUMBERS = "blockedNumbers"; |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 83 | private static final String KEY_DISPLAY_ORDER = "displayOrder"; |
Walter Jang | f2cad22 | 2016-07-14 19:49:06 +0000 | [diff] [blame] | 84 | private static final String KEY_CUSTOM_CONTACTS_FILTER = "customContactsFilter"; |
James Laskey | 1e2102f | 2016-09-19 10:09:08 -0700 | [diff] [blame] | 85 | private static final String KEY_IMPORT = "import"; |
| 86 | private static final String KEY_EXPORT = "export"; |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 87 | private static final String KEY_MY_INFO = "myInfo"; |
| 88 | private static final String KEY_SORT_ORDER = "sortOrder"; |
avipul | 030b126 | 2017-02-28 12:14:44 -0800 | [diff] [blame] | 89 | private static final String KEY_PHONETIC_NAME_DISPLAY = "phoneticNameDisplay"; |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 90 | |
| 91 | private static final int LOADER_PROFILE = 0; |
Marcus Hagerott | dc91dd6 | 2016-12-21 16:57:32 -0800 | [diff] [blame] | 92 | private static final int LOADER_ACCOUNTS = 1; |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 93 | |
| 94 | /** |
| 95 | * Callbacks for hosts of the {@link DisplayOptionsPreferenceFragment}. |
| 96 | */ |
| 97 | public interface ProfileListener { |
| 98 | /** |
| 99 | * Invoked after profile has been loaded. |
| 100 | */ |
| 101 | void onProfileLoaded(Cursor data); |
| 102 | } |
| 103 | |
| 104 | /** |
| 105 | * The projections that are used to obtain user profile |
| 106 | */ |
| 107 | public static class ProfileQuery { |
| 108 | /** |
| 109 | * Not instantiable. |
| 110 | */ |
| 111 | private ProfileQuery() {} |
| 112 | |
| 113 | private static final String[] PROFILE_PROJECTION_PRIMARY = new String[] { |
| 114 | Contacts._ID, // 0 |
| 115 | Contacts.DISPLAY_NAME_PRIMARY, // 1 |
| 116 | Contacts.IS_USER_PROFILE, // 2 |
taiki tsutsumi | ae4208e | 2017-07-21 16:57:32 +0900 | [diff] [blame] | 117 | Contacts.DISPLAY_NAME_SOURCE, // 3 |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 118 | }; |
| 119 | |
| 120 | private static final String[] PROFILE_PROJECTION_ALTERNATIVE = new String[] { |
| 121 | Contacts._ID, // 0 |
| 122 | Contacts.DISPLAY_NAME_ALTERNATIVE, // 1 |
| 123 | Contacts.IS_USER_PROFILE, // 2 |
taiki tsutsumi | ae4208e | 2017-07-21 16:57:32 +0900 | [diff] [blame] | 124 | Contacts.DISPLAY_NAME_SOURCE, // 3 |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 125 | }; |
| 126 | |
| 127 | public static final int CONTACT_ID = 0; |
| 128 | public static final int CONTACT_DISPLAY_NAME = 1; |
| 129 | public static final int CONTACT_IS_USER_PROFILE = 2; |
taiki tsutsumi | ae4208e | 2017-07-21 16:57:32 +0900 | [diff] [blame] | 130 | public static final int DISPLAY_NAME_SOURCE = 3; |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 131 | } |
| 132 | |
| 133 | private String mNewLocalProfileExtra; |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 134 | private boolean mAreContactsAvailable; |
| 135 | |
| 136 | private boolean mHasProfile; |
| 137 | private long mProfileContactId; |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 138 | |
| 139 | private Preference mMyInfoPreference; |
| 140 | |
| 141 | private ProfileListener mListener; |
| 142 | |
Marcus Hagerott | 819214d | 2016-09-29 14:58:27 -0700 | [diff] [blame] | 143 | private ViewGroup mRootView; |
| 144 | private SaveServiceResultListener mSaveServiceListener; |
| 145 | |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 146 | private final LoaderManager.LoaderCallbacks<Cursor> mProfileLoaderListener = |
| 147 | new LoaderManager.LoaderCallbacks<Cursor>() { |
| 148 | |
| 149 | @Override |
| 150 | public CursorLoader onCreateLoader(int id, Bundle args) { |
| 151 | final CursorLoader loader = createCursorLoader(getContext()); |
| 152 | loader.setUri(Profile.CONTENT_URI); |
| 153 | loader.setProjection(getProjection(getContext())); |
| 154 | return loader; |
| 155 | } |
| 156 | |
| 157 | @Override |
| 158 | public void onLoadFinished(Loader<Cursor> loader, Cursor data) { |
| 159 | if (mListener != null) { |
| 160 | mListener.onProfileLoaded(data); |
| 161 | } |
| 162 | } |
| 163 | |
| 164 | public void onLoaderReset(Loader<Cursor> loader) { |
| 165 | } |
| 166 | }; |
| 167 | |
| 168 | public static DisplayOptionsPreferenceFragment newInstance(String newLocalProfileExtra, |
Walter Jang | 0396cf7 | 2016-09-21 13:23:29 -0700 | [diff] [blame] | 169 | boolean areContactsAvailable) { |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 170 | final DisplayOptionsPreferenceFragment fragment = new DisplayOptionsPreferenceFragment(); |
| 171 | final Bundle args = new Bundle(); |
| 172 | args.putString(ARG_NEW_LOCAL_PROFILE, newLocalProfileExtra); |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 173 | args.putBoolean(ARG_CONTACTS_AVAILABLE, areContactsAvailable); |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 174 | fragment.setArguments(args); |
| 175 | return fragment; |
| 176 | } |
| 177 | |
Yorke Lee | b3d841a | 2014-07-10 11:38:55 -0700 | [diff] [blame] | 178 | @Override |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 179 | public void onAttach(Activity activity) { |
| 180 | super.onAttach(activity); |
| 181 | try { |
| 182 | mListener = (ProfileListener) activity; |
| 183 | } catch (ClassCastException e) { |
| 184 | throw new ClassCastException(activity.toString() + " must implement ProfileListener"); |
| 185 | } |
| 186 | } |
| 187 | |
| 188 | @Override |
Marcus Hagerott | 819214d | 2016-09-29 14:58:27 -0700 | [diff] [blame] | 189 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { |
| 190 | // Wrap the preference view in a FrameLayout so we can show a snackbar |
| 191 | mRootView = new FrameLayout(getActivity()); |
| 192 | final View list = super.onCreateView(inflater, mRootView, savedInstanceState); |
| 193 | mRootView.addView(list); |
| 194 | return mRootView; |
| 195 | } |
| 196 | |
| 197 | @Override |
| 198 | public void onViewCreated(View view, Bundle savedInstanceState) { |
| 199 | super.onViewCreated(view, savedInstanceState); |
| 200 | |
| 201 | mSaveServiceListener = new SaveServiceResultListener(); |
| 202 | LocalBroadcastManager.getInstance(getActivity()).registerReceiver( |
| 203 | mSaveServiceListener, |
Marcus Hagerott | 95246bb | 2016-11-11 10:56:09 -0800 | [diff] [blame] | 204 | new IntentFilter(SimImportService.BROADCAST_SIM_IMPORT_COMPLETE)); |
Marcus Hagerott | 819214d | 2016-09-29 14:58:27 -0700 | [diff] [blame] | 205 | } |
| 206 | |
| 207 | @Override |
Yorke Lee | b3d841a | 2014-07-10 11:38:55 -0700 | [diff] [blame] | 208 | public void onCreate(Bundle savedInstanceState) { |
| 209 | super.onCreate(savedInstanceState); |
| 210 | |
| 211 | // Load the preferences from an XML resource |
| 212 | addPreferencesFromResource(R.xml.preference_display_options); |
Tingting Wang | c939ae3 | 2015-09-01 16:45:08 -0700 | [diff] [blame] | 213 | |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 214 | final Bundle args = getArguments(); |
| 215 | mNewLocalProfileExtra = args.getString(ARG_NEW_LOCAL_PROFILE); |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 216 | mAreContactsAvailable = args.getBoolean(ARG_CONTACTS_AVAILABLE); |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 217 | |
James Laskey | 1e2102f | 2016-09-19 10:09:08 -0700 | [diff] [blame] | 218 | removeUnsupportedPreferences(); |
James Laskey | 1e2102f | 2016-09-19 10:09:08 -0700 | [diff] [blame] | 219 | |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 220 | mMyInfoPreference = findPreference(KEY_MY_INFO); |
Tingting Wang | 940f015 | 2016-06-30 13:15:49 -0700 | [diff] [blame] | 221 | |
| 222 | final Preference accountsPreference = findPreference(KEY_ACCOUNTS); |
| 223 | accountsPreference.setOnPreferenceClickListener(this); |
| 224 | |
James Laskey | 1e2102f | 2016-09-19 10:09:08 -0700 | [diff] [blame] | 225 | final Preference importPreference = findPreference(KEY_IMPORT); |
| 226 | importPreference.setOnPreferenceClickListener(this); |
| 227 | |
| 228 | final Preference exportPreference = findPreference(KEY_EXPORT); |
| 229 | if (exportPreference != null) { |
| 230 | exportPreference.setOnPreferenceClickListener(this); |
| 231 | } |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 232 | |
Tingting Wang | f5b1258 | 2016-06-30 18:27:22 -0700 | [diff] [blame] | 233 | final Preference blockedNumbersPreference = findPreference(KEY_BLOCKED_NUMBERS); |
| 234 | if (blockedNumbersPreference != null) { |
| 235 | blockedNumbersPreference.setOnPreferenceClickListener(this); |
| 236 | } |
| 237 | |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 238 | final Preference aboutPreference = findPreference(KEY_ABOUT); |
James Laskey | ff9a19d | 2016-11-15 13:36:34 -0800 | [diff] [blame] | 239 | if (aboutPreference != null) { |
| 240 | aboutPreference.setOnPreferenceClickListener(this); |
| 241 | } |
Walter Jang | f2cad22 | 2016-07-14 19:49:06 +0000 | [diff] [blame] | 242 | |
| 243 | final Preference customFilterPreference = findPreference(KEY_CUSTOM_CONTACTS_FILTER); |
| 244 | if (customFilterPreference != null) { |
| 245 | customFilterPreference.setOnPreferenceClickListener(this); |
Walter Jang | 362b733 | 2016-07-18 18:26:07 -0700 | [diff] [blame] | 246 | setCustomContactsFilterSummary(); |
Walter Jang | f2cad22 | 2016-07-14 19:49:06 +0000 | [diff] [blame] | 247 | } |
Yorke Lee | b3d841a | 2014-07-10 11:38:55 -0700 | [diff] [blame] | 248 | } |
Wenyi Wang | 9342fbb | 2015-11-17 19:36:35 -0800 | [diff] [blame] | 249 | |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 250 | @Override |
| 251 | public void onActivityCreated(Bundle savedInstanceState) { |
| 252 | super.onActivityCreated(savedInstanceState); |
Marcus Hagerott | dc91dd6 | 2016-12-21 16:57:32 -0800 | [diff] [blame] | 253 | getLoaderManager().initLoader(LOADER_PROFILE, null, mProfileLoaderListener); |
Marcus Hagerott | 8c6b5bd | 2016-12-21 17:14:52 -0800 | [diff] [blame] | 254 | AccountsLoader.loadAccounts(this, LOADER_ACCOUNTS, AccountTypeManager.writableFilter()); |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 255 | } |
| 256 | |
Marcus Hagerott | 819214d | 2016-09-29 14:58:27 -0700 | [diff] [blame] | 257 | @Override |
| 258 | public void onDestroyView() { |
| 259 | super.onDestroyView(); |
| 260 | LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mSaveServiceListener); |
| 261 | mRootView = null; |
| 262 | } |
| 263 | |
taiki tsutsumi | ae4208e | 2017-07-21 16:57:32 +0900 | [diff] [blame] | 264 | public void updateMyInfoPreference(boolean hasProfile, String displayName, long contactId, |
| 265 | int displayNameSource) { |
| 266 | final CharSequence summary = !hasProfile ? |
| 267 | getString(R.string.set_up_profile) : |
| 268 | displayNameSource == DisplayNameSources.PHONE ? |
| 269 | BidiFormatter.getInstance().unicodeWrap(displayName, TextDirectionHeuristics.LTR) : |
| 270 | displayName; |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 271 | mMyInfoPreference.setSummary(summary); |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 272 | mHasProfile = hasProfile; |
| 273 | mProfileContactId = contactId; |
| 274 | mMyInfoPreference.setOnPreferenceClickListener(this); |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 275 | } |
| 276 | |
Walter Jang | 5665f36 | 2016-01-20 21:44:10 +0000 | [diff] [blame] | 277 | private void removeUnsupportedPreferences() { |
Wenyi Wang | b297ad0 | 2016-04-17 12:53:46 -0700 | [diff] [blame] | 278 | // Disable sort order for CJK locales where it is not supported |
Wenyi Wang | 2882a5a | 2016-05-13 19:54:45 +0000 | [diff] [blame] | 279 | final Resources resources = getResources(); |
Walter Jang | 5665f36 | 2016-01-20 21:44:10 +0000 | [diff] [blame] | 280 | if (!resources.getBoolean(R.bool.config_sort_order_user_changeable)) { |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 281 | getPreferenceScreen().removePreference(findPreference(KEY_SORT_ORDER)); |
Walter Jang | 5665f36 | 2016-01-20 21:44:10 +0000 | [diff] [blame] | 282 | } |
| 283 | |
avipul | 030b126 | 2017-02-28 12:14:44 -0800 | [diff] [blame] | 284 | if (!resources.getBoolean(R.bool.config_phonetic_name_display_user_changeable)) { |
| 285 | getPreferenceScreen().removePreference(findPreference(KEY_PHONETIC_NAME_DISPLAY)); |
| 286 | } |
| 287 | |
James Laskey | ff9a19d | 2016-11-15 13:36:34 -0800 | [diff] [blame] | 288 | if (HelpUtils.isHelpAndFeedbackAvailable()) { |
| 289 | getPreferenceScreen().removePreference(findPreference(KEY_ABOUT)); |
| 290 | } |
| 291 | |
Walter Jang | 5665f36 | 2016-01-20 21:44:10 +0000 | [diff] [blame] | 292 | // Disable display order for CJK locales as well |
| 293 | if (!resources.getBoolean(R.bool.config_display_order_user_changeable)) { |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 294 | getPreferenceScreen().removePreference(findPreference(KEY_DISPLAY_ORDER)); |
Walter Jang | 5665f36 | 2016-01-20 21:44:10 +0000 | [diff] [blame] | 295 | } |
| 296 | |
Tingting Wang | f5b1258 | 2016-06-30 18:27:22 -0700 | [diff] [blame] | 297 | final boolean isPhone = TelephonyManagerCompat.isVoiceCapable( |
| 298 | (TelephonyManager) getContext().getSystemService(Context.TELEPHONY_SERVICE)); |
| 299 | final boolean showBlockedNumbers = isPhone && ContactsUtils.FLAG_N_FEATURE |
Wenyi Wang | ae5c3a0 | 2016-06-27 12:43:31 -0700 | [diff] [blame] | 300 | && BlockedNumberContract.canCurrentUserBlockNumbers(getContext()); |
Tingting Wang | f5b1258 | 2016-06-30 18:27:22 -0700 | [diff] [blame] | 301 | if (!showBlockedNumbers) { |
| 302 | getPreferenceScreen().removePreference(findPreference(KEY_BLOCKED_NUMBERS)); |
| 303 | } |
James Laskey | 1e2102f | 2016-09-19 10:09:08 -0700 | [diff] [blame] | 304 | |
| 305 | if (!mAreContactsAvailable) { |
| 306 | getPreferenceScreen().removePreference(findPreference(KEY_EXPORT)); |
| 307 | } |
Tingting Wang | 918f0b2 | 2016-02-09 15:06:24 -0800 | [diff] [blame] | 308 | } |
Walter Jang | 5665f36 | 2016-01-20 21:44:10 +0000 | [diff] [blame] | 309 | |
Marcus Hagerott | 8c6b5bd | 2016-12-21 17:14:52 -0800 | [diff] [blame] | 310 | @Override |
| 311 | public void onAccountsLoaded(List<AccountInfo> accounts) { |
| 312 | // Hide accounts preferences if no writable accounts exist |
Marcus Hagerott | 614d812 | 2017-01-04 13:56:10 -0800 | [diff] [blame] | 313 | final DefaultAccountPreference preference = |
| 314 | (DefaultAccountPreference) findPreference(KEY_DEFAULT_ACCOUNT); |
| 315 | preference.setAccounts(accounts); |
Marcus Hagerott | dc91dd6 | 2016-12-21 16:57:32 -0800 | [diff] [blame] | 316 | } |
| 317 | |
Wenyi Wang | 9342fbb | 2015-11-17 19:36:35 -0800 | [diff] [blame] | 318 | @Override |
| 319 | public Context getContext() { |
| 320 | return getActivity(); |
| 321 | } |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 322 | |
| 323 | private CursorLoader createCursorLoader(Context context) { |
| 324 | return new CursorLoader(context) { |
| 325 | @Override |
| 326 | protected Cursor onLoadInBackground() { |
| 327 | try { |
| 328 | return super.onLoadInBackground(); |
| 329 | } catch (RuntimeException e) { |
| 330 | return null; |
| 331 | } |
| 332 | } |
| 333 | }; |
| 334 | } |
| 335 | |
| 336 | private String[] getProjection(Context context) { |
| 337 | final ContactsPreferences contactsPrefs = new ContactsPreferences(context); |
| 338 | final int displayOrder = contactsPrefs.getDisplayOrder(); |
| 339 | if (displayOrder == ContactsPreferences.DISPLAY_ORDER_PRIMARY) { |
| 340 | return ProfileQuery.PROFILE_PROJECTION_PRIMARY; |
| 341 | } |
| 342 | return ProfileQuery.PROFILE_PROJECTION_ALTERNATIVE; |
| 343 | } |
| 344 | |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 345 | @Override |
| 346 | public boolean onPreferenceClick(Preference p) { |
| 347 | final String prefKey = p.getKey(); |
| 348 | |
| 349 | if (KEY_ABOUT.equals(prefKey)) { |
| 350 | ((ContactsPreferenceActivity) getActivity()).showAboutFragment(); |
| 351 | return true; |
James Laskey | 1e2102f | 2016-09-19 10:09:08 -0700 | [diff] [blame] | 352 | } else if (KEY_IMPORT.equals(prefKey)) { |
Marcus Hagerott | 02f5dba | 2016-10-18 12:34:57 -0700 | [diff] [blame] | 353 | ImportDialogFragment.show(getFragmentManager()); |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 354 | return true; |
James Laskey | 1e2102f | 2016-09-19 10:09:08 -0700 | [diff] [blame] | 355 | } else if (KEY_EXPORT.equals(prefKey)) { |
| 356 | ExportDialogFragment.show(getFragmentManager(), ContactsPreferenceActivity.class, |
| 357 | ExportDialogFragment.EXPORT_MODE_ALL_CONTACTS); |
| 358 | return true; |
Walter Jang | 0396cf7 | 2016-09-21 13:23:29 -0700 | [diff] [blame] | 359 | } else if (KEY_MY_INFO.equals(prefKey)) { |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 360 | if (mHasProfile) { |
| 361 | final Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, mProfileContactId); |
Walter Jang | 0396cf7 | 2016-09-21 13:23:29 -0700 | [diff] [blame] | 362 | ImplicitIntentsUtil.startQuickContact(getActivity(), uri, ScreenType.ME_CONTACT); |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 363 | } else { |
Walter Jang | 0396cf7 | 2016-09-21 13:23:29 -0700 | [diff] [blame] | 364 | final Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI); |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 365 | intent.putExtra(mNewLocalProfileExtra, true); |
Walter Jang | 0396cf7 | 2016-09-21 13:23:29 -0700 | [diff] [blame] | 366 | ImplicitIntentsUtil.startActivityInApp(getActivity(), intent); |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 367 | } |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 368 | return true; |
Tingting Wang | 940f015 | 2016-06-30 13:15:49 -0700 | [diff] [blame] | 369 | } else if (KEY_ACCOUNTS.equals(prefKey)) { |
Walter Jang | 8be7701 | 2016-07-07 21:05:34 -0700 | [diff] [blame] | 370 | ImplicitIntentsUtil.startActivityOutsideApp(getContext(), |
| 371 | ImplicitIntentsUtil.getIntentForAddingAccount()); |
Tingting Wang | 940f015 | 2016-06-30 13:15:49 -0700 | [diff] [blame] | 372 | return true; |
Tingting Wang | f5b1258 | 2016-06-30 18:27:22 -0700 | [diff] [blame] | 373 | } else if (KEY_BLOCKED_NUMBERS.equals(prefKey)) { |
| 374 | final Intent intent = TelecomManagerUtil.createManageBlockedNumbersIntent( |
| 375 | (TelecomManager) getContext().getSystemService(Context.TELECOM_SERVICE)); |
| 376 | startActivity(intent); |
| 377 | return true; |
Walter Jang | f2cad22 | 2016-07-14 19:49:06 +0000 | [diff] [blame] | 378 | } else if (KEY_CUSTOM_CONTACTS_FILTER.equals(prefKey)) { |
| 379 | final ContactListFilter filter = |
| 380 | ContactListFilterController.getInstance(getContext()).getFilter(); |
| 381 | AccountFilterUtil.startAccountFilterActivityForResult( |
| 382 | this, REQUEST_CODE_CUSTOM_CONTACTS_FILTER, filter); |
Wenyi Wang | 1387401 | 2016-05-27 15:23:53 -0700 | [diff] [blame] | 383 | } |
| 384 | return false; |
Wenyi Wang | a031344 | 2016-05-16 11:55:19 -0700 | [diff] [blame] | 385 | } |
Walter Jang | f2cad22 | 2016-07-14 19:49:06 +0000 | [diff] [blame] | 386 | |
| 387 | @Override |
| 388 | public void onActivityResult(int requestCode, int resultCode, Intent data) { |
| 389 | if (requestCode == REQUEST_CODE_CUSTOM_CONTACTS_FILTER |
| 390 | && resultCode == Activity.RESULT_OK) { |
| 391 | AccountFilterUtil.handleAccountFilterResult( |
| 392 | ContactListFilterController.getInstance(getContext()), resultCode, data); |
Walter Jang | 362b733 | 2016-07-18 18:26:07 -0700 | [diff] [blame] | 393 | setCustomContactsFilterSummary(); |
Walter Jang | f2cad22 | 2016-07-14 19:49:06 +0000 | [diff] [blame] | 394 | } else { |
| 395 | super.onActivityResult(requestCode, resultCode, data); |
| 396 | } |
| 397 | } |
Walter Jang | 362b733 | 2016-07-18 18:26:07 -0700 | [diff] [blame] | 398 | |
| 399 | private void setCustomContactsFilterSummary() { |
| 400 | final Preference customFilterPreference = findPreference(KEY_CUSTOM_CONTACTS_FILTER); |
| 401 | if (customFilterPreference != null) { |
| 402 | final ContactListFilter filter = |
Walter Jang | 398bca9 | 2016-08-02 14:37:57 -0700 | [diff] [blame] | 403 | ContactListFilterController.getInstance(getContext()).getPersistedFilter(); |
Walter Jang | 362b733 | 2016-07-18 18:26:07 -0700 | [diff] [blame] | 404 | if (filter != null) { |
| 405 | if (filter.filterType == ContactListFilter.FILTER_TYPE_DEFAULT || |
| 406 | filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) { |
| 407 | customFilterPreference.setSummary(R.string.list_filter_all_accounts); |
| 408 | } else if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) { |
Wenyi Wang | 2b1aa12 | 2016-07-19 19:31:07 -0700 | [diff] [blame] | 409 | customFilterPreference.setSummary(R.string.listCustomView); |
Walter Jang | 362b733 | 2016-07-18 18:26:07 -0700 | [diff] [blame] | 410 | } else { |
| 411 | customFilterPreference.setSummary(null); |
| 412 | } |
| 413 | } |
| 414 | } |
| 415 | } |
Marcus Hagerott | 819214d | 2016-09-29 14:58:27 -0700 | [diff] [blame] | 416 | |
| 417 | private class SaveServiceResultListener extends BroadcastReceiver { |
| 418 | @Override |
| 419 | public void onReceive(Context context, Intent intent) { |
| 420 | final long now = System.currentTimeMillis(); |
| 421 | final long opStart = intent.getLongExtra( |
Marcus Hagerott | 95246bb | 2016-11-11 10:56:09 -0800 | [diff] [blame] | 422 | SimImportService.EXTRA_OPERATION_REQUESTED_AT_TIME, now); |
Marcus Hagerott | 819214d | 2016-09-29 14:58:27 -0700 | [diff] [blame] | 423 | |
| 424 | // If it's been over 30 seconds the user is likely in a different context so suppress |
| 425 | // the toast message. |
| 426 | if (now - opStart > 30*1000) return; |
| 427 | |
Marcus Hagerott | 95246bb | 2016-11-11 10:56:09 -0800 | [diff] [blame] | 428 | final int code = intent.getIntExtra(SimImportService.EXTRA_RESULT_CODE, |
| 429 | SimImportService.RESULT_UNKNOWN); |
| 430 | final int count = intent.getIntExtra(SimImportService.EXTRA_RESULT_COUNT, -1); |
| 431 | if (code == SimImportService.RESULT_SUCCESS && count > 0) { |
Marcus Hagerott | 819214d | 2016-09-29 14:58:27 -0700 | [diff] [blame] | 432 | Snackbar.make(mRootView, getResources().getQuantityString( |
| 433 | R.plurals.sim_import_success_toast_fmt, count, count), |
| 434 | Snackbar.LENGTH_LONG).show(); |
Marcus Hagerott | 95246bb | 2016-11-11 10:56:09 -0800 | [diff] [blame] | 435 | } else if (code == SimImportService.RESULT_FAILURE) { |
Marcus Hagerott | 819214d | 2016-09-29 14:58:27 -0700 | [diff] [blame] | 436 | Snackbar.make(mRootView, R.string.sim_import_failed_toast, |
| 437 | Snackbar.LENGTH_LONG).show(); |
| 438 | } |
| 439 | } |
| 440 | } |
Yorke Lee | b3d841a | 2014-07-10 11:38:55 -0700 | [diff] [blame] | 441 | } |
| 442 | |