blob: cbf6a69e00b9f4eda87a0d909cd6596703957db5 [file] [log] [blame]
Dmitri Plotnikovb979b422010-07-01 15:29:15 -07001/*
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
17package com.android.contacts.activities;
18
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -070019import android.app.Fragment;
Jay Shrauner1d815e62014-01-31 10:37:31 -080020import android.content.ActivityNotFoundException;
Dmitri Plotnikovb979b422010-07-01 15:29:15 -070021import android.content.Intent;
22import android.net.Uri;
23import android.os.Bundle;
24import android.provider.ContactsContract.Contacts;
Walter Janga4897212016-06-21 19:02:23 -070025import android.support.v7.widget.Toolbar;
Dmitri Plotnikov4d174aa2010-10-25 15:38:54 -070026import android.text.TextUtils;
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -070027import android.util.Log;
Brian Attwell81cc3b32014-07-22 16:04:52 -070028import android.view.Menu;
29import android.view.MenuInflater;
Dmitri Plotnikovb979b422010-07-01 15:29:15 -070030import android.view.MenuItem;
31import android.view.View;
Dmitri Plotnikov63c311a2010-12-08 09:29:24 -080032import android.view.View.OnClickListener;
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -070033import android.view.View.OnFocusChangeListener;
Wenyi Wangf5493a62016-07-11 14:28:52 -070034import android.widget.TextView;
Jay Shrauner1d815e62014-01-31 10:37:31 -080035import android.widget.Toast;
Dmitri Plotnikovb979b422010-07-01 15:29:15 -070036
Walter Janga4897212016-06-21 19:02:23 -070037import com.android.contacts.AppCompatContactsActivity;
Chiao Chenge0b2f1e2012-06-12 13:07:56 -070038import com.android.contacts.R;
Brian Attwellbdd32642015-05-08 17:03:15 -070039import com.android.contacts.common.activity.RequestPermissionsActivity;
Chiao Cheng821a6572012-12-04 17:42:52 -080040import com.android.contacts.common.list.ContactEntryListFragment;
Walter Janga4897212016-06-21 19:02:23 -070041import com.android.contacts.common.list.DirectoryListLoader;
42import com.android.contacts.common.list.OnPhoneNumberPickerActionListener;
43import com.android.contacts.common.list.PhoneNumberPickerFragment;
Walter Jang6158b812016-07-19 15:59:51 -070044import com.android.contacts.common.logging.ListEvent;
John Shao41c68862016-08-17 21:02:41 -070045import com.android.contacts.common.util.ImplicitIntentsUtil;
Walter Janga4897212016-06-21 19:02:23 -070046import com.android.contacts.common.util.ViewUtil;
Walter Jangac679af2015-06-01 12:17:06 -070047import com.android.contacts.editor.EditorIntents;
Chiao Chenge0b2f1e2012-06-12 13:07:56 -070048import com.android.contacts.list.ContactPickerFragment;
49import com.android.contacts.list.ContactsIntentResolver;
50import com.android.contacts.list.ContactsRequest;
Chiao Chenge0b2f1e2012-06-12 13:07:56 -070051import com.android.contacts.list.EmailAddressPickerFragment;
Walter Janga4897212016-06-21 19:02:23 -070052import com.android.contacts.list.GroupMemberPickerFragment;
Brian Attwell81cc3b32014-07-22 16:04:52 -070053import com.android.contacts.list.JoinContactListFragment;
Chiao Chenga953aa72012-12-04 17:04:48 -080054import com.android.contacts.list.LegacyPhoneNumberPickerFragment;
Sean Midfordff6f1bb2016-10-12 09:48:23 -070055import com.android.contacts.list.MultiSelectEmailAddressesListFragment;
56import com.android.contacts.list.MultiSelectPhoneNumbersListFragment;
Walter Janga4897212016-06-21 19:02:23 -070057import com.android.contacts.list.MultiSelectContactsListFragment;
58import com.android.contacts.list.MultiSelectContactsListFragment.OnCheckBoxListActionListener;
Chiao Chenge0b2f1e2012-06-12 13:07:56 -070059import com.android.contacts.list.OnContactPickerActionListener;
60import com.android.contacts.list.OnEmailAddressPickerActionListener;
Chiao Chenge0b2f1e2012-06-12 13:07:56 -070061import com.android.contacts.list.OnPostalAddressPickerActionListener;
Chiao Chenge0b2f1e2012-06-12 13:07:56 -070062import com.android.contacts.list.PostalAddressPickerFragment;
Walter Janga4897212016-06-21 19:02:23 -070063import com.android.contacts.list.UiIntentActions;
Chiao Chenge0b2f1e2012-06-12 13:07:56 -070064
Walter Jangf9779ef2016-05-25 12:23:05 -070065import java.util.ArrayList;
Katherine Kuan37bddc22011-07-09 17:36:26 -070066
Dmitri Plotnikovb979b422010-07-01 15:29:15 -070067/**
68 * Displays a list of contacts (or phone numbers or postal addresses) for the
69 * purposes of selecting one.
70 */
Walter Janga4897212016-06-21 19:02:23 -070071public class ContactSelectionActivity extends AppCompatContactsActivity implements
72 View.OnCreateContextMenuListener, ActionBarAdapter.Listener, OnClickListener,
73 OnFocusChangeListener, OnCheckBoxListActionListener {
74 private static final String TAG = "ContactSelection";
Dmitri Plotnikovb979b422010-07-01 15:29:15 -070075
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -070076 private static final String KEY_ACTION_CODE = "actionCode";
Brian Attwell81cc3b32014-07-22 16:04:52 -070077 private static final String KEY_SEARCH_MODE = "searchMode";
Dmitri Plotnikov4d174aa2010-10-25 15:38:54 -070078 private static final int DEFAULT_DIRECTORY_RESULT_LIMIT = 20;
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -070079
Dmitri Plotnikovb979b422010-07-01 15:29:15 -070080 private ContactsIntentResolver mIntentResolver;
81 protected ContactEntryListFragment<?> mListFragment;
82
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -070083 private int mActionCode = -1;
Brian Attwell81cc3b32014-07-22 16:04:52 -070084 private boolean mIsSearchMode;
Brian Attwellfde48de2014-11-21 11:01:31 -080085 private boolean mIsSearchSupported;
Dmitri Plotnikovb979b422010-07-01 15:29:15 -070086
Dmitri Plotnikovb979b422010-07-01 15:29:15 -070087 private ContactsRequest mRequest;
Walter Janga4897212016-06-21 19:02:23 -070088
89 private ActionBarAdapter mActionBarAdapter;
90 private Toolbar mToolbar;
Dmitri Plotnikovb979b422010-07-01 15:29:15 -070091
92 public ContactSelectionActivity() {
93 mIntentResolver = new ContactsIntentResolver(this);
94 }
95
96 @Override
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -070097 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 Attwellbdd32642015-05-08 17:03:15 -0700108 if (RequestPermissionsActivity.startPermissionActivity(this)) {
109 return;
110 }
111
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700112 if (savedState != null) {
113 mActionCode = savedState.getInt(KEY_ACTION_CODE);
Brian Attwell81cc3b32014-07-22 16:04:52 -0700114 mIsSearchMode = savedState.getBoolean(KEY_SEARCH_MODE);
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700115 }
Katherine Kuanacd8e8b2011-10-21 12:35:55 -0700116
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700117 // 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 Plotnikov4d174aa2010-10-25 15:38:54 -0700125 setContentView(R.layout.contact_picker);
126
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700127 if (mActionCode != mRequest.getActionCode()) {
128 mActionCode = mRequest.getActionCode();
129 configureListFragment();
130 }
Dmitri Plotnikov4d174aa2010-10-25 15:38:54 -0700131
Walter Janga4897212016-06-21 19:02:23 -0700132 prepareSearchViewAndActionBar(savedState);
133 configureActivityTitle();
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700134 }
135
Walter Janga4897212016-06-21 19:02:23 -0700136 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 Wangca6018d2016-08-18 17:23:13 -0700151 mActionBarAdapter = new ActionBarAdapter(this, this, getSupportActionBar(), mToolbar,
Walter Janga4897212016-06-21 19:02:23 -0700152 R.string.enter_contact_name);
153 mActionBarAdapter.setShowHomeIcon(true);
154 mActionBarAdapter.setShowHomeAsUp(true);
Walter Janga4897212016-06-21 19:02:23 -0700155 mActionBarAdapter.initialize(savedState, mRequest);
Brian Attwellbbd22012014-07-16 15:59:10 -0700156
Walter Jang16c29592016-06-14 15:34:39 -0700157 // Postal address pickers (and legacy pickers) don't support search, so just show
Daniel Lehmannd1af8ad2011-11-08 17:19:51 -0800158 // "HomeAsUp" button and title.
Sean Midfordff6f1bb2016-10-12 09:48:23 -0700159 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 Attwell81cc3b32014-07-22 16:04:52 -0700163 configureSearchMode();
164 }
165
166 private void configureSearchMode() {
Walter Janga4897212016-06-21 19:02:23 -0700167 mActionBarAdapter.setSearchMode(mIsSearchMode);
Brian Attwell81cc3b32014-07-22 16:04:52 -0700168 invalidateOptionsMenu();
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700169 }
Dmitri Plotnikov63c311a2010-12-08 09:29:24 -0800170
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700171 @Override
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700172 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 Attwell81cc3b32014-07-22 16:04:52 -0700177 onBackPressed();
178 return true;
179 case R.id.menu_search:
180 mIsSearchMode = !mIsSearchMode;
181 configureSearchMode();
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700182 return true;
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700183 }
184 return super.onOptionsItemSelected(item);
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700185 }
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700186
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700187 @Override
188 protected void onSaveInstanceState(Bundle outState) {
189 super.onSaveInstanceState(outState);
190 outState.putInt(KEY_ACTION_CODE, mActionCode);
Brian Attwell81cc3b32014-07-22 16:04:52 -0700191 outState.putBoolean(KEY_SEARCH_MODE, mIsSearchMode);
Walter Jang0ef05182016-06-23 15:34:15 -0700192 if (mActionBarAdapter != null) {
193 mActionBarAdapter.onSaveInstanceState(outState);
194 }
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700195 }
196
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700197 private void configureActivityTitle() {
Makoto Onukib7a1da62012-11-27 15:40:38 -0800198 if (!TextUtils.isEmpty(mRequest.getActivityTitle())) {
Walter Janga4897212016-06-21 19:02:23 -0700199 getSupportActionBar().setTitle(mRequest.getActivityTitle());
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700200 return;
201 }
Walter Janga4897212016-06-21 19:02:23 -0700202 int titleResId = -1;
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700203 int actionCode = mRequest.getActionCode();
204 switch (actionCode) {
205 case ContactsRequest.ACTION_INSERT_OR_EDIT_CONTACT: {
Walter Janga4897212016-06-21 19:02:23 -0700206 titleResId = R.string.contactInsertOrEditActivityTitle;
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700207 break;
208 }
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700209 case ContactsRequest.ACTION_PICK_CONTACT: {
Walter Janga4897212016-06-21 19:02:23 -0700210 titleResId = R.string.contactPickerActivityTitle;
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700211 break;
212 }
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700213 case ContactsRequest.ACTION_PICK_OR_CREATE_CONTACT: {
Walter Janga4897212016-06-21 19:02:23 -0700214 titleResId = R.string.contactPickerActivityTitle;
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700215 break;
216 }
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700217 case ContactsRequest.ACTION_CREATE_SHORTCUT_CONTACT: {
Walter Janga4897212016-06-21 19:02:23 -0700218 titleResId = R.string.shortcutActivityTitle;
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700219 break;
220 }
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700221 case ContactsRequest.ACTION_PICK_PHONE: {
Walter Janga4897212016-06-21 19:02:23 -0700222 titleResId = R.string.contactPickerActivityTitle;
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700223 break;
224 }
Daniel Lehmannc86ace72011-03-23 21:04:29 -0700225 case ContactsRequest.ACTION_PICK_EMAIL: {
Walter Janga4897212016-06-21 19:02:23 -0700226 titleResId = R.string.contactPickerActivityTitle;
Daniel Lehmannc86ace72011-03-23 21:04:29 -0700227 break;
228 }
Sean Midfordff6f1bb2016-10-12 09:48:23 -0700229 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 Plotnikov84b3cc72010-10-11 18:19:51 -0700237 case ContactsRequest.ACTION_CREATE_SHORTCUT_CALL: {
Walter Janga4897212016-06-21 19:02:23 -0700238 titleResId = R.string.callShortcutActivityTitle;
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700239 break;
240 }
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700241 case ContactsRequest.ACTION_CREATE_SHORTCUT_SMS: {
Walter Janga4897212016-06-21 19:02:23 -0700242 titleResId = R.string.messageShortcutActivityTitle;
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700243 break;
244 }
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700245 case ContactsRequest.ACTION_PICK_POSTAL: {
Walter Janga4897212016-06-21 19:02:23 -0700246 titleResId = R.string.contactPickerActivityTitle;
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700247 break;
248 }
Brian Attwell81cc3b32014-07-22 16:04:52 -0700249 case ContactsRequest.ACTION_PICK_JOIN: {
Walter Janga4897212016-06-21 19:02:23 -0700250 titleResId = R.string.titleJoinContactDataWith;
Brian Attwell81cc3b32014-07-22 16:04:52 -0700251 break;
252 }
Walter Jangf9779ef2016-05-25 12:23:05 -0700253 case ContactsRequest.ACTION_PICK_GROUP_MEMBERS: {
Walter Jangec807e12016-06-27 12:10:40 -0700254 titleResId = R.string.groupMemberPickerActivityTitle;
Walter Jangf9779ef2016-05-25 12:23:05 -0700255 break;
256 }
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700257 }
Walter Janga4897212016-06-21 19:02:23 -0700258 if (titleResId > 0) {
259 getSupportActionBar().setTitle(titleResId);
260 }
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700261 }
262
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700263 /**
264 * Creates the fragment based on the current request.
265 */
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700266 public void configureListFragment() {
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700267 switch (mActionCode) {
268 case ContactsRequest.ACTION_INSERT_OR_EDIT_CONTACT: {
Dmitri Plotnikov86092522010-10-27 17:03:52 -0700269 ContactPickerFragment fragment = new ContactPickerFragment();
Dmitri Plotnikov86092522010-10-27 17:03:52 -0700270 fragment.setEditMode(true);
271 fragment.setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
Brian Attwellbbd22012014-07-16 15:59:10 -0700272 fragment.setCreateContactEnabled(!mRequest.isSearchMode());
Walter Jang6158b812016-07-19 15:59:51 -0700273 fragment.setListType(ListEvent.ListType.PICK_CONTACT);
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700274 mListFragment = fragment;
275 break;
276 }
277
Jay Shrauner98609ec2014-01-10 11:26:14 -0800278 case ContactsRequest.ACTION_DEFAULT:
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700279 case ContactsRequest.ACTION_PICK_CONTACT: {
280 ContactPickerFragment fragment = new ContactPickerFragment();
Wenyi Wang7b6bb002016-04-11 12:40:28 -0700281 fragment.setIncludeFavorites(mRequest.shouldIncludeFavorites());
Walter Jang6158b812016-07-19 15:59:51 -0700282 fragment.setListType(ListEvent.ListType.PICK_CONTACT);
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700283 mListFragment = fragment;
284 break;
285 }
286
287 case ContactsRequest.ACTION_PICK_OR_CREATE_CONTACT: {
288 ContactPickerFragment fragment = new ContactPickerFragment();
Brian Attwellbbd22012014-07-16 15:59:10 -0700289 fragment.setCreateContactEnabled(!mRequest.isSearchMode());
Walter Jang6158b812016-07-19 15:59:51 -0700290 fragment.setListType(ListEvent.ListType.PICK_CONTACT);
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700291 mListFragment = fragment;
292 break;
293 }
294
295 case ContactsRequest.ACTION_CREATE_SHORTCUT_CONTACT: {
296 ContactPickerFragment fragment = new ContactPickerFragment();
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700297 fragment.setShortcutRequested(true);
Walter Jang6158b812016-07-19 15:59:51 -0700298 fragment.setListType(ListEvent.ListType.PICK_CONTACT_FOR_SHORTCUT);
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700299 mListFragment = fragment;
300 break;
301 }
302
303 case ContactsRequest.ACTION_PICK_PHONE: {
Chiao Chenga953aa72012-12-04 17:04:48 -0800304 PhoneNumberPickerFragment fragment = getPhoneNumberPickerFragment(mRequest);
Walter Jang6158b812016-07-19 15:59:51 -0700305 fragment.setListType(ListEvent.ListType.PICK_PHONE);
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700306 mListFragment = fragment;
307 break;
308 }
309
Daniel Lehmannc86ace72011-03-23 21:04:29 -0700310 case ContactsRequest.ACTION_PICK_EMAIL: {
311 mListFragment = new EmailAddressPickerFragment();
Walter Jang6158b812016-07-19 15:59:51 -0700312 mListFragment.setListType(ListEvent.ListType.PICK_EMAIL);
Daniel Lehmannc86ace72011-03-23 21:04:29 -0700313 break;
314 }
315
Sean Midfordff6f1bb2016-10-12 09:48:23 -0700316 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 Plotnikovb979b422010-07-01 15:29:15 -0700327 case ContactsRequest.ACTION_CREATE_SHORTCUT_CALL: {
Chiao Chenga953aa72012-12-04 17:04:48 -0800328 PhoneNumberPickerFragment fragment = getPhoneNumberPickerFragment(mRequest);
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700329 fragment.setShortcutAction(Intent.ACTION_CALL);
Walter Jang6158b812016-07-19 15:59:51 -0700330 fragment.setListType(ListEvent.ListType.PICK_CONTACT_FOR_SHORTCUT);
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700331 mListFragment = fragment;
332 break;
333 }
334
335 case ContactsRequest.ACTION_CREATE_SHORTCUT_SMS: {
Chiao Chenga953aa72012-12-04 17:04:48 -0800336 PhoneNumberPickerFragment fragment = getPhoneNumberPickerFragment(mRequest);
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700337 fragment.setShortcutAction(Intent.ACTION_SENDTO);
Walter Jang6158b812016-07-19 15:59:51 -0700338 fragment.setListType(ListEvent.ListType.PICK_CONTACT_FOR_SHORTCUT);
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700339 mListFragment = fragment;
340 break;
341 }
342
343 case ContactsRequest.ACTION_PICK_POSTAL: {
344 PostalAddressPickerFragment fragment = new PostalAddressPickerFragment();
Walter Jang6158b812016-07-19 15:59:51 -0700345 fragment.setListType(ListEvent.ListType.PICK_POSTAL);
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700346 mListFragment = fragment;
347 break;
348 }
349
Brian Attwell81cc3b32014-07-22 16:04:52 -0700350 case ContactsRequest.ACTION_PICK_JOIN: {
351 JoinContactListFragment joinFragment = new JoinContactListFragment();
352 joinFragment.setTargetContactId(getTargetContactId());
Walter Jang6158b812016-07-19 15:59:51 -0700353 joinFragment.setListType(ListEvent.ListType.PICK_JOIN);
Brian Attwell81cc3b32014-07-22 16:04:52 -0700354 mListFragment = joinFragment;
355 break;
356 }
357
Walter Jangf9779ef2016-05-25 12:23:05 -0700358 case ContactsRequest.ACTION_PICK_GROUP_MEMBERS: {
Walter Jang6c5a5582016-06-16 11:26:53 -0700359 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 Jang16c29592016-06-14 15:34:39 -0700365 final ArrayList<String> contactIds = getIntent().getStringArrayListExtra(
366 UiIntentActions.GROUP_CONTACT_IDS);
Walter Jang6c5a5582016-06-16 11:26:53 -0700367 mListFragment = GroupMemberPickerFragment.newInstance(
368 accountName, accountType, accountDataSet, contactIds);
Walter Jang6158b812016-07-19 15:59:51 -0700369 mListFragment.setListType(ListEvent.ListType.PICK_GROUP_MEMBERS);
Walter Jangf9779ef2016-05-25 12:23:05 -0700370 break;
371 }
372
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700373 default:
374 throw new IllegalStateException("Invalid action code: " + mActionCode);
375 }
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700376
Chiao Chenga953aa72012-12-04 17:04:48 -0800377 // 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 Plotnikov84b3cc72010-10-11 18:19:51 -0700380 mListFragment.setLegacyCompatibilityMode(mRequest.isLegacyCompatibilityMode());
Dmitri Plotnikov4d174aa2010-10-25 15:38:54 -0700381 mListFragment.setDirectoryResultLimit(DEFAULT_DIRECTORY_RESULT_LIMIT);
382
Dianne Hackborn3ed426c2011-01-17 12:30:32 -0800383 getFragmentManager().beginTransaction()
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700384 .replace(R.id.list_container, mListFragment)
Minh Pham4b25da72011-08-25 13:50:38 -0700385 .commitAllowingStateLoss();
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700386 }
387
Chiao Chenga953aa72012-12-04 17:04:48 -0800388 private PhoneNumberPickerFragment getPhoneNumberPickerFragment(ContactsRequest request) {
389 if (mRequest.isLegacyCompatibilityMode()) {
390 return new LegacyPhoneNumberPickerFragment();
391 } else {
392 return new PhoneNumberPickerFragment();
393 }
394 }
395
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700396 public void setupActionListener() {
Dmitri Plotnikov6e850a02010-10-28 10:46:21 -0700397 if (mListFragment instanceof ContactPickerFragment) {
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700398 ((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 Lehmannc86ace72011-03-23 21:04:29 -0700406 } else if (mListFragment instanceof EmailAddressPickerFragment) {
407 ((EmailAddressPickerFragment) mListFragment).setOnEmailAddressPickerActionListener(
408 new EmailAddressPickerActionListener());
Sean Midfordff6f1bb2016-10-12 09:48:23 -0700409 } else if (mListFragment instanceof MultiSelectEmailAddressesListFragment) {
410 ((MultiSelectEmailAddressesListFragment) mListFragment).setCheckBoxListListener(this);
411 } else if (mListFragment instanceof MultiSelectPhoneNumbersListFragment) {
412 ((MultiSelectPhoneNumbersListFragment) mListFragment).setCheckBoxListListener(this);
Brian Attwell81cc3b32014-07-22 16:04:52 -0700413 } else if (mListFragment instanceof JoinContactListFragment) {
414 ((JoinContactListFragment) mListFragment).setOnContactPickerActionListener(
415 new JoinContactActionListener());
Walter Jangf9779ef2016-05-25 12:23:05 -0700416 } else if (mListFragment instanceof GroupMemberPickerFragment) {
417 ((GroupMemberPickerFragment) mListFragment).setListener(
418 new GroupMemberPickerListener());
Walter Janga4897212016-06-21 19:02:23 -0700419 getMultiSelectListFragment().setCheckBoxListListener(this);
Dmitri Plotnikov84b3cc72010-10-11 18:19:51 -0700420 } else {
421 throw new IllegalStateException("Unsupported list fragment type: " + mListFragment);
422 }
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700423 }
424
Walter Janga4897212016-06-21 19:02:23 -0700425 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 Wangb236b7c2016-06-23 08:59:19 -0700450 mListFragment.setQueryString("", /* delaySelection */ false);
Walter Janga4897212016-06-21 19:02:23 -0700451 mActionBarAdapter.setSearchMode(false);
452 if (getMultiSelectListFragment() != null) {
453 getMultiSelectListFragment().displayCheckBoxes(false);
454 }
455 invalidateOptionsMenu();
456 break;
457 }
458 }
459
460 @Override
Walter Janga4897212016-06-21 19:02:23 -0700461 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 Wangf5493a62016-07-11 14:28:52 -0700473 final int count = getMultiSelectListFragment().getSelectedContactIds().size();
474 mActionBarAdapter.setSelectionCount(count);
475 updateAddContactsButton(count);
476
Walter Janga4897212016-06-21 19:02:23 -0700477 // Show or hide the multi select "Done" button
478 invalidateOptionsMenu();
479 }
480 }
481
Wenyi Wangf5493a62016-07-11 14:28:52 -0700482 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 Janga4897212016-06-21 19:02:23 -0700501 @Override
502 public void onStopDisplayingCheckBoxes() {
503 mActionBarAdapter.setSelectionMode(false);
504 }
505
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700506 private final class ContactPickerActionListener implements OnContactPickerActionListener {
Daniel Lehmanne20d3432010-10-10 18:37:51 -0700507 @Override
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700508 public void onCreateNewContactAction() {
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700509 startCreateNewContactActivity();
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700510 }
511
Daniel Lehmanne20d3432010-10-10 18:37:51 -0700512 @Override
Dmitri Plotnikov86092522010-10-27 17:03:52 -0700513 public void onEditContactAction(Uri contactLookupUri) {
Gary Mai363af602016-09-28 10:01:23 -0700514 startActivityAndForwardResult(EditorIntents.createEditContactIntent(
John Shao41c68862016-08-17 21:02:41 -0700515 ContactSelectionActivity.this, contactLookupUri, /* materialPalette =*/ null,
516 /* photoId =*/ -1));
Dmitri Plotnikov86092522010-10-27 17:03:52 -0700517 }
518
519 @Override
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700520 public void onPickContactAction(Uri contactUri) {
Dmitri Plotnikovd11bca22010-12-08 20:15:17 -0800521 returnPickerResult(contactUri);
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700522 }
523
Daniel Lehmanne20d3432010-10-10 18:37:51 -0700524 @Override
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700525 public void onShortcutIntentCreated(Intent intent) {
Dmitri Plotnikovd11bca22010-12-08 20:15:17 -0800526 returnPickerResult(intent);
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700527 }
528 }
529
530 private final class PhoneNumberPickerActionListener implements
531 OnPhoneNumberPickerActionListener {
Daniel Lehmanne20d3432010-10-10 18:37:51 -0700532 @Override
Tyler Gunn0a8f9732015-12-15 15:38:54 -0800533 public void onPickDataUri(Uri dataUri, boolean isVideoCall, int callInitiationType) {
Dmitri Plotnikovd11bca22010-12-08 20:15:17 -0800534 returnPickerResult(dataUri);
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700535 }
536
Daniel Lehmanne20d3432010-10-10 18:37:51 -0700537 @Override
Anne Ronga6e72302015-09-29 15:16:47 -0700538 public void onPickPhoneNumber(String phoneNumber, boolean isVideoCall,
539 int callInitiationType) {
Andrew Lee86c224e2014-07-02 11:09:28 -0700540 Log.w(TAG, "Unsupported call.");
541 }
542
543 @Override
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700544 public void onShortcutIntentCreated(Intent intent) {
Dmitri Plotnikovd11bca22010-12-08 20:15:17 -0800545 returnPickerResult(intent);
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700546 }
Daisuke Miyakawa88f70fc2011-07-01 12:47:10 -0700547
Yorke Leedd3d2a42015-09-15 13:52:08 -0700548 @Override
Daisuke Miyakawa88f70fc2011-07-01 12:47:10 -0700549 public void onHomeInActionBarSelected() {
550 ContactSelectionActivity.this.onBackPressed();
551 }
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700552 }
553
Brian Attwell81cc3b32014-07-22 16:04:52 -0700554 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 Jangf9779ef2016-05-25 12:23:05 -0700575 private final class GroupMemberPickerListener implements GroupMemberPickerFragment.Listener {
576
577 @Override
Walter Jang16c29592016-06-14 15:34:39 -0700578 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 Jangf9779ef2016-05-25 12:23:05 -0700582 }
Walter Janga4897212016-06-21 19:02:23 -0700583
584 @Override
Walter Janga4897212016-06-21 19:02:23 -0700585 public void onSelectGroupMembers() {
586 mActionBarAdapter.setSelectionMode(true);
587 }
Walter Jangf9779ef2016-05-25 12:23:05 -0700588 }
589
Wenyi Wangf5493a62016-07-11 14:28:52 -0700590 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 Plotnikovb979b422010-07-01 15:29:15 -0700596 private final class PostalAddressPickerActionListener implements
597 OnPostalAddressPickerActionListener {
Daniel Lehmanne20d3432010-10-10 18:37:51 -0700598 @Override
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700599 public void onPickPostalAddressAction(Uri dataUri) {
Dmitri Plotnikovd11bca22010-12-08 20:15:17 -0800600 returnPickerResult(dataUri);
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700601 }
602 }
603
Daniel Lehmannc86ace72011-03-23 21:04:29 -0700604 private final class EmailAddressPickerActionListener implements
605 OnEmailAddressPickerActionListener {
606 @Override
607 public void onPickEmailAddressAction(Uri dataUri) {
608 returnPickerResult(dataUri);
609 }
610 }
611
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700612 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 Shrauner1d815e62014-01-31 10:37:31 -0800620 try {
John Shao41c68862016-08-17 21:02:41 -0700621 ImplicitIntentsUtil.startActivityInApp(ContactSelectionActivity.this, intent);
Jay Shrauner1d815e62014-01-31 10:37:31 -0800622 } 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 Plotnikovb979b422010-07-01 15:29:15 -0700627 finish();
628 }
629
630 @Override
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700631 public void onFocusChange(View view, boolean hasFocus) {
632 switch (view.getId()) {
633 case R.id.search_view: {
634 if (hasFocus) {
Walter Janga4897212016-06-21 19:02:23 -0700635 mActionBarAdapter.setFocusOnSearchView();
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700636 }
637 }
638 }
639 }
640
Dmitri Plotnikovd11bca22010-12-08 20:15:17 -0800641 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 Plotnikov63c311a2010-12-08 09:29:24 -0800653 @Override
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700654 public void onClick(View view) {
655 switch (view.getId()) {
Brian Attwell89ee3952014-07-09 16:40:39 -0700656 case R.id.floating_action_button: {
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700657 startCreateNewContactActivity();
658 break;
659 }
660 }
661 }
662
Brian Attwell81cc3b32014-07-22 16:04:52 -0700663 private long getTargetContactId() {
664 Intent intent = getIntent();
Brian Attwellc3d202c2015-01-08 15:01:03 -0800665 final long targetContactId = intent.getLongExtra(
666 UiIntentActions.TARGET_CONTACT_ID_EXTRA_KEY, -1);
Brian Attwell81cc3b32014-07-22 16:04:52 -0700667 if (targetContactId == -1) {
668 Log.e(TAG, "Intent " + intent.getAction() + " is missing required extra: "
Brian Attwellc3d202c2015-01-08 15:01:03 -0800669 + UiIntentActions.TARGET_CONTACT_ID_EXTRA_KEY);
Brian Attwell81cc3b32014-07-22 16:04:52 -0700670 setResult(RESULT_CANCELED);
671 finish();
672 return -1;
673 }
674 return targetContactId;
675 }
676
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700677 private void startCreateNewContactActivity() {
678 Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
Gary Mai363af602016-09-28 10:01:23 -0700679 intent.putExtra(ContactEditorActivity.
Walter Jang8d45cdb2016-09-01 09:25:44 -0700680 INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, true);
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700681 startActivityAndForwardResult(intent);
682 }
683
Katherine Kuan37bddc22011-07-09 17:36:26 -0700684 @Override
Brian Attwell81cc3b32014-07-22 16:04:52 -0700685 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 Attwellfde48de2014-11-21 11:01:31 -0800692 searchItem.setVisible(!mIsSearchMode && mIsSearchSupported);
Brian Attwell81cc3b32014-07-22 16:04:52 -0700693 return true;
694 }
695
696 @Override
697 public void onBackPressed() {
Jay Shrauner7712aef2015-09-25 14:14:28 -0700698 if (!isSafeToCommitTransactions()) {
Jay Shrauner35e17452015-09-16 11:19:23 -0700699 return;
700 }
701
Walter Jang794dbd02016-07-28 13:53:13 -0700702 if (isSelectionMode()) {
703 mActionBarAdapter.setSelectionMode(false);
Wenyi Wang5a48cd92016-08-01 16:40:44 -0700704 if (getMultiSelectListFragment() != null) {
705 getMultiSelectListFragment().displayCheckBoxes(false);
706 }
Walter Jang794dbd02016-07-28 13:53:13 -0700707 } else if (mIsSearchMode) {
Brian Attwell81cc3b32014-07-22 16:04:52 -0700708 mIsSearchMode = false;
709 configureSearchMode();
710 } else {
711 super.onBackPressed();
712 }
713 }
Dmitri Plotnikovb979b422010-07-01 15:29:15 -0700714}