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