• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.contacts.list;
18 
19 import com.android.contacts.ContactsSearchManager;
20 
21 import android.app.Activity;
22 import android.app.SearchManager;
23 import android.content.Intent;
24 import android.net.Uri;
25 import android.os.Bundle;
26 import android.provider.Contacts.ContactMethods;
27 import android.provider.Contacts.People;
28 import android.provider.Contacts.Phones;
29 import android.provider.ContactsContract;
30 import android.provider.ContactsContract.CommonDataKinds.Email;
31 import android.provider.ContactsContract.CommonDataKinds.Phone;
32 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
33 import android.provider.ContactsContract.Contacts;
34 import android.provider.ContactsContract.Intents;
35 import android.provider.ContactsContract.Intents.Insert;
36 import android.provider.ContactsContract.Intents.UI;
37 import android.text.TextUtils;
38 import android.util.Log;
39 
40 /**
41  * Parses a Contacts intent, extracting all relevant parts and packaging them
42  * as a {@link ContactsRequest} object.
43  */
44 @SuppressWarnings("deprecation")
45 public class ContactsIntentResolver {
46 
47     private static final String TAG = "ContactsIntentResolver";
48 
49     private final Activity mContext;
50 
ContactsIntentResolver(Activity context)51     public ContactsIntentResolver(Activity context) {
52         this.mContext = context;
53     }
54 
resolveIntent(Intent intent)55     public ContactsRequest resolveIntent(Intent intent) {
56         ContactsRequest request = new ContactsRequest();
57 
58         String action = intent.getAction();
59 
60         Log.i(TAG, "Called with action: " + action);
61 
62         if (UI.LIST_DEFAULT.equals(action) ) {
63             request.setActionCode(ContactsRequest.ACTION_DEFAULT);
64         } else if (UI.LIST_ALL_CONTACTS_ACTION.equals(action)) {
65             request.setActionCode(ContactsRequest.ACTION_ALL_CONTACTS);
66         } else if (UI.LIST_CONTACTS_WITH_PHONES_ACTION.equals(action)) {
67             request.setActionCode(ContactsRequest.ACTION_CONTACTS_WITH_PHONES);
68         } else if (UI.LIST_STARRED_ACTION.equals(action)) {
69             request.setActionCode(ContactsRequest.ACTION_STARRED);
70         } else if (UI.LIST_FREQUENT_ACTION.equals(action)) {
71             request.setActionCode(ContactsRequest.ACTION_FREQUENT);
72         } else if (UI.LIST_STREQUENT_ACTION.equals(action)) {
73             request.setActionCode(ContactsRequest.ACTION_STREQUENT);
74         } else if (UI.LIST_GROUP_ACTION.equals(action)) {
75             request.setActionCode(ContactsRequest.ACTION_GROUP);
76             // We no longer support UI.GROUP_NAME_EXTRA_KEY
77         } else if (Intent.ACTION_PICK.equals(action)) {
78             final String resolvedType = intent.resolveType(mContext);
79             if (Contacts.CONTENT_TYPE.equals(resolvedType)) {
80                 request.setActionCode(ContactsRequest.ACTION_PICK_CONTACT);
81             } else if (People.CONTENT_TYPE.equals(resolvedType)) {
82                 request.setActionCode(ContactsRequest.ACTION_PICK_CONTACT);
83                 request.setLegacyCompatibilityMode(true);
84             } else if (Phone.CONTENT_TYPE.equals(resolvedType)) {
85                 request.setActionCode(ContactsRequest.ACTION_PICK_PHONE);
86             } else if (Phones.CONTENT_TYPE.equals(resolvedType)) {
87                 request.setActionCode(ContactsRequest.ACTION_PICK_PHONE);
88                 request.setLegacyCompatibilityMode(true);
89             } else if (StructuredPostal.CONTENT_TYPE.equals(resolvedType)) {
90                 request.setActionCode(ContactsRequest.ACTION_PICK_POSTAL);
91             } else if (ContactMethods.CONTENT_POSTAL_TYPE.equals(resolvedType)) {
92                 request.setActionCode(ContactsRequest.ACTION_PICK_POSTAL);
93                 request.setLegacyCompatibilityMode(true);
94             } else if (Email.CONTENT_TYPE.equals(resolvedType)) {
95                 request.setActionCode(ContactsRequest.ACTION_PICK_EMAIL);
96             }
97         } else if (Intent.ACTION_CREATE_SHORTCUT.equals(action)) {
98             String component = intent.getComponent().getClassName();
99             if (component.equals("alias.DialShortcut")) {
100                 request.setActionCode(ContactsRequest.ACTION_CREATE_SHORTCUT_CALL);
101             } else if (component.equals("alias.MessageShortcut")) {
102                 request.setActionCode(ContactsRequest.ACTION_CREATE_SHORTCUT_SMS);
103             } else {
104                 request.setActionCode(ContactsRequest.ACTION_CREATE_SHORTCUT_CONTACT);
105             }
106         } else if (Intent.ACTION_GET_CONTENT.equals(action)) {
107             String type = intent.getType();
108             if (Contacts.CONTENT_ITEM_TYPE.equals(type)) {
109                 request.setActionCode(ContactsRequest.ACTION_PICK_OR_CREATE_CONTACT);
110             } else if (Phone.CONTENT_ITEM_TYPE.equals(type)) {
111                 request.setActionCode(ContactsRequest.ACTION_PICK_PHONE);
112             } else if (Phones.CONTENT_ITEM_TYPE.equals(type)) {
113                 request.setActionCode(ContactsRequest.ACTION_PICK_PHONE);
114                 request.setLegacyCompatibilityMode(true);
115             } else if (StructuredPostal.CONTENT_ITEM_TYPE.equals(type)) {
116                 request.setActionCode(ContactsRequest.ACTION_PICK_POSTAL);
117             } else if (ContactMethods.CONTENT_POSTAL_ITEM_TYPE.equals(type)) {
118                 request.setActionCode(ContactsRequest.ACTION_PICK_POSTAL);
119                 request.setLegacyCompatibilityMode(true);
120             }  else if (People.CONTENT_ITEM_TYPE.equals(type)) {
121                 request.setActionCode(ContactsRequest.ACTION_PICK_OR_CREATE_CONTACT);
122                 request.setLegacyCompatibilityMode(true);
123             }
124         } else if (Intent.ACTION_INSERT_OR_EDIT.equals(action)) {
125             request.setActionCode(ContactsRequest.ACTION_INSERT_OR_EDIT_CONTACT);
126         } else if (Intent.ACTION_SEARCH.equals(action)) {
127             String query = intent.getStringExtra(SearchManager.QUERY);
128             // If the {@link SearchManager.QUERY} is empty, then check if a phone number
129             // or email is specified, in that priority.
130             if (TextUtils.isEmpty(query)) {
131                 query = intent.getStringExtra(Insert.PHONE);
132             }
133             if (TextUtils.isEmpty(query)) {
134                 query = intent.getStringExtra(Insert.EMAIL);
135             }
136             request.setQueryString(query);
137             request.setSearchMode(true);
138         } else if (Intent.ACTION_VIEW.equals(action)) {
139             final String resolvedType = intent.resolveType(mContext);
140             if (ContactsContract.Contacts.CONTENT_TYPE.equals(resolvedType)
141                     || android.provider.Contacts.People.CONTENT_TYPE.equals(resolvedType)) {
142                 request.setActionCode(ContactsRequest.ACTION_ALL_CONTACTS);
143             } else {
144                 request.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
145                 request.setContactUri(intent.getData());
146                 intent.setAction(Intent.ACTION_DEFAULT);
147                 intent.setData(null);
148             }
149         } else if (UI.FILTER_CONTACTS_ACTION.equals(action)) {
150             // When we get a FILTER_CONTACTS_ACTION, it represents search in the context
151             // of some other action. Let's retrieve the original action to provide proper
152             // context for the search queries.
153             request.setActionCode(ContactsRequest.ACTION_DEFAULT);
154             Bundle extras = intent.getExtras();
155             if (extras != null) {
156                 request.setQueryString(extras.getString(UI.FILTER_TEXT_EXTRA_KEY));
157 
158                 ContactsRequest originalRequest =
159                         (ContactsRequest)extras.get(ContactsSearchManager.ORIGINAL_REQUEST_KEY);
160                 if (originalRequest != null) {
161                     request.copyFrom(originalRequest);
162                 }
163             }
164 
165             request.setSearchMode(true);
166 
167         // Since this is the filter activity it receives all intents
168         // dispatched from the SearchManager for security reasons
169         // so we need to re-dispatch from here to the intended target.
170         } else if (Intents.SEARCH_SUGGESTION_CLICKED.equals(action)) {
171             Uri data = intent.getData();
172             request.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
173             request.setContactUri(data);
174             intent.setAction(Intent.ACTION_DEFAULT);
175             intent.setData(null);
176         }
177         // Allow the title to be set to a custom String using an extra on the intent
178         String title = intent.getStringExtra(UI.TITLE_EXTRA_KEY);
179         if (title != null) {
180             request.setActivityTitle(title);
181         }
182         return request;
183     }
184 }
185