From 3e3216f11133ad7119ec68ff0892098d7dd17020 Mon Sep 17 00:00:00 2001 From: Mehdi Alizadeh Date: Mon, 27 May 2019 17:56:51 -0700 Subject: [PATCH] Filter disabled/suspended direct share targets in sharesheet Bug: 123961239 Test: Manual test by suspending test app using Digital Wellbeing Change-Id: Id26465c484a708714ba955a1657fb1c3be402734 --- .../android/internal/app/ChooserActivity.java | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index a88c51a282292..88e124d1e21f3 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -1327,6 +1327,22 @@ public class ChooserActivity extends ResolverActivity { List resultList, List driList, @Nullable List appTargets) { + if (appTargets != null && appTargets.size() != resultList.size()) { + throw new RuntimeException("resultList and appTargets must have the same size." + + " resultList.size()=" + resultList.size() + + " appTargets.size()=" + appTargets.size()); + } + + for (int i = resultList.size() - 1; i >= 0; i--) { + final String packageName = resultList.get(i).getTargetComponent().getPackageName(); + if (!isPackageEnabled(packageName)) { + resultList.remove(i); + if (appTargets != null) { + appTargets.remove(i); + } + } + } + // Match ShareShortcutInfos with DisplayResolveInfos to be able to use the old code path // for direct share targets. After ShareSheet is refactored we should use the // ShareShortcutInfos directly. @@ -1340,7 +1356,6 @@ public class ChooserActivity extends ResolverActivity { ChooserTarget chooserTarget = convertToChooserTarget(shareShortcutInfo); chooserTargets.add(chooserTarget); if (mDirectShareAppTargetCache != null && appTargets != null) { - // Note that appTargets.size() == resultList.size() is always true. mDirectShareAppTargetCache.put(chooserTarget, appTargets.get(j)); } } @@ -1366,6 +1381,24 @@ public class ChooserActivity extends ResolverActivity { mChooserHandler.sendMessage(msg); } + private boolean isPackageEnabled(String packageName) { + if (TextUtils.isEmpty(packageName)) { + return false; + } + ApplicationInfo appInfo; + try { + appInfo = getPackageManager().getApplicationInfo(packageName, 0); + } catch (NameNotFoundException e) { + return false; + } + + if (appInfo != null && appInfo.enabled + && (appInfo.flags & ApplicationInfo.FLAG_SUSPENDED) == 0) { + return true; + } + return false; + } + private ChooserTarget convertToChooserTarget(ShortcutManager.ShareShortcutInfo shareShortcut) { ShortcutInfo shortcutInfo = shareShortcut.getShortcutInfo(); Bundle extras = new Bundle();