Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2007 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 | |
| 17 | package com.android.contacts.activities; |
| 18 | |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 19 | import android.app.Fragment; |
Jay Shrauner | 1d815e6 | 2014-01-31 10:37:31 -0800 | [diff] [blame] | 20 | import android.content.ActivityNotFoundException; |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 21 | import android.content.Intent; |
| 22 | import android.net.Uri; |
| 23 | import android.os.Bundle; |
| 24 | import android.provider.ContactsContract.Contacts; |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 25 | import android.support.v7.widget.Toolbar; |
Dmitri Plotnikov | 4d174aa | 2010-10-25 15:38:54 -0700 | [diff] [blame] | 26 | import android.text.TextUtils; |
Daisuke Miyakawa | a8729cd | 2011-10-12 12:27:16 -0700 | [diff] [blame] | 27 | import android.util.Log; |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 28 | import android.view.Menu; |
| 29 | import android.view.MenuInflater; |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 30 | import android.view.MenuItem; |
| 31 | import android.view.View; |
Dmitri Plotnikov | 63c311a | 2010-12-08 09:29:24 -0800 | [diff] [blame] | 32 | import android.view.View.OnClickListener; |
Daisuke Miyakawa | a8729cd | 2011-10-12 12:27:16 -0700 | [diff] [blame] | 33 | import android.view.View.OnFocusChangeListener; |
Wenyi Wang | f5493a6 | 2016-07-11 14:28:52 -0700 | [diff] [blame] | 34 | import android.widget.TextView; |
Jay Shrauner | 1d815e6 | 2014-01-31 10:37:31 -0800 | [diff] [blame] | 35 | import android.widget.Toast; |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 36 | |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 37 | import com.android.contacts.AppCompatContactsActivity; |
Chiao Cheng | e0b2f1e | 2012-06-12 13:07:56 -0700 | [diff] [blame] | 38 | import com.android.contacts.R; |
Brian Attwell | bdd3264 | 2015-05-08 17:03:15 -0700 | [diff] [blame] | 39 | import com.android.contacts.common.activity.RequestPermissionsActivity; |
Chiao Cheng | 821a657 | 2012-12-04 17:42:52 -0800 | [diff] [blame] | 40 | import com.android.contacts.common.list.ContactEntryListFragment; |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 41 | import com.android.contacts.common.list.DirectoryListLoader; |
| 42 | import com.android.contacts.common.list.OnPhoneNumberPickerActionListener; |
| 43 | import com.android.contacts.common.list.PhoneNumberPickerFragment; |
Walter Jang | 6158b81 | 2016-07-19 15:59:51 -0700 | [diff] [blame] | 44 | import com.android.contacts.common.logging.ListEvent; |
John Shao | 41c6886 | 2016-08-17 21:02:41 -0700 | [diff] [blame] | 45 | import com.android.contacts.common.util.ImplicitIntentsUtil; |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 46 | import com.android.contacts.common.util.ViewUtil; |
Walter Jang | ac679af | 2015-06-01 12:17:06 -0700 | [diff] [blame] | 47 | import com.android.contacts.editor.EditorIntents; |
Chiao Cheng | e0b2f1e | 2012-06-12 13:07:56 -0700 | [diff] [blame] | 48 | import com.android.contacts.list.ContactPickerFragment; |
| 49 | import com.android.contacts.list.ContactsIntentResolver; |
| 50 | import com.android.contacts.list.ContactsRequest; |
Chiao Cheng | e0b2f1e | 2012-06-12 13:07:56 -0700 | [diff] [blame] | 51 | import com.android.contacts.list.EmailAddressPickerFragment; |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 52 | import com.android.contacts.list.GroupMemberPickerFragment; |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 53 | import com.android.contacts.list.JoinContactListFragment; |
Chiao Cheng | a953aa7 | 2012-12-04 17:04:48 -0800 | [diff] [blame] | 54 | import com.android.contacts.list.LegacyPhoneNumberPickerFragment; |
Sean Midford | ff6f1bb | 2016-10-12 09:48:23 -0700 | [diff] [blame] | 55 | import com.android.contacts.list.MultiSelectEmailAddressesListFragment; |
| 56 | import com.android.contacts.list.MultiSelectPhoneNumbersListFragment; |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 57 | import com.android.contacts.list.MultiSelectContactsListFragment; |
| 58 | import com.android.contacts.list.MultiSelectContactsListFragment.OnCheckBoxListActionListener; |
Chiao Cheng | e0b2f1e | 2012-06-12 13:07:56 -0700 | [diff] [blame] | 59 | import com.android.contacts.list.OnContactPickerActionListener; |
| 60 | import com.android.contacts.list.OnEmailAddressPickerActionListener; |
Chiao Cheng | e0b2f1e | 2012-06-12 13:07:56 -0700 | [diff] [blame] | 61 | import com.android.contacts.list.OnPostalAddressPickerActionListener; |
Chiao Cheng | e0b2f1e | 2012-06-12 13:07:56 -0700 | [diff] [blame] | 62 | import com.android.contacts.list.PostalAddressPickerFragment; |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 63 | import com.android.contacts.list.UiIntentActions; |
Chiao Cheng | e0b2f1e | 2012-06-12 13:07:56 -0700 | [diff] [blame] | 64 | |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 65 | import java.util.ArrayList; |
Katherine Kuan | 37bddc2 | 2011-07-09 17:36:26 -0700 | [diff] [blame] | 66 | |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 67 | /** |
| 68 | * Displays a list of contacts (or phone numbers or postal addresses) for the |
| 69 | * purposes of selecting one. |
| 70 | */ |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 71 | public class ContactSelectionActivity extends AppCompatContactsActivity implements |
| 72 | View.OnCreateContextMenuListener, ActionBarAdapter.Listener, OnClickListener, |
| 73 | OnFocusChangeListener, OnCheckBoxListActionListener { |
| 74 | private static final String TAG = "ContactSelection"; |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 75 | |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 76 | private static final String KEY_ACTION_CODE = "actionCode"; |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 77 | private static final String KEY_SEARCH_MODE = "searchMode"; |
Dmitri Plotnikov | 4d174aa | 2010-10-25 15:38:54 -0700 | [diff] [blame] | 78 | private static final int DEFAULT_DIRECTORY_RESULT_LIMIT = 20; |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 79 | |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 80 | private ContactsIntentResolver mIntentResolver; |
| 81 | protected ContactEntryListFragment<?> mListFragment; |
| 82 | |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 83 | private int mActionCode = -1; |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 84 | private boolean mIsSearchMode; |
Brian Attwell | fde48de | 2014-11-21 11:01:31 -0800 | [diff] [blame] | 85 | private boolean mIsSearchSupported; |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 86 | |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 87 | private ContactsRequest mRequest; |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 88 | |
| 89 | private ActionBarAdapter mActionBarAdapter; |
| 90 | private Toolbar mToolbar; |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 91 | |
| 92 | public ContactSelectionActivity() { |
| 93 | mIntentResolver = new ContactsIntentResolver(this); |
| 94 | } |
| 95 | |
| 96 | @Override |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 97 | public void onAttachFragment(Fragment fragment) { |
| 98 | if (fragment instanceof ContactEntryListFragment<?>) { |
| 99 | mListFragment = (ContactEntryListFragment<?>) fragment; |
| 100 | setupActionListener(); |
| 101 | } |
| 102 | } |
| 103 | |
| 104 | @Override |
| 105 | protected void onCreate(Bundle savedState) { |
| 106 | super.onCreate(savedState); |
| 107 | |
Brian Attwell | bdd3264 | 2015-05-08 17:03:15 -0700 | [diff] [blame] | 108 | if (RequestPermissionsActivity.startPermissionActivity(this)) { |
| 109 | return; |
| 110 | } |
| 111 | |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 112 | if (savedState != null) { |
| 113 | mActionCode = savedState.getInt(KEY_ACTION_CODE); |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 114 | mIsSearchMode = savedState.getBoolean(KEY_SEARCH_MODE); |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 115 | } |
Katherine Kuan | acd8e8b | 2011-10-21 12:35:55 -0700 | [diff] [blame] | 116 | |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 117 | // Extract relevant information from the intent |
| 118 | mRequest = mIntentResolver.resolveIntent(getIntent()); |
| 119 | if (!mRequest.isValid()) { |
| 120 | setResult(RESULT_CANCELED); |
| 121 | finish(); |
| 122 | return; |
| 123 | } |
| 124 | |
Dmitri Plotnikov | 4d174aa | 2010-10-25 15:38:54 -0700 | [diff] [blame] | 125 | setContentView(R.layout.contact_picker); |
| 126 | |
Daisuke Miyakawa | a8729cd | 2011-10-12 12:27:16 -0700 | [diff] [blame] | 127 | if (mActionCode != mRequest.getActionCode()) { |
| 128 | mActionCode = mRequest.getActionCode(); |
| 129 | configureListFragment(); |
| 130 | } |
Dmitri Plotnikov | 4d174aa | 2010-10-25 15:38:54 -0700 | [diff] [blame] | 131 | |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 132 | prepareSearchViewAndActionBar(savedState); |
| 133 | configureActivityTitle(); |
Daisuke Miyakawa | a8729cd | 2011-10-12 12:27:16 -0700 | [diff] [blame] | 134 | } |
| 135 | |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 136 | public boolean isSelectionMode() { |
| 137 | return mActionBarAdapter.isSelectionMode(); |
| 138 | } |
| 139 | |
| 140 | public boolean isSearchMode() { |
| 141 | return mActionBarAdapter.isSearchMode(); |
| 142 | } |
| 143 | |
| 144 | private void prepareSearchViewAndActionBar(Bundle savedState) { |
| 145 | mToolbar = getView(R.id.toolbar); |
| 146 | setSupportActionBar(mToolbar); |
| 147 | |
| 148 | // Add a shadow under the toolbar. |
| 149 | ViewUtil.addRectangularOutlineProvider(findViewById(R.id.toolbar_parent), getResources()); |
| 150 | |
Wenyi Wang | ca6018d | 2016-08-18 17:23:13 -0700 | [diff] [blame] | 151 | mActionBarAdapter = new ActionBarAdapter(this, this, getSupportActionBar(), mToolbar, |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 152 | R.string.enter_contact_name); |
| 153 | mActionBarAdapter.setShowHomeIcon(true); |
| 154 | mActionBarAdapter.setShowHomeAsUp(true); |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 155 | mActionBarAdapter.initialize(savedState, mRequest); |
Brian Attwell | bbd2201 | 2014-07-16 15:59:10 -0700 | [diff] [blame] | 156 | |
Walter Jang | 16c2959 | 2016-06-14 15:34:39 -0700 | [diff] [blame] | 157 | // Postal address pickers (and legacy pickers) don't support search, so just show |
Daniel Lehmann | d1af8ad | 2011-11-08 17:19:51 -0800 | [diff] [blame] | 158 | // "HomeAsUp" button and title. |
Sean Midford | ff6f1bb | 2016-10-12 09:48:23 -0700 | [diff] [blame] | 159 | mIsSearchSupported = mRequest.getActionCode() != ContactsRequest.ACTION_PICK_POSTAL |
| 160 | && mRequest.getActionCode() != ContactsRequest.ACTION_PICK_EMAILS |
| 161 | && mRequest.getActionCode() != ContactsRequest.ACTION_PICK_PHONES |
| 162 | && !mRequest.isLegacyCompatibilityMode(); |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 163 | configureSearchMode(); |
| 164 | } |
| 165 | |
| 166 | private void configureSearchMode() { |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 167 | mActionBarAdapter.setSearchMode(mIsSearchMode); |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 168 | invalidateOptionsMenu(); |
Daisuke Miyakawa | a8729cd | 2011-10-12 12:27:16 -0700 | [diff] [blame] | 169 | } |
Dmitri Plotnikov | 63c311a | 2010-12-08 09:29:24 -0800 | [diff] [blame] | 170 | |
Daisuke Miyakawa | a8729cd | 2011-10-12 12:27:16 -0700 | [diff] [blame] | 171 | @Override |
Daisuke Miyakawa | a8729cd | 2011-10-12 12:27:16 -0700 | [diff] [blame] | 172 | public boolean onOptionsItemSelected(MenuItem item) { |
| 173 | switch (item.getItemId()) { |
| 174 | case android.R.id.home: |
| 175 | // Go back to previous screen, intending "cancel" |
| 176 | setResult(RESULT_CANCELED); |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 177 | onBackPressed(); |
| 178 | return true; |
| 179 | case R.id.menu_search: |
| 180 | mIsSearchMode = !mIsSearchMode; |
| 181 | configureSearchMode(); |
Daisuke Miyakawa | a8729cd | 2011-10-12 12:27:16 -0700 | [diff] [blame] | 182 | return true; |
Daisuke Miyakawa | a8729cd | 2011-10-12 12:27:16 -0700 | [diff] [blame] | 183 | } |
| 184 | return super.onOptionsItemSelected(item); |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 185 | } |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 186 | |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 187 | @Override |
| 188 | protected void onSaveInstanceState(Bundle outState) { |
| 189 | super.onSaveInstanceState(outState); |
| 190 | outState.putInt(KEY_ACTION_CODE, mActionCode); |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 191 | outState.putBoolean(KEY_SEARCH_MODE, mIsSearchMode); |
Walter Jang | 0ef0518 | 2016-06-23 15:34:15 -0700 | [diff] [blame] | 192 | if (mActionBarAdapter != null) { |
| 193 | mActionBarAdapter.onSaveInstanceState(outState); |
| 194 | } |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 195 | } |
| 196 | |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 197 | private void configureActivityTitle() { |
Makoto Onuki | b7a1da6 | 2012-11-27 15:40:38 -0800 | [diff] [blame] | 198 | if (!TextUtils.isEmpty(mRequest.getActivityTitle())) { |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 199 | getSupportActionBar().setTitle(mRequest.getActivityTitle()); |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 200 | return; |
| 201 | } |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 202 | int titleResId = -1; |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 203 | int actionCode = mRequest.getActionCode(); |
| 204 | switch (actionCode) { |
| 205 | case ContactsRequest.ACTION_INSERT_OR_EDIT_CONTACT: { |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 206 | titleResId = R.string.contactInsertOrEditActivityTitle; |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 207 | break; |
| 208 | } |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 209 | case ContactsRequest.ACTION_PICK_CONTACT: { |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 210 | titleResId = R.string.contactPickerActivityTitle; |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 211 | break; |
| 212 | } |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 213 | case ContactsRequest.ACTION_PICK_OR_CREATE_CONTACT: { |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 214 | titleResId = R.string.contactPickerActivityTitle; |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 215 | break; |
| 216 | } |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 217 | case ContactsRequest.ACTION_CREATE_SHORTCUT_CONTACT: { |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 218 | titleResId = R.string.shortcutActivityTitle; |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 219 | break; |
| 220 | } |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 221 | case ContactsRequest.ACTION_PICK_PHONE: { |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 222 | titleResId = R.string.contactPickerActivityTitle; |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 223 | break; |
| 224 | } |
Daniel Lehmann | c86ace7 | 2011-03-23 21:04:29 -0700 | [diff] [blame] | 225 | case ContactsRequest.ACTION_PICK_EMAIL: { |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 226 | titleResId = R.string.contactPickerActivityTitle; |
Daniel Lehmann | c86ace7 | 2011-03-23 21:04:29 -0700 | [diff] [blame] | 227 | break; |
| 228 | } |
Sean Midford | ff6f1bb | 2016-10-12 09:48:23 -0700 | [diff] [blame] | 229 | case ContactsRequest.ACTION_PICK_PHONES: { |
| 230 | titleResId = R.string.pickerSelectContactsActivityTitle; |
| 231 | break; |
| 232 | } |
| 233 | case ContactsRequest.ACTION_PICK_EMAILS: { |
| 234 | titleResId = R.string.pickerSelectContactsActivityTitle; |
| 235 | break; |
| 236 | } |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 237 | case ContactsRequest.ACTION_CREATE_SHORTCUT_CALL: { |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 238 | titleResId = R.string.callShortcutActivityTitle; |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 239 | break; |
| 240 | } |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 241 | case ContactsRequest.ACTION_CREATE_SHORTCUT_SMS: { |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 242 | titleResId = R.string.messageShortcutActivityTitle; |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 243 | break; |
| 244 | } |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 245 | case ContactsRequest.ACTION_PICK_POSTAL: { |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 246 | titleResId = R.string.contactPickerActivityTitle; |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 247 | break; |
| 248 | } |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 249 | case ContactsRequest.ACTION_PICK_JOIN: { |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 250 | titleResId = R.string.titleJoinContactDataWith; |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 251 | break; |
| 252 | } |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 253 | case ContactsRequest.ACTION_PICK_GROUP_MEMBERS: { |
Walter Jang | ec807e1 | 2016-06-27 12:10:40 -0700 | [diff] [blame] | 254 | titleResId = R.string.groupMemberPickerActivityTitle; |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 255 | break; |
| 256 | } |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 257 | } |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 258 | if (titleResId > 0) { |
| 259 | getSupportActionBar().setTitle(titleResId); |
| 260 | } |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 261 | } |
| 262 | |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 263 | /** |
| 264 | * Creates the fragment based on the current request. |
| 265 | */ |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 266 | public void configureListFragment() { |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 267 | switch (mActionCode) { |
| 268 | case ContactsRequest.ACTION_INSERT_OR_EDIT_CONTACT: { |
Dmitri Plotnikov | 8609252 | 2010-10-27 17:03:52 -0700 | [diff] [blame] | 269 | ContactPickerFragment fragment = new ContactPickerFragment(); |
Dmitri Plotnikov | 8609252 | 2010-10-27 17:03:52 -0700 | [diff] [blame] | 270 | fragment.setEditMode(true); |
| 271 | fragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE); |
Brian Attwell | bbd2201 | 2014-07-16 15:59:10 -0700 | [diff] [blame] | 272 | fragment.setCreateContactEnabled(!mRequest.isSearchMode()); |
Walter Jang | 6158b81 | 2016-07-19 15:59:51 -0700 | [diff] [blame] | 273 | fragment.setListType(ListEvent.ListType.PICK_CONTACT); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 274 | mListFragment = fragment; |
| 275 | break; |
| 276 | } |
| 277 | |
Jay Shrauner | 98609ec | 2014-01-10 11:26:14 -0800 | [diff] [blame] | 278 | case ContactsRequest.ACTION_DEFAULT: |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 279 | case ContactsRequest.ACTION_PICK_CONTACT: { |
| 280 | ContactPickerFragment fragment = new ContactPickerFragment(); |
Wenyi Wang | 7b6bb00 | 2016-04-11 12:40:28 -0700 | [diff] [blame] | 281 | fragment.setIncludeFavorites(mRequest.shouldIncludeFavorites()); |
Walter Jang | 6158b81 | 2016-07-19 15:59:51 -0700 | [diff] [blame] | 282 | fragment.setListType(ListEvent.ListType.PICK_CONTACT); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 283 | mListFragment = fragment; |
| 284 | break; |
| 285 | } |
| 286 | |
| 287 | case ContactsRequest.ACTION_PICK_OR_CREATE_CONTACT: { |
| 288 | ContactPickerFragment fragment = new ContactPickerFragment(); |
Brian Attwell | bbd2201 | 2014-07-16 15:59:10 -0700 | [diff] [blame] | 289 | fragment.setCreateContactEnabled(!mRequest.isSearchMode()); |
Walter Jang | 6158b81 | 2016-07-19 15:59:51 -0700 | [diff] [blame] | 290 | fragment.setListType(ListEvent.ListType.PICK_CONTACT); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 291 | mListFragment = fragment; |
| 292 | break; |
| 293 | } |
| 294 | |
| 295 | case ContactsRequest.ACTION_CREATE_SHORTCUT_CONTACT: { |
| 296 | ContactPickerFragment fragment = new ContactPickerFragment(); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 297 | fragment.setShortcutRequested(true); |
Walter Jang | 6158b81 | 2016-07-19 15:59:51 -0700 | [diff] [blame] | 298 | fragment.setListType(ListEvent.ListType.PICK_CONTACT_FOR_SHORTCUT); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 299 | mListFragment = fragment; |
| 300 | break; |
| 301 | } |
| 302 | |
| 303 | case ContactsRequest.ACTION_PICK_PHONE: { |
Chiao Cheng | a953aa7 | 2012-12-04 17:04:48 -0800 | [diff] [blame] | 304 | PhoneNumberPickerFragment fragment = getPhoneNumberPickerFragment(mRequest); |
Walter Jang | 6158b81 | 2016-07-19 15:59:51 -0700 | [diff] [blame] | 305 | fragment.setListType(ListEvent.ListType.PICK_PHONE); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 306 | mListFragment = fragment; |
| 307 | break; |
| 308 | } |
| 309 | |
Daniel Lehmann | c86ace7 | 2011-03-23 21:04:29 -0700 | [diff] [blame] | 310 | case ContactsRequest.ACTION_PICK_EMAIL: { |
| 311 | mListFragment = new EmailAddressPickerFragment(); |
Walter Jang | 6158b81 | 2016-07-19 15:59:51 -0700 | [diff] [blame] | 312 | mListFragment.setListType(ListEvent.ListType.PICK_EMAIL); |
Daniel Lehmann | c86ace7 | 2011-03-23 21:04:29 -0700 | [diff] [blame] | 313 | break; |
| 314 | } |
| 315 | |
Sean Midford | ff6f1bb | 2016-10-12 09:48:23 -0700 | [diff] [blame] | 316 | case ContactsRequest.ACTION_PICK_PHONES: { |
| 317 | mListFragment = new MultiSelectPhoneNumbersListFragment(); |
| 318 | mListFragment.setArguments(getIntent().getExtras()); |
| 319 | break; |
| 320 | } |
| 321 | |
| 322 | case ContactsRequest.ACTION_PICK_EMAILS: { |
| 323 | mListFragment = new MultiSelectEmailAddressesListFragment(); |
| 324 | mListFragment.setArguments(getIntent().getExtras()); |
| 325 | break; |
| 326 | } |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 327 | case ContactsRequest.ACTION_CREATE_SHORTCUT_CALL: { |
Chiao Cheng | a953aa7 | 2012-12-04 17:04:48 -0800 | [diff] [blame] | 328 | PhoneNumberPickerFragment fragment = getPhoneNumberPickerFragment(mRequest); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 329 | fragment.setShortcutAction(Intent.ACTION_CALL); |
Walter Jang | 6158b81 | 2016-07-19 15:59:51 -0700 | [diff] [blame] | 330 | fragment.setListType(ListEvent.ListType.PICK_CONTACT_FOR_SHORTCUT); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 331 | mListFragment = fragment; |
| 332 | break; |
| 333 | } |
| 334 | |
| 335 | case ContactsRequest.ACTION_CREATE_SHORTCUT_SMS: { |
Chiao Cheng | a953aa7 | 2012-12-04 17:04:48 -0800 | [diff] [blame] | 336 | PhoneNumberPickerFragment fragment = getPhoneNumberPickerFragment(mRequest); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 337 | fragment.setShortcutAction(Intent.ACTION_SENDTO); |
Walter Jang | 6158b81 | 2016-07-19 15:59:51 -0700 | [diff] [blame] | 338 | fragment.setListType(ListEvent.ListType.PICK_CONTACT_FOR_SHORTCUT); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 339 | mListFragment = fragment; |
| 340 | break; |
| 341 | } |
| 342 | |
| 343 | case ContactsRequest.ACTION_PICK_POSTAL: { |
| 344 | PostalAddressPickerFragment fragment = new PostalAddressPickerFragment(); |
Walter Jang | 6158b81 | 2016-07-19 15:59:51 -0700 | [diff] [blame] | 345 | fragment.setListType(ListEvent.ListType.PICK_POSTAL); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 346 | mListFragment = fragment; |
| 347 | break; |
| 348 | } |
| 349 | |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 350 | case ContactsRequest.ACTION_PICK_JOIN: { |
| 351 | JoinContactListFragment joinFragment = new JoinContactListFragment(); |
| 352 | joinFragment.setTargetContactId(getTargetContactId()); |
Walter Jang | 6158b81 | 2016-07-19 15:59:51 -0700 | [diff] [blame] | 353 | joinFragment.setListType(ListEvent.ListType.PICK_JOIN); |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 354 | mListFragment = joinFragment; |
| 355 | break; |
| 356 | } |
| 357 | |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 358 | case ContactsRequest.ACTION_PICK_GROUP_MEMBERS: { |
Walter Jang | 6c5a558 | 2016-06-16 11:26:53 -0700 | [diff] [blame] | 359 | final String accountName = getIntent().getStringExtra( |
| 360 | UiIntentActions.GROUP_ACCOUNT_NAME); |
| 361 | final String accountType = getIntent().getStringExtra( |
| 362 | UiIntentActions.GROUP_ACCOUNT_TYPE); |
| 363 | final String accountDataSet = getIntent().getStringExtra( |
| 364 | UiIntentActions.GROUP_ACCOUNT_DATA_SET); |
Walter Jang | 16c2959 | 2016-06-14 15:34:39 -0700 | [diff] [blame] | 365 | final ArrayList<String> contactIds = getIntent().getStringArrayListExtra( |
| 366 | UiIntentActions.GROUP_CONTACT_IDS); |
Walter Jang | 6c5a558 | 2016-06-16 11:26:53 -0700 | [diff] [blame] | 367 | mListFragment = GroupMemberPickerFragment.newInstance( |
| 368 | accountName, accountType, accountDataSet, contactIds); |
Walter Jang | 6158b81 | 2016-07-19 15:59:51 -0700 | [diff] [blame] | 369 | mListFragment.setListType(ListEvent.ListType.PICK_GROUP_MEMBERS); |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 370 | break; |
| 371 | } |
| 372 | |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 373 | default: |
| 374 | throw new IllegalStateException("Invalid action code: " + mActionCode); |
| 375 | } |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 376 | |
Chiao Cheng | a953aa7 | 2012-12-04 17:04:48 -0800 | [diff] [blame] | 377 | // Setting compatibility is no longer needed for PhoneNumberPickerFragment since that logic |
| 378 | // has been separated into LegacyPhoneNumberPickerFragment. But we still need to set |
| 379 | // compatibility for other fragments. |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 380 | mListFragment.setLegacyCompatibilityMode(mRequest.isLegacyCompatibilityMode()); |
Dmitri Plotnikov | 4d174aa | 2010-10-25 15:38:54 -0700 | [diff] [blame] | 381 | mListFragment.setDirectoryResultLimit(DEFAULT_DIRECTORY_RESULT_LIMIT); |
| 382 | |
Dianne Hackborn | 3ed426c | 2011-01-17 12:30:32 -0800 | [diff] [blame] | 383 | getFragmentManager().beginTransaction() |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 384 | .replace(R.id.list_container, mListFragment) |
Minh Pham | 4b25da7 | 2011-08-25 13:50:38 -0700 | [diff] [blame] | 385 | .commitAllowingStateLoss(); |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 386 | } |
| 387 | |
Chiao Cheng | a953aa7 | 2012-12-04 17:04:48 -0800 | [diff] [blame] | 388 | private PhoneNumberPickerFragment getPhoneNumberPickerFragment(ContactsRequest request) { |
| 389 | if (mRequest.isLegacyCompatibilityMode()) { |
| 390 | return new LegacyPhoneNumberPickerFragment(); |
| 391 | } else { |
| 392 | return new PhoneNumberPickerFragment(); |
| 393 | } |
| 394 | } |
| 395 | |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 396 | public void setupActionListener() { |
Dmitri Plotnikov | 6e850a0 | 2010-10-28 10:46:21 -0700 | [diff] [blame] | 397 | if (mListFragment instanceof ContactPickerFragment) { |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 398 | ((ContactPickerFragment) mListFragment).setOnContactPickerActionListener( |
| 399 | new ContactPickerActionListener()); |
| 400 | } else if (mListFragment instanceof PhoneNumberPickerFragment) { |
| 401 | ((PhoneNumberPickerFragment) mListFragment).setOnPhoneNumberPickerActionListener( |
| 402 | new PhoneNumberPickerActionListener()); |
| 403 | } else if (mListFragment instanceof PostalAddressPickerFragment) { |
| 404 | ((PostalAddressPickerFragment) mListFragment).setOnPostalAddressPickerActionListener( |
| 405 | new PostalAddressPickerActionListener()); |
Daniel Lehmann | c86ace7 | 2011-03-23 21:04:29 -0700 | [diff] [blame] | 406 | } else if (mListFragment instanceof EmailAddressPickerFragment) { |
| 407 | ((EmailAddressPickerFragment) mListFragment).setOnEmailAddressPickerActionListener( |
| 408 | new EmailAddressPickerActionListener()); |
Sean Midford | ff6f1bb | 2016-10-12 09:48:23 -0700 | [diff] [blame] | 409 | } else if (mListFragment instanceof MultiSelectEmailAddressesListFragment) { |
| 410 | ((MultiSelectEmailAddressesListFragment) mListFragment).setCheckBoxListListener(this); |
| 411 | } else if (mListFragment instanceof MultiSelectPhoneNumbersListFragment) { |
| 412 | ((MultiSelectPhoneNumbersListFragment) mListFragment).setCheckBoxListListener(this); |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 413 | } else if (mListFragment instanceof JoinContactListFragment) { |
| 414 | ((JoinContactListFragment) mListFragment).setOnContactPickerActionListener( |
| 415 | new JoinContactActionListener()); |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 416 | } else if (mListFragment instanceof GroupMemberPickerFragment) { |
| 417 | ((GroupMemberPickerFragment) mListFragment).setListener( |
| 418 | new GroupMemberPickerListener()); |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 419 | getMultiSelectListFragment().setCheckBoxListListener(this); |
Dmitri Plotnikov | 84b3cc7 | 2010-10-11 18:19:51 -0700 | [diff] [blame] | 420 | } else { |
| 421 | throw new IllegalStateException("Unsupported list fragment type: " + mListFragment); |
| 422 | } |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 423 | } |
| 424 | |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 425 | private MultiSelectContactsListFragment getMultiSelectListFragment() { |
| 426 | if (mListFragment instanceof MultiSelectContactsListFragment) { |
| 427 | return (MultiSelectContactsListFragment) mListFragment; |
| 428 | } |
| 429 | return null; |
| 430 | } |
| 431 | |
| 432 | @Override |
| 433 | public void onAction(int action) { |
| 434 | switch (action) { |
| 435 | case ActionBarAdapter.Listener.Action.START_SEARCH_MODE: |
| 436 | mIsSearchMode = true; |
| 437 | configureSearchMode(); |
| 438 | break; |
| 439 | case ActionBarAdapter.Listener.Action.CHANGE_SEARCH_QUERY: |
| 440 | final String queryString = mActionBarAdapter.getQueryString(); |
| 441 | mListFragment.setQueryString(queryString, /* delaySelection */ false); |
| 442 | break; |
| 443 | case ActionBarAdapter.Listener.Action.START_SELECTION_MODE: |
| 444 | if (getMultiSelectListFragment() != null) { |
| 445 | getMultiSelectListFragment().displayCheckBoxes(true); |
| 446 | } |
| 447 | invalidateOptionsMenu(); |
| 448 | break; |
| 449 | case ActionBarAdapter.Listener.Action.STOP_SEARCH_AND_SELECTION_MODE: |
Wenyi Wang | b236b7c | 2016-06-23 08:59:19 -0700 | [diff] [blame] | 450 | mListFragment.setQueryString("", /* delaySelection */ false); |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 451 | mActionBarAdapter.setSearchMode(false); |
| 452 | if (getMultiSelectListFragment() != null) { |
| 453 | getMultiSelectListFragment().displayCheckBoxes(false); |
| 454 | } |
| 455 | invalidateOptionsMenu(); |
| 456 | break; |
| 457 | } |
| 458 | } |
| 459 | |
| 460 | @Override |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 461 | public void onUpButtonPressed() { |
| 462 | onBackPressed(); |
| 463 | } |
| 464 | |
| 465 | @Override |
| 466 | public void onStartDisplayingCheckBoxes() { |
| 467 | mActionBarAdapter.setSelectionMode(true); |
| 468 | } |
| 469 | |
| 470 | @Override |
| 471 | public void onSelectedContactIdsChanged() { |
| 472 | if (mListFragment instanceof MultiSelectContactsListFragment) { |
Wenyi Wang | f5493a6 | 2016-07-11 14:28:52 -0700 | [diff] [blame] | 473 | final int count = getMultiSelectListFragment().getSelectedContactIds().size(); |
| 474 | mActionBarAdapter.setSelectionCount(count); |
| 475 | updateAddContactsButton(count); |
| 476 | |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 477 | // Show or hide the multi select "Done" button |
| 478 | invalidateOptionsMenu(); |
| 479 | } |
| 480 | } |
| 481 | |
Wenyi Wang | f5493a6 | 2016-07-11 14:28:52 -0700 | [diff] [blame] | 482 | private void updateAddContactsButton(int count) { |
| 483 | final TextView textView = (TextView) mActionBarAdapter.getSelectionContainer() |
| 484 | .findViewById(R.id.add_contacts); |
| 485 | if (count > 0) { |
| 486 | textView.setVisibility(View.VISIBLE); |
| 487 | textView.setAllCaps(true); |
| 488 | textView.setOnClickListener(new OnClickListener() { |
| 489 | @Override |
| 490 | public void onClick(View v) { |
| 491 | final long[] contactIds = |
| 492 | getMultiSelectListFragment().getSelectedContactIdsArray(); |
| 493 | returnSelectedContacts(contactIds); |
| 494 | } |
| 495 | }); |
| 496 | } else { |
| 497 | textView.setVisibility(View.GONE); |
| 498 | } |
| 499 | } |
| 500 | |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 501 | @Override |
| 502 | public void onStopDisplayingCheckBoxes() { |
| 503 | mActionBarAdapter.setSelectionMode(false); |
| 504 | } |
| 505 | |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 506 | private final class ContactPickerActionListener implements OnContactPickerActionListener { |
Daniel Lehmann | e20d343 | 2010-10-10 18:37:51 -0700 | [diff] [blame] | 507 | @Override |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 508 | public void onCreateNewContactAction() { |
Daisuke Miyakawa | a8729cd | 2011-10-12 12:27:16 -0700 | [diff] [blame] | 509 | startCreateNewContactActivity(); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 510 | } |
| 511 | |
Daniel Lehmann | e20d343 | 2010-10-10 18:37:51 -0700 | [diff] [blame] | 512 | @Override |
Dmitri Plotnikov | 8609252 | 2010-10-27 17:03:52 -0700 | [diff] [blame] | 513 | public void onEditContactAction(Uri contactLookupUri) { |
Gary Mai | 363af60 | 2016-09-28 10:01:23 -0700 | [diff] [blame] | 514 | startActivityAndForwardResult(EditorIntents.createEditContactIntent( |
John Shao | 41c6886 | 2016-08-17 21:02:41 -0700 | [diff] [blame] | 515 | ContactSelectionActivity.this, contactLookupUri, /* materialPalette =*/ null, |
| 516 | /* photoId =*/ -1)); |
Dmitri Plotnikov | 8609252 | 2010-10-27 17:03:52 -0700 | [diff] [blame] | 517 | } |
| 518 | |
| 519 | @Override |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 520 | public void onPickContactAction(Uri contactUri) { |
Dmitri Plotnikov | d11bca2 | 2010-12-08 20:15:17 -0800 | [diff] [blame] | 521 | returnPickerResult(contactUri); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 522 | } |
| 523 | |
Daniel Lehmann | e20d343 | 2010-10-10 18:37:51 -0700 | [diff] [blame] | 524 | @Override |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 525 | public void onShortcutIntentCreated(Intent intent) { |
Dmitri Plotnikov | d11bca2 | 2010-12-08 20:15:17 -0800 | [diff] [blame] | 526 | returnPickerResult(intent); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 527 | } |
| 528 | } |
| 529 | |
| 530 | private final class PhoneNumberPickerActionListener implements |
| 531 | OnPhoneNumberPickerActionListener { |
Daniel Lehmann | e20d343 | 2010-10-10 18:37:51 -0700 | [diff] [blame] | 532 | @Override |
Tyler Gunn | 0a8f973 | 2015-12-15 15:38:54 -0800 | [diff] [blame] | 533 | public void onPickDataUri(Uri dataUri, boolean isVideoCall, int callInitiationType) { |
Dmitri Plotnikov | d11bca2 | 2010-12-08 20:15:17 -0800 | [diff] [blame] | 534 | returnPickerResult(dataUri); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 535 | } |
| 536 | |
Daniel Lehmann | e20d343 | 2010-10-10 18:37:51 -0700 | [diff] [blame] | 537 | @Override |
Anne Rong | a6e7230 | 2015-09-29 15:16:47 -0700 | [diff] [blame] | 538 | public void onPickPhoneNumber(String phoneNumber, boolean isVideoCall, |
| 539 | int callInitiationType) { |
Andrew Lee | 86c224e | 2014-07-02 11:09:28 -0700 | [diff] [blame] | 540 | Log.w(TAG, "Unsupported call."); |
| 541 | } |
| 542 | |
| 543 | @Override |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 544 | public void onShortcutIntentCreated(Intent intent) { |
Dmitri Plotnikov | d11bca2 | 2010-12-08 20:15:17 -0800 | [diff] [blame] | 545 | returnPickerResult(intent); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 546 | } |
Daisuke Miyakawa | 88f70fc | 2011-07-01 12:47:10 -0700 | [diff] [blame] | 547 | |
Yorke Lee | dd3d2a4 | 2015-09-15 13:52:08 -0700 | [diff] [blame] | 548 | @Override |
Daisuke Miyakawa | 88f70fc | 2011-07-01 12:47:10 -0700 | [diff] [blame] | 549 | public void onHomeInActionBarSelected() { |
| 550 | ContactSelectionActivity.this.onBackPressed(); |
| 551 | } |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 552 | } |
| 553 | |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 554 | private final class JoinContactActionListener implements OnContactPickerActionListener { |
| 555 | @Override |
| 556 | public void onPickContactAction(Uri contactUri) { |
| 557 | Intent intent = new Intent(null, contactUri); |
| 558 | setResult(RESULT_OK, intent); |
| 559 | finish(); |
| 560 | } |
| 561 | |
| 562 | @Override |
| 563 | public void onShortcutIntentCreated(Intent intent) { |
| 564 | } |
| 565 | |
| 566 | @Override |
| 567 | public void onCreateNewContactAction() { |
| 568 | } |
| 569 | |
| 570 | @Override |
| 571 | public void onEditContactAction(Uri contactLookupUri) { |
| 572 | } |
| 573 | } |
| 574 | |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 575 | private final class GroupMemberPickerListener implements GroupMemberPickerFragment.Listener { |
| 576 | |
| 577 | @Override |
Walter Jang | 16c2959 | 2016-06-14 15:34:39 -0700 | [diff] [blame] | 578 | public void onGroupMemberClicked(long contactId) { |
| 579 | final Intent intent = new Intent(); |
| 580 | intent.putExtra(UiIntentActions.TARGET_CONTACT_ID_EXTRA_KEY, contactId); |
| 581 | returnPickerResult(intent); |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 582 | } |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 583 | |
| 584 | @Override |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 585 | public void onSelectGroupMembers() { |
| 586 | mActionBarAdapter.setSelectionMode(true); |
| 587 | } |
Walter Jang | f9779ef | 2016-05-25 12:23:05 -0700 | [diff] [blame] | 588 | } |
| 589 | |
Wenyi Wang | f5493a6 | 2016-07-11 14:28:52 -0700 | [diff] [blame] | 590 | private void returnSelectedContacts(long[] contactIds) { |
| 591 | final Intent intent = new Intent(); |
| 592 | intent.putExtra(UiIntentActions.TARGET_CONTACT_IDS_EXTRA_KEY, contactIds); |
| 593 | returnPickerResult(intent); |
| 594 | } |
| 595 | |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 596 | private final class PostalAddressPickerActionListener implements |
| 597 | OnPostalAddressPickerActionListener { |
Daniel Lehmann | e20d343 | 2010-10-10 18:37:51 -0700 | [diff] [blame] | 598 | @Override |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 599 | public void onPickPostalAddressAction(Uri dataUri) { |
Dmitri Plotnikov | d11bca2 | 2010-12-08 20:15:17 -0800 | [diff] [blame] | 600 | returnPickerResult(dataUri); |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 601 | } |
| 602 | } |
| 603 | |
Daniel Lehmann | c86ace7 | 2011-03-23 21:04:29 -0700 | [diff] [blame] | 604 | private final class EmailAddressPickerActionListener implements |
| 605 | OnEmailAddressPickerActionListener { |
| 606 | @Override |
| 607 | public void onPickEmailAddressAction(Uri dataUri) { |
| 608 | returnPickerResult(dataUri); |
| 609 | } |
| 610 | } |
| 611 | |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 612 | public void startActivityAndForwardResult(final Intent intent) { |
| 613 | intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); |
| 614 | |
| 615 | // Forward extras to the new activity |
| 616 | Bundle extras = getIntent().getExtras(); |
| 617 | if (extras != null) { |
| 618 | intent.putExtras(extras); |
| 619 | } |
Jay Shrauner | 1d815e6 | 2014-01-31 10:37:31 -0800 | [diff] [blame] | 620 | try { |
John Shao | 41c6886 | 2016-08-17 21:02:41 -0700 | [diff] [blame] | 621 | ImplicitIntentsUtil.startActivityInApp(ContactSelectionActivity.this, intent); |
Jay Shrauner | 1d815e6 | 2014-01-31 10:37:31 -0800 | [diff] [blame] | 622 | } catch (ActivityNotFoundException e) { |
| 623 | Log.e(TAG, "startActivity() failed: " + e); |
| 624 | Toast.makeText(ContactSelectionActivity.this, R.string.missing_app, |
| 625 | Toast.LENGTH_SHORT).show(); |
| 626 | } |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 627 | finish(); |
| 628 | } |
| 629 | |
| 630 | @Override |
Daisuke Miyakawa | a8729cd | 2011-10-12 12:27:16 -0700 | [diff] [blame] | 631 | public void onFocusChange(View view, boolean hasFocus) { |
| 632 | switch (view.getId()) { |
| 633 | case R.id.search_view: { |
| 634 | if (hasFocus) { |
Walter Jang | a489721 | 2016-06-21 19:02:23 -0700 | [diff] [blame] | 635 | mActionBarAdapter.setFocusOnSearchView(); |
Daisuke Miyakawa | a8729cd | 2011-10-12 12:27:16 -0700 | [diff] [blame] | 636 | } |
| 637 | } |
| 638 | } |
| 639 | } |
| 640 | |
Dmitri Plotnikov | d11bca2 | 2010-12-08 20:15:17 -0800 | [diff] [blame] | 641 | public void returnPickerResult(Uri data) { |
| 642 | Intent intent = new Intent(); |
| 643 | intent.setData(data); |
| 644 | returnPickerResult(intent); |
| 645 | } |
| 646 | |
| 647 | public void returnPickerResult(Intent intent) { |
| 648 | intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); |
| 649 | setResult(RESULT_OK, intent); |
| 650 | finish(); |
| 651 | } |
| 652 | |
Dmitri Plotnikov | 63c311a | 2010-12-08 09:29:24 -0800 | [diff] [blame] | 653 | @Override |
Daisuke Miyakawa | a8729cd | 2011-10-12 12:27:16 -0700 | [diff] [blame] | 654 | public void onClick(View view) { |
| 655 | switch (view.getId()) { |
Brian Attwell | 89ee395 | 2014-07-09 16:40:39 -0700 | [diff] [blame] | 656 | case R.id.floating_action_button: { |
Daisuke Miyakawa | a8729cd | 2011-10-12 12:27:16 -0700 | [diff] [blame] | 657 | startCreateNewContactActivity(); |
| 658 | break; |
| 659 | } |
| 660 | } |
| 661 | } |
| 662 | |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 663 | private long getTargetContactId() { |
| 664 | Intent intent = getIntent(); |
Brian Attwell | c3d202c | 2015-01-08 15:01:03 -0800 | [diff] [blame] | 665 | final long targetContactId = intent.getLongExtra( |
| 666 | UiIntentActions.TARGET_CONTACT_ID_EXTRA_KEY, -1); |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 667 | if (targetContactId == -1) { |
| 668 | Log.e(TAG, "Intent " + intent.getAction() + " is missing required extra: " |
Brian Attwell | c3d202c | 2015-01-08 15:01:03 -0800 | [diff] [blame] | 669 | + UiIntentActions.TARGET_CONTACT_ID_EXTRA_KEY); |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 670 | setResult(RESULT_CANCELED); |
| 671 | finish(); |
| 672 | return -1; |
| 673 | } |
| 674 | return targetContactId; |
| 675 | } |
| 676 | |
Daisuke Miyakawa | a8729cd | 2011-10-12 12:27:16 -0700 | [diff] [blame] | 677 | private void startCreateNewContactActivity() { |
| 678 | Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI); |
Gary Mai | 363af60 | 2016-09-28 10:01:23 -0700 | [diff] [blame] | 679 | intent.putExtra(ContactEditorActivity. |
Walter Jang | 8d45cdb | 2016-09-01 09:25:44 -0700 | [diff] [blame] | 680 | INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, true); |
Daisuke Miyakawa | a8729cd | 2011-10-12 12:27:16 -0700 | [diff] [blame] | 681 | startActivityAndForwardResult(intent); |
| 682 | } |
| 683 | |
Katherine Kuan | 37bddc2 | 2011-07-09 17:36:26 -0700 | [diff] [blame] | 684 | @Override |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 685 | public boolean onCreateOptionsMenu(Menu menu) { |
| 686 | super.onCreateOptionsMenu(menu); |
| 687 | |
| 688 | final MenuInflater inflater = getMenuInflater(); |
| 689 | inflater.inflate(R.menu.search_menu, menu); |
| 690 | |
| 691 | final MenuItem searchItem = menu.findItem(R.id.menu_search); |
Brian Attwell | fde48de | 2014-11-21 11:01:31 -0800 | [diff] [blame] | 692 | searchItem.setVisible(!mIsSearchMode && mIsSearchSupported); |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 693 | return true; |
| 694 | } |
| 695 | |
| 696 | @Override |
| 697 | public void onBackPressed() { |
Jay Shrauner | 7712aef | 2015-09-25 14:14:28 -0700 | [diff] [blame] | 698 | if (!isSafeToCommitTransactions()) { |
Jay Shrauner | 35e1745 | 2015-09-16 11:19:23 -0700 | [diff] [blame] | 699 | return; |
| 700 | } |
| 701 | |
Walter Jang | 794dbd0 | 2016-07-28 13:53:13 -0700 | [diff] [blame] | 702 | if (isSelectionMode()) { |
| 703 | mActionBarAdapter.setSelectionMode(false); |
Wenyi Wang | 5a48cd9 | 2016-08-01 16:40:44 -0700 | [diff] [blame] | 704 | if (getMultiSelectListFragment() != null) { |
| 705 | getMultiSelectListFragment().displayCheckBoxes(false); |
| 706 | } |
Walter Jang | 794dbd0 | 2016-07-28 13:53:13 -0700 | [diff] [blame] | 707 | } else if (mIsSearchMode) { |
Brian Attwell | 81cc3b3 | 2014-07-22 16:04:52 -0700 | [diff] [blame] | 708 | mIsSearchMode = false; |
| 709 | configureSearchMode(); |
| 710 | } else { |
| 711 | super.onBackPressed(); |
| 712 | } |
| 713 | } |
Dmitri Plotnikov | b979b42 | 2010-07-01 15:29:15 -0700 | [diff] [blame] | 714 | } |