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