From 85fd3d5c8b8190e9ea54f29ec0a9a4faf963a37b Mon Sep 17 00:00:00 2001 From: Mehdi Alizadeh Date: Wed, 23 Jan 2019 12:49:53 -0800 Subject: [PATCH] Use old API only if no share targets are published In ShareSheet, when querying Direct Share Targets using both old and new APIs, only query via old API if the app is not publishing any share targets in its resources (publishing via ShrotcutManager) Bug: 111698461 Test: Manual test using test app Change-Id: I4be46110ac4ae6de64a9675a19df5994c4fa65c8 --- .../android/content/pm/IShortcutService.aidl | 2 ++ .../android/content/pm/ShortcutManager.java | 17 +++++++++++++++++ .../android/internal/app/ChooserActivity.java | 6 ++++++ .../com/android/server/pm/ShortcutPackage.java | 4 ++++ .../com/android/server/pm/ShortcutService.java | 13 +++++++++++++ 5 files changed, 42 insertions(+) diff --git a/core/java/android/content/pm/IShortcutService.aidl b/core/java/android/content/pm/IShortcutService.aidl index c702b16c97f6d..276853d3b8602 100644 --- a/core/java/android/content/pm/IShortcutService.aidl +++ b/core/java/android/content/pm/IShortcutService.aidl @@ -76,4 +76,6 @@ interface IShortcutService { // System API used by framework's ShareSheet (ChooserActivity) ParceledListSlice getShareTargets(String packageName, in IntentFilter filter, int userId); + + boolean hasShareTargets(String packageName, String packageToCheck, int userId); } \ No newline at end of file diff --git a/core/java/android/content/pm/ShortcutManager.java b/core/java/android/content/pm/ShortcutManager.java index 4f7acd96aa6b0..849fd03eacb3f 100644 --- a/core/java/android/content/pm/ShortcutManager.java +++ b/core/java/android/content/pm/ShortcutManager.java @@ -635,4 +635,21 @@ public class ShortcutManager { } }; } + + /** + * Used by framework's ShareSheet (ChooserActivity.java) to check if a given package has share + * target definitions in it's resources. + * + * @param packageName Package to check for share targets. + * @return True if the package has any share target definitions, False otherwise. + * @hide + */ + public boolean hasShareTargets(@NonNull String packageName) { + try { + return mService.hasShareTargets(mContext.getPackageName(), packageName, + injectMyUserId()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } } diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 30137e3893fff..42acb09d50d6f 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -513,6 +513,7 @@ public class ChooserActivity extends ResolverActivity { void queryTargetServices(ChooserListAdapter adapter) { final PackageManager pm = getPackageManager(); + ShortcutManager sm = (ShortcutManager) getSystemService(ShortcutManager.class); int targetsToQuery = 0; for (int i = 0, N = adapter.getDisplayResolveInfoCount(); i < N; i++) { final DisplayResolveInfo dri = adapter.getDisplayResolveInfo(i); @@ -522,6 +523,11 @@ public class ChooserActivity extends ResolverActivity { continue; } final ActivityInfo ai = dri.getResolveInfo().activityInfo; + if (USE_SHORTCUT_MANAGER_FOR_DIRECT_TARGETS + && sm.hasShareTargets(ai.packageName)) { + // Share targets will be queried from ShortcutManager + continue; + } final Bundle md = ai.metaData; final String serviceName = md != null ? convertServiceName(ai.packageName, md.getString(ChooserTargetService.META_DATA_NAME)) : null; diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index 563fd7f90c4b7..84c8b606a9d9e 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -690,6 +690,10 @@ class ShortcutPackage extends ShortcutPackageItem { return result; } + public boolean hasShareTargets() { + return !mShareTargets.isEmpty(); + } + /** * Return the filenames (excluding path names) of icon bitmap files from this package. */ diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index fdbaba24966bd..792b34c165515 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -2167,6 +2167,19 @@ public class ShortcutService extends IShortcutService.Stub { } } + @Override + public boolean hasShareTargets(String packageName, String packageToCheck, + @UserIdInt int userId) { + verifyCaller(packageName, userId); + enforceSystem(); + + synchronized (mLock) { + throwIfUserLockedL(userId); + + return getPackageShortcutsLocked(packageToCheck, userId).hasShareTargets(); + } + } + @GuardedBy("mLock") private ParceledListSlice getShortcutsWithQueryLocked(@NonNull String packageName, @UserIdInt int userId, int cloneFlags, @NonNull Predicate query) {