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) {