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
This commit is contained in:
Peter_Liang
2020-03-26 12:27:21 +08:00
parent 5bd455ac5f
commit ee74b0ea90

View File

@@ -169,13 +169,41 @@ public class AccessibilityButtonChooserActivity extends Activity {
private static List<AccessibilityButtonTarget> getInstalledServiceTargets(
@NonNull Context context) {
final List<AccessibilityButtonTarget> targets = new ArrayList<>();
targets.addAll(getAccessibilityServiceTargets(context));
targets.addAll(getAccessibilityActivityTargets(context));
targets.addAll(getAccessibilityFilteredTargets(context));
targets.addAll(getWhiteListingServiceTargets(context));
return targets;
}
private static List<AccessibilityButtonTarget> getAccessibilityFilteredTargets(
@NonNull Context context) {
final List<AccessibilityButtonTarget> serviceTargets =
getAccessibilityServiceTargets(context);
final List<AccessibilityButtonTarget> 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<AccessibilityButtonTarget> targets = new ArrayList<>();
targets.addAll(serviceTargets);
targets.addAll(activityTargets);
return targets;
}
private static List<AccessibilityButtonTarget> getAccessibilityServiceTargets(
@NonNull Context context) {
final AccessibilityManager ams = context.getSystemService(AccessibilityManager.class);