From ee74b0ea906db7447fd33355351c625dd782139c Mon Sep 17 00:00:00 2001 From: Peter_Liang Date: Thu, 26 Mar 2020 12:27:21 +0800 Subject: [PATCH] Fix the duplicate components in edit shortcut menu list. Root cause: After android R, will have new feature about AccessibilityShortcutInfo let developers to apply that in their service. But if the service have the both features that AccessibilityServiceInfo and AccessibilityShortcutInfo, the framework will make AccessibilityShortcutInfo priority higher than AccessibilityServiceInfo. Goal: Filter tagert list in advance. Bug: 152464317 Test: manual test Change-Id: I93d2886ee686c939b8b6c4cf67b045392e9d9b51 --- .../AccessibilityButtonChooserActivity.java | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java b/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java index c40864131a2e6..51b13345a6c37 100644 --- a/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java +++ b/core/java/com/android/internal/app/AccessibilityButtonChooserActivity.java @@ -169,13 +169,41 @@ public class AccessibilityButtonChooserActivity extends Activity { private static List getInstalledServiceTargets( @NonNull Context context) { final List targets = new ArrayList<>(); - targets.addAll(getAccessibilityServiceTargets(context)); - targets.addAll(getAccessibilityActivityTargets(context)); + targets.addAll(getAccessibilityFilteredTargets(context)); targets.addAll(getWhiteListingServiceTargets(context)); return targets; } + private static List getAccessibilityFilteredTargets( + @NonNull Context context) { + final List serviceTargets = + getAccessibilityServiceTargets(context); + final List activityTargets = + getAccessibilityActivityTargets(context); + + for (AccessibilityButtonTarget activityTarget : activityTargets) { + serviceTargets.removeIf(serviceTarget -> { + final ComponentName serviceComponentName = + ComponentName.unflattenFromString(serviceTarget.getId()); + final ComponentName activityComponentName = + ComponentName.unflattenFromString(activityTarget.getId()); + final boolean isSamePackageName = activityComponentName.getPackageName().equals( + serviceComponentName.getPackageName()); + final boolean isSameLabel = activityTarget.getLabel().equals( + serviceTarget.getLabel()); + + return isSamePackageName && isSameLabel; + }); + } + + final List targets = new ArrayList<>(); + targets.addAll(serviceTargets); + targets.addAll(activityTargets); + + return targets; + } + private static List getAccessibilityServiceTargets( @NonNull Context context) { final AccessibilityManager ams = context.getSystemService(AccessibilityManager.class);