Merge "Fix an issue that clicking on a smart action chip on keyguard ... failed to launch app resolver when there are more than one app handlers." into qt-dev

This commit is contained in:
TreeHugger Robot
2019-06-06 09:22:13 +00:00
committed by Android (Google) Code Review
3 changed files with 41 additions and 5 deletions

View File

@@ -19,7 +19,9 @@ package android.view.textclassifier;
import android.annotation.Nullable;
import android.app.Person;
import android.app.RemoteAction;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Pair;
@@ -200,10 +202,12 @@ public final class ActionsSuggestionsHelper {
if (remoteAction == null) {
return null;
}
Intent actionIntent = ExtrasUtils.getActionIntent(conversationAction.getExtras());
ComponentName componentName = actionIntent.getComponent();
// Action without a component name will be considered as from the same app.
String packageName = componentName == null ? null : componentName.getPackageName();
return new Pair<>(
conversationAction.getAction().getTitle().toString(),
ExtrasUtils.getActionIntent(
conversationAction.getExtras()).getComponent().getPackageName());
conversationAction.getAction().getTitle().toString(), packageName);
}
private static final class PersonEncoder {

View File

@@ -118,14 +118,16 @@ public final class LabeledIntent {
return null;
}
Intent resolvedIntent = new Intent(intent);
resolvedIntent.setComponent(new ComponentName(packageName, className));
resolvedIntent.putExtra(
TextClassifier.EXTRA_FROM_TEXT_CLASSIFIER,
getFromTextClassifierExtra(textLanguagesBundle));
boolean shouldShowIcon = false;
Icon icon = null;
if (!"android".equals(packageName)) {
// We only set the component name when the package name is not resolved to "android"
// to workaround a bug that explicit intent with component name == ResolverActivity
// can't be launched on keyguard.
resolvedIntent.setComponent(new ComponentName(packageName, className));
if (resolveInfo.activityInfo.getIconResource() != 0) {
icon = Icon.createWithResource(
packageName, resolveInfo.activityInfo.getIconResource());

View File

@@ -208,6 +208,36 @@ public class ActionsSuggestionsHelperTest {
assertThat(conversationActions.get(2).getAction()).isNull();
}
@Test
public void testDeduplicateActions_nullComponent() {
Bundle phoneExtras = new Bundle();
Intent phoneIntent = new Intent(Intent.ACTION_DIAL);
ExtrasUtils.putActionIntent(phoneExtras, phoneIntent);
PendingIntent pendingIntent = PendingIntent.getActivity(
InstrumentationRegistry.getTargetContext(),
0,
phoneIntent,
0);
Icon icon = Icon.createWithData(new byte[0], 0, 0);
ConversationAction action =
new ConversationAction.Builder(ConversationAction.TYPE_CALL_PHONE)
.setAction(new RemoteAction(icon, "label", "1", pendingIntent))
.setExtras(phoneExtras)
.build();
ConversationAction actionWithSameLabel =
new ConversationAction.Builder(ConversationAction.TYPE_CALL_PHONE)
.setAction(new RemoteAction(
icon, "label", "2", pendingIntent))
.setExtras(phoneExtras)
.build();
List<ConversationAction> conversationActions =
ActionsSuggestionsHelper.removeActionsWithDuplicates(
Arrays.asList(action, actionWithSameLabel));
assertThat(conversationActions).isEmpty();
}
public void createLabeledIntentResult_null() {
ActionsSuggestionsModel.ActionSuggestion nativeSuggestion =
new ActionsSuggestionsModel.ActionSuggestion(