blob: 7cf9f5ad499df741894c1f01c62f395477a52157 [file] [log] [blame]
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Dmitri Plotnikov0906ee32010-04-22 10:46:00 -070017package com.android.contacts.list;
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070018
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070019import android.app.Activity;
20import android.app.SearchManager;
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070021import android.content.Intent;
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070022import android.net.Uri;
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070023import android.provider.Contacts.ContactMethods;
24import android.provider.Contacts.People;
25import android.provider.Contacts.Phones;
Daisuke Miyakawaf0c46812011-08-23 15:58:21 -070026import android.provider.ContactsContract;
Daniel Lehmannc86ace72011-03-23 21:04:29 -070027import android.provider.ContactsContract.CommonDataKinds.Email;
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070028import android.provider.ContactsContract.CommonDataKinds.Phone;
29import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
Dmitri Plotnikov40ec3a82010-11-10 11:25:33 -080030import android.provider.ContactsContract.Contacts;
Walter Jangf9779ef2016-05-25 12:23:05 -070031import android.provider.ContactsContract.Groups;
Dmitri Plotnikov40ec3a82010-11-10 11:25:33 -080032import android.provider.ContactsContract.Intents;
Katherine Kuan1ce53ff2011-12-20 14:12:32 -080033import android.provider.ContactsContract.Intents.Insert;
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070034import android.text.TextUtils;
35import android.util.Log;
36
Wenyi Wang79675452016-08-17 10:43:28 -070037import com.android.contacts.group.GroupUtil;
Gary Mai0a49afa2016-12-05 15:53:58 -080038import com.android.contacts.model.account.AccountWithDataSet;
Walter Jangf9779ef2016-05-25 12:23:05 -070039
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070040/**
Dmitri Plotnikovfe42e552010-05-14 14:50:32 -070041 * Parses a Contacts intent, extracting all relevant parts and packaging them
42 * as a {@link ContactsRequest} object.
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070043 */
44@SuppressWarnings("deprecation")
Dmitri Plotnikov0906ee32010-04-22 10:46:00 -070045public class ContactsIntentResolver {
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070046
Dmitri Plotnikovb979b422010-07-01 15:29:15 -070047 private static final String TAG = "ContactsIntentResolver";
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070048
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070049 private final Activity mContext;
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070050
Dmitri Plotnikov15406742010-05-07 09:22:49 -070051 public ContactsIntentResolver(Activity context) {
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070052 this.mContext = context;
53 }
54
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -070055 public ContactsRequest resolveIntent(Intent intent) {
56 ContactsRequest request = new ContactsRequest();
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -070057
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070058 String action = intent.getAction();
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070059
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070060 Log.i(TAG, "Called with action: " + action);
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -070061
Brian Attwellc3d202c2015-01-08 15:01:03 -080062 if (UiIntentActions.LIST_DEFAULT.equals(action) ) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -070063 request.setActionCode(ContactsRequest.ACTION_DEFAULT);
Brian Attwellc3d202c2015-01-08 15:01:03 -080064 } else if (UiIntentActions.LIST_ALL_CONTACTS_ACTION.equals(action)) {
Dmitri Plotnikov48cc2502010-10-08 14:56:04 -070065 request.setActionCode(ContactsRequest.ACTION_ALL_CONTACTS);
Brian Attwellc3d202c2015-01-08 15:01:03 -080066 } else if (UiIntentActions.LIST_CONTACTS_WITH_PHONES_ACTION.equals(action)) {
Dmitri Plotnikov91ab5b42010-10-08 15:26:31 -070067 request.setActionCode(ContactsRequest.ACTION_CONTACTS_WITH_PHONES);
Brian Attwellc3d202c2015-01-08 15:01:03 -080068 } else if (UiIntentActions.LIST_STARRED_ACTION.equals(action)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -070069 request.setActionCode(ContactsRequest.ACTION_STARRED);
Brian Attwellc3d202c2015-01-08 15:01:03 -080070 } else if (UiIntentActions.LIST_FREQUENT_ACTION.equals(action)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -070071 request.setActionCode(ContactsRequest.ACTION_FREQUENT);
Brian Attwellc3d202c2015-01-08 15:01:03 -080072 } else if (UiIntentActions.LIST_STREQUENT_ACTION.equals(action)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -070073 request.setActionCode(ContactsRequest.ACTION_STREQUENT);
Brian Attwellc3d202c2015-01-08 15:01:03 -080074 } else if (UiIntentActions.LIST_GROUP_ACTION.equals(action)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -070075 request.setActionCode(ContactsRequest.ACTION_GROUP);
Brian Attwellc3d202c2015-01-08 15:01:03 -080076 // We no longer support UiIntentActions.GROUP_NAME_EXTRA_KEY
Sean Midfordff6f1bb2016-10-12 09:48:23 -070077 } else if (UiIntentActions.ACTION_SELECT_ITEMS.equals(action)) {
78 final String resolvedType = intent.resolveType(mContext);
79 if (Phone.CONTENT_TYPE.equals(resolvedType)) {
80 request.setActionCode(ContactsRequest.ACTION_PICK_PHONES);
81 } else if (Email.CONTENT_TYPE.equals(resolvedType)) {
82 request.setActionCode(ContactsRequest.ACTION_PICK_EMAILS);
83 }
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070084 } else if (Intent.ACTION_PICK.equals(action)) {
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070085 final String resolvedType = intent.resolveType(mContext);
86 if (Contacts.CONTENT_TYPE.equals(resolvedType)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -070087 request.setActionCode(ContactsRequest.ACTION_PICK_CONTACT);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070088 } else if (People.CONTENT_TYPE.equals(resolvedType)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -070089 request.setActionCode(ContactsRequest.ACTION_PICK_CONTACT);
90 request.setLegacyCompatibilityMode(true);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070091 } else if (Phone.CONTENT_TYPE.equals(resolvedType)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -070092 request.setActionCode(ContactsRequest.ACTION_PICK_PHONE);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070093 } else if (Phones.CONTENT_TYPE.equals(resolvedType)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -070094 request.setActionCode(ContactsRequest.ACTION_PICK_PHONE);
95 request.setLegacyCompatibilityMode(true);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070096 } else if (StructuredPostal.CONTENT_TYPE.equals(resolvedType)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -070097 request.setActionCode(ContactsRequest.ACTION_PICK_POSTAL);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -070098 } else if (ContactMethods.CONTENT_POSTAL_TYPE.equals(resolvedType)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -070099 request.setActionCode(ContactsRequest.ACTION_PICK_POSTAL);
100 request.setLegacyCompatibilityMode(true);
Daniel Lehmannc86ace72011-03-23 21:04:29 -0700101 } else if (Email.CONTENT_TYPE.equals(resolvedType)) {
102 request.setActionCode(ContactsRequest.ACTION_PICK_EMAIL);
Walter Jang7c596c72016-07-25 12:55:27 -0700103 } else if (Groups.CONTENT_TYPE.equals(resolvedType)) {
Walter Jangf9779ef2016-05-25 12:23:05 -0700104 request.setActionCode(ContactsRequest.ACTION_PICK_GROUP_MEMBERS);
Walter Jang6c5a5582016-06-16 11:26:53 -0700105 request.setAccountWithDataSet(new AccountWithDataSet(
106 intent.getStringExtra(UiIntentActions.GROUP_ACCOUNT_NAME),
107 intent.getStringExtra(UiIntentActions.GROUP_ACCOUNT_TYPE),
108 intent.getStringExtra(UiIntentActions.GROUP_ACCOUNT_DATA_SET)));
Walter Jangf9779ef2016-05-25 12:23:05 -0700109 request.setRawContactIds(intent.getStringArrayListExtra(
Walter Jang16c29592016-06-14 15:34:39 -0700110 UiIntentActions.GROUP_CONTACT_IDS));
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700111 }
112 } else if (Intent.ACTION_CREATE_SHORTCUT.equals(action)) {
Dmitri Plotnikov884e3932010-05-13 19:13:51 -0700113 String component = intent.getComponent().getClassName();
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700114 if (component.equals("alias.DialShortcut")) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -0700115 request.setActionCode(ContactsRequest.ACTION_CREATE_SHORTCUT_CALL);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700116 } else if (component.equals("alias.MessageShortcut")) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -0700117 request.setActionCode(ContactsRequest.ACTION_CREATE_SHORTCUT_SMS);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700118 } else {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -0700119 request.setActionCode(ContactsRequest.ACTION_CREATE_SHORTCUT_CONTACT);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700120 }
121 } else if (Intent.ACTION_GET_CONTENT.equals(action)) {
Dmitri Plotnikov884e3932010-05-13 19:13:51 -0700122 String type = intent.getType();
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700123 if (Contacts.CONTENT_ITEM_TYPE.equals(type)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -0700124 request.setActionCode(ContactsRequest.ACTION_PICK_OR_CREATE_CONTACT);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700125 } else if (Phone.CONTENT_ITEM_TYPE.equals(type)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -0700126 request.setActionCode(ContactsRequest.ACTION_PICK_PHONE);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700127 } else if (Phones.CONTENT_ITEM_TYPE.equals(type)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -0700128 request.setActionCode(ContactsRequest.ACTION_PICK_PHONE);
129 request.setLegacyCompatibilityMode(true);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700130 } else if (StructuredPostal.CONTENT_ITEM_TYPE.equals(type)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -0700131 request.setActionCode(ContactsRequest.ACTION_PICK_POSTAL);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700132 } else if (ContactMethods.CONTENT_POSTAL_ITEM_TYPE.equals(type)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -0700133 request.setActionCode(ContactsRequest.ACTION_PICK_POSTAL);
134 request.setLegacyCompatibilityMode(true);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700135 } else if (People.CONTENT_ITEM_TYPE.equals(type)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -0700136 request.setActionCode(ContactsRequest.ACTION_PICK_OR_CREATE_CONTACT);
137 request.setLegacyCompatibilityMode(true);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700138 }
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700139 } else if (Intent.ACTION_INSERT_OR_EDIT.equals(action)) {
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -0700140 request.setActionCode(ContactsRequest.ACTION_INSERT_OR_EDIT_CONTACT);
Walter Jang1110d672016-07-25 17:55:12 +0000141 } else if (Intent.ACTION_INSERT.equals(action) &&
142 Groups.CONTENT_TYPE.equals(intent.getType())) {
143 request.setActionCode(ContactsRequest.ACTION_INSERT_GROUP);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700144 } else if (Intent.ACTION_SEARCH.equals(action)) {
Katherine Kuan1ce53ff2011-12-20 14:12:32 -0800145 String query = intent.getStringExtra(SearchManager.QUERY);
Makoto Onuki2dd99172012-07-31 14:15:28 -0700146 // If the {@link SearchManager.QUERY} is empty, then check if a phone number
147 // or email is specified, in that priority.
148 if (TextUtils.isEmpty(query)) {
149 query = intent.getStringExtra(Insert.PHONE);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700150 }
Makoto Onuki2dd99172012-07-31 14:15:28 -0700151 if (TextUtils.isEmpty(query)) {
152 query = intent.getStringExtra(Insert.EMAIL);
153 }
154 request.setQueryString(query);
155 request.setSearchMode(true);
Dmitri Plotnikov40ec3a82010-11-10 11:25:33 -0800156 } else if (Intent.ACTION_VIEW.equals(action)) {
Daisuke Miyakawaf0c46812011-08-23 15:58:21 -0700157 final String resolvedType = intent.resolveType(mContext);
158 if (ContactsContract.Contacts.CONTENT_TYPE.equals(resolvedType)
159 || android.provider.Contacts.People.CONTENT_TYPE.equals(resolvedType)) {
160 request.setActionCode(ContactsRequest.ACTION_ALL_CONTACTS);
Wenyi Wang79675452016-08-17 10:43:28 -0700161 } else if (!GroupUtil.isGroupUri(intent.getData())){
Daisuke Miyakawaf0c46812011-08-23 15:58:21 -0700162 request.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
163 request.setContactUri(intent.getData());
164 intent.setAction(Intent.ACTION_DEFAULT);
165 intent.setData(null);
Wenyi Wang79675452016-08-17 10:43:28 -0700166 } else {
167 request.setActionCode(ContactsRequest.ACTION_VIEW_GROUP);
168 request.setContactUri(intent.getData());
169 }
170 } else if (Intent.ACTION_EDIT.equals(action)) {
171 if (GroupUtil.isGroupUri(intent.getData())){
172 request.setActionCode(ContactsRequest.ACTION_EDIT_GROUP);
173 request.setContactUri(intent.getData());
Daisuke Miyakawaf0c46812011-08-23 15:58:21 -0700174 }
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700175 // Since this is the filter activity it receives all intents
176 // dispatched from the SearchManager for security reasons
177 // so we need to re-dispatch from here to the intended target.
178 } else if (Intents.SEARCH_SUGGESTION_CLICKED.equals(action)) {
179 Uri data = intent.getData();
Makoto Onuki2dd99172012-07-31 14:15:28 -0700180 request.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
181 request.setContactUri(data);
182 intent.setAction(Intent.ACTION_DEFAULT);
183 intent.setData(null);
Brian Attwellc3d202c2015-01-08 15:01:03 -0800184 } else if (UiIntentActions.PICK_JOIN_CONTACT_ACTION.equals(action)) {
Brian Attwell81cc3b32014-07-22 16:04:52 -0700185 request.setActionCode(ContactsRequest.ACTION_PICK_JOIN);
Dmitri Plotnikov884e3932010-05-13 19:13:51 -0700186 }
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -0700187 // Allow the title to be set to a custom String using an extra on the intent
Brian Attwellc3d202c2015-01-08 15:01:03 -0800188 String title = intent.getStringExtra(UiIntentActions.TITLE_EXTRA_KEY);
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -0700189 if (title != null) {
190 request.setActivityTitle(title);
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700191 }
Dmitri Plotnikov1ce1e7c2010-05-13 16:41:00 -0700192 return request;
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700193 }
Dmitri Plotnikov6178cb42010-04-20 11:26:05 -0700194}