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