From 5ba060b49ac45b9fec40d5da2afd5c9b2329b0f0 Mon Sep 17 00:00:00 2001 From: Abodunrinwa Toki Date: Tue, 24 May 2016 18:34:40 +0100 Subject: [PATCH] Filter ACTION_PROCESS_TEXT entries by exported status and permission. Bug: 26638966 Change-Id: Ib06e914935fa5bde576555a0b7258d0faddaef13 --- core/java/android/widget/Editor.java | 37 ++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 622567c836172..383dc791e07cc 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -117,6 +117,7 @@ import com.android.internal.widget.EditableInputConnection; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.text.BreakIterator; +import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; @@ -6137,16 +6138,20 @@ public class Editor { private final Editor mEditor; private final TextView mTextView; + private final Context mContext; private final PackageManager mPackageManager; - private final SparseArray mAccessibilityIntents = new SparseArray(); + private final String mPackageName; + private final SparseArray mAccessibilityIntents = new SparseArray<>(); private final SparseArray mAccessibilityActions - = new SparseArray(); + = new SparseArray<>(); + private final List supportedActivities = new ArrayList<>(); private ProcessTextIntentActionsHandler(Editor editor) { mEditor = Preconditions.checkNotNull(editor); mTextView = Preconditions.checkNotNull(mEditor.mTextView); - mPackageManager = Preconditions.checkNotNull( - mTextView.getContext().getPackageManager()); + mContext = Preconditions.checkNotNull(mTextView.getContext()); + mPackageManager = Preconditions.checkNotNull(mContext.getPackageManager()); + mPackageName = Preconditions.checkNotNull(mContext.getPackageName()); } /** @@ -6154,7 +6159,8 @@ public class Editor { */ public void onInitializeMenu(Menu menu) { int i = 0; - for (ResolveInfo resolveInfo : getSupportedActivities()) { + loadSupportedActivities(); + for (ResolveInfo resolveInfo : supportedActivities) { menu.add(Menu.NONE, Menu.NONE, Editor.MENU_ITEM_ORDER_PROCESS_TEXT_INTENT_ACTIONS_START + i++, getLabel(resolveInfo)) @@ -6180,7 +6186,8 @@ public class Editor { mAccessibilityIntents.clear(); mAccessibilityActions.clear(); int i = 0; - for (ResolveInfo resolveInfo : getSupportedActivities()) { + loadSupportedActivities(); + for (ResolveInfo resolveInfo : supportedActivities) { int actionId = TextView.ACCESSIBILITY_ACTION_PROCESS_TEXT_START_ID + i++; mAccessibilityActions.put( actionId, @@ -6222,9 +6229,23 @@ public class Editor { return false; } - private List getSupportedActivities() { + private void loadSupportedActivities() { + supportedActivities.clear(); PackageManager packageManager = mTextView.getContext().getPackageManager(); - return packageManager.queryIntentActivities(createProcessTextIntent(), 0); + List unfiltered = packageManager.queryIntentActivities(createProcessTextIntent(), 0); + for (ResolveInfo info : unfiltered) { + if (isSupportedActivity(info)) { + supportedActivities.add(info); + } + } + } + + private boolean isSupportedActivity(ResolveInfo info) { + return mPackageName.equals(info.activityInfo.packageName) + || info.activityInfo.exported + && (info.activityInfo.permission == null + || mContext.checkSelfPermission(info.activityInfo.permission) + == PackageManager.PERMISSION_GRANTED); } private Intent createProcessTextIntentForResolveInfo(ResolveInfo info) {