Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 85fd3d5c authored by Mehdi Alizadeh's avatar Mehdi Alizadeh
Browse files

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
parent 8e248ad1
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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
+17 −0
Original line number Diff line number Diff line
@@ -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();
        }
    }
}
+6 −0
Original line number Diff line number Diff line
@@ -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;
+4 −0
Original line number Diff line number Diff line
@@ -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.
     */
+13 −0
Original line number Diff line number Diff line
@@ -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<ShortcutInfo> getShortcutsWithQueryLocked(@NonNull String packageName,
            @UserIdInt int userId, int cloneFlags, @NonNull Predicate<ShortcutInfo> query) {