From 07ec46bd849d3b39892f85a48a14fd008c3447cd Mon Sep 17 00:00:00 2001 From: Stephen Bird Date: Mon, 9 May 2016 16:58:33 -0700 Subject: [1/2] Only get directory intent on button press Requesting this intent may cause plugins to request permissions at odd times. Instead, requesting this intent when the button is clicked will give the user some context when plugin permission dialogs come up. Note that the delay caused by requesting this intent when the button is clicked is fairly indiscernible from caching this intent at application creation. This action is only presented to the user once other metadata from the plugin has already been captured, so this call will happen after the plugin has been instantiated, and should be performant. Ticket: CD-561 Change-Id: Ic0fd385ea6346fcfb965704f40a31e7db6e55b5b (cherry picked from commit 46163fc084c1c0777785093070ecc2caab6f664e) --- .../contacts/activities/PeopleActivity.java | 14 +++------- .../android/contacts/incall/InCallPluginUtils.java | 32 ++++++++++++++++++++++ .../list/PluginContactBrowseListFragment.java | 7 +++-- 3 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java index 4528eab98..3beabd47d 100644 --- a/src/com/android/contacts/activities/PeopleActivity.java +++ b/src/com/android/contacts/activities/PeopleActivity.java @@ -72,6 +72,7 @@ import com.android.contacts.common.editor.SelectAccountDialogFragment; import com.android.contacts.group.GroupBrowseListFragment; import com.android.contacts.group.GroupBrowseListFragment.OnGroupBrowserActionListener; import com.android.contacts.group.GroupDetailFragment; +import com.android.contacts.incall.InCallPluginUtils; import com.android.contacts.interactions.ContactDeletionInteraction; import com.android.contacts.common.interactions.ImportExportDialogFragment; import com.android.contacts.common.interactions.ImportExportDialogFragment.ExportToSimThread; @@ -1796,16 +1797,9 @@ public class PeopleActivity extends ContactsActivity implements // plugin tab int pluginIndex = tabPosition - TabState.GROUPS; InCallPluginInfo pluginInfo = mPluginTabInfo.get(pluginIndex); - if (pluginInfo.mCallMethodInfo.mDefaultDirectorySearchIntent != null) { - try { - pluginInfo.mCallMethodInfo.mDefaultDirectorySearchIntent.send(); - } catch (PendingIntent.CanceledException e) { - Log.d(TAG, "directory search exception: ", e); - } - InCallMetricsHelper.increaseCount(this, - InCallMetricsHelper.Events.DIRECTORY_SEARCH, - pluginInfo.mCallMethodInfo.mComponent.flattenToString()); - } + InCallPluginUtils.startDirectoryDefaultSearch(this, + ContactsDataSubscription.get(this).mClient, + pluginInfo.mCallMethodInfo.mComponent); } else { Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI); Bundle extras = getIntent().getExtras(); diff --git a/src/com/android/contacts/incall/InCallPluginUtils.java b/src/com/android/contacts/incall/InCallPluginUtils.java index bb0e71fed..29e162ddf 100644 --- a/src/com/android/contacts/incall/InCallPluginUtils.java +++ b/src/com/android/contacts/incall/InCallPluginUtils.java @@ -16,6 +16,7 @@ package com.android.contacts.incall; +import android.app.PendingIntent; import android.content.ComponentName; import android.content.ContentUris; import android.content.ContentValues; @@ -39,9 +40,14 @@ import com.android.contacts.common.util.DataStatus; import com.android.contacts.common.util.UriUtils; import com.android.phone.common.incall.CallMethodInfo; import com.android.phone.common.incall.ContactsDataSubscription; +import com.android.phone.common.incall.api.InCallQueries; import com.android.phone.common.incall.utils.CallMethodFilters; +import com.cyanogen.ambient.common.api.AmbientApiClient; +import com.cyanogen.ambient.common.api.Result; +import com.cyanogen.ambient.common.api.ResultCallback; import com.cyanogen.ambient.incall.extension.InCallContactInfo; +import com.cyanogen.ambient.incall.results.PendingIntentResult; import com.cyngn.uicommon.view.Snackbar; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -228,4 +234,30 @@ public class InCallPluginUtils { } return pluginMap; } + + public static void startDirectoryDefaultSearch(final Context context, AmbientApiClient client, + final ComponentName componentName) { + + InCallQueries.getDefaultDirectorySearchIntent(client, componentName).setResultCallback( + new ResultCallback() { + @Override + public void onResult(Result result) { + PendingIntentResult pendingIntentResult = (PendingIntentResult) result; + if (pendingIntentResult == null) { + Log.d(TAG, "directory search null"); + return; + } + try { + if (pendingIntentResult.intent != null) { + pendingIntentResult.intent.send(); + InCallMetricsHelper.increaseCount(context, + InCallMetricsHelper.Events.DIRECTORY_SEARCH, + componentName.flattenToString()); + } + } catch (PendingIntent.CanceledException e) { + Log.d(TAG, "directory search exception: ", e); + } + } + }); + } } diff --git a/src/com/android/contacts/list/PluginContactBrowseListFragment.java b/src/com/android/contacts/list/PluginContactBrowseListFragment.java index eb313d588..442d4e8c8 100644 --- a/src/com/android/contacts/list/PluginContactBrowseListFragment.java +++ b/src/com/android/contacts/list/PluginContactBrowseListFragment.java @@ -58,6 +58,7 @@ import com.android.contacts.common.list.ContactListItemView; import com.android.contacts.common.list.DefaultContactListAdapter; import com.android.contacts.common.list.ProfileAndContactsLoader; import com.android.contacts.incall.InCallPluginUtils; +import com.android.phone.common.incall.ContactsDataSubscription; import com.android.phone.common.incall.utils.CallMethodUtils; import java.util.List; @@ -662,9 +663,9 @@ public class PluginContactBrowseListFragment extends ContactEntryListFragment