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

Commit d148ce36 authored by Oli Thompson's avatar Oli Thompson Committed by Android (Google) Code Review
Browse files

Merge "Add resolveActivityAsUserForExplicitType api to pm" into main

parents dee7640d 57233409
Loading
Loading
Loading
Loading
+21 −7
Original line number Diff line number Diff line
@@ -1496,22 +1496,36 @@ public class ApplicationPackageManager extends PackageManager {

    @Override
    public ResolveInfo resolveActivity(Intent intent, ResolveInfoFlags flags) {
        return resolveActivityAsUser(intent, flags, getUserId());
        return resolveActivityAsUser(intent, /* resolvedType= */ null, flags, getUserId());
    }

    @Override
    public ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId) {
        return resolveActivityAsUser(intent, ResolveInfoFlags.of(flags), userId);
        return resolveActivityAsUser(intent, /* resolvedType= */ null, ResolveInfoFlags.of(flags),
                userId);
    }

    @Override
    public ResolveInfo resolveActivityAsUser(Intent intent, ResolveInfoFlags flags, int userId) {
        return resolveActivityAsUser(intent, /* resolvedType= */ null, flags, userId);
    }

    @Override
    public ResolveInfo resolveActivityAsUser(Intent intent, String resolvedType,
            int flags, int userId) {
        return resolveActivityAsUser(intent, resolvedType,
                ResolveInfoFlags.of(flags), userId);
    }

    @Override
    public ResolveInfo resolveActivityAsUser(Intent intent, String resolvedType,
            ResolveInfoFlags flags, int userId) {
        try {
            return mPM.resolveIntent(
                intent,
                intent.resolveTypeIfNeeded(mContext.getContentResolver()),
                updateFlagsForComponent(flags.getValue(), userId, intent),
                userId);
            return mPM.resolveIntent(intent,
                    resolvedType == null
                        ? intent.resolveTypeIfNeeded(mContext.getContentResolver())
                        : resolvedType,
                    updateFlagsForComponent(flags.getValue(), userId, intent), userId);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
+29 −3
Original line number Diff line number Diff line
@@ -7833,14 +7833,20 @@ public abstract class PackageManager {
     * Intent.resolveActivity(PackageManager)} do.
     * </p>
     *
     * Use {@link #resolveActivityAsUser(Intent, ResolveInfoFlags, int)} when long flags are needed.
     * Use {@link #resolveActivityAsUser(Intent, String, ResolveInfoFlags, int)}
     * when long flags are needed.
     *
     * @param intent An intent containing all of the desired specification
     *            (action, data, type, category, and/or component).
     * @param resolvedType A nullable resolved type for the intent's data.
     *            Specified explicitly when the data type contained in the
     *            intent cannot be trusted. If null is provided, the type will
     *            be obtained from the intent using
     *            {@link Intent#resolveTypeIfNeeded}.
     * @param flags Additional option flags to modify the data returned. The
     *            most important is {@link #MATCH_DEFAULT_ONLY}, to limit the
     *            resolution to only those activities that support the
     *            {@link android.content.Intent#CATEGORY_DEFAULT}.
     *            {@link Intent#CATEGORY_DEFAULT}.
     * @param userId The user id.
     * @return Returns a ResolveInfo object containing the final activity intent
     *         that was determined to be the best action. Returns null if no
@@ -7849,6 +7855,26 @@ public abstract class PackageManager {
     *         containing something else, such as the activity resolver.
     * @hide
     */
    @Nullable
    public ResolveInfo resolveActivityAsUser(@NonNull Intent intent,
            @Nullable String resolvedType, int flags, @UserIdInt int userId) {
        return resolveActivityAsUser(intent, resolvedType, ResolveInfoFlags.of(flags), userId);
    }

    /**
     * See {@link #resolveActivityAsUser(Intent, String, int, int)}.
     * @hide
     */
    @Nullable
    public ResolveInfo resolveActivityAsUser(@NonNull Intent intent,
            @Nullable String resolvedType, @NonNull ResolveInfoFlags flags, @UserIdInt int userId) {
        throw new UnsupportedOperationException(
                "resolveActivityAsUser not implemented in subclass");
    }
     /**
     * See {@link #resolveActivityAsUser(Intent, String, int, int)}.
     * @hide
     */
    @SuppressWarnings("HiddenAbstractMethod")
    @Nullable
    @UnsupportedAppUsage
@@ -7856,7 +7882,7 @@ public abstract class PackageManager {
            int flags, @UserIdInt int userId);

    /**
     * See {@link #resolveActivityAsUser(Intent, int, int)}.
     * See {@link #resolveActivityAsUser(Intent, String, int, int)}.
     * @hide
     */
    @Nullable
+1 −1
Original line number Diff line number Diff line
@@ -358,7 +358,7 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter {

            return intents.stream().anyMatch(intent ->
                    null != IntentForwarderActivity.canForward(intent, source, target,
                            packageManager, mContentResolver));
                            packageManager, intent.resolveTypeIfNeeded(mContentResolver)));
        }
    }

+27 −9
Original line number Diff line number Diff line
@@ -41,7 +41,6 @@ import android.app.admin.DevicePolicyManager;
import android.app.admin.ManagedSubscriptionsPolicy;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.IPackageManager;
@@ -170,8 +169,9 @@ public class IntentForwarderActivity extends Activity {
        }

        final int callingUserId = getUserId();
        String resolvedType = intentReceived.resolveTypeIfNeeded(getContentResolver());
        final Intent newIntent = canForward(intentReceived, getUserId(), targetUserId,
                mInjector.getIPackageManager(), getContentResolver());
                mInjector.getIPackageManager(), resolvedType);

        if (newIntent == null) {
            Slog.wtf(TAG, "the intent: " + intentReceived + " cannot be forwarded from user "
@@ -182,7 +182,11 @@ public class IntentForwarderActivity extends Activity {

        newIntent.prepareToLeaveUser(callingUserId);
        final CompletableFuture<ResolveInfo> targetResolveInfoFuture =
                mInjector.resolveActivityAsUser(newIntent, MATCH_DEFAULT_ONLY, targetUserId);
                mInjector.resolveActivityAsUser(
                        newIntent,
                        resolvedType,
                        MATCH_DEFAULT_ONLY,
                        targetUserId);

        if (isPrivateProfile(callingUserId)) {
            buildAndExecuteForPrivateProfile(intentReceived, className, newIntent, callingUserId,
@@ -245,7 +249,7 @@ public class IntentForwarderActivity extends Activity {
        }

        int targetUserId = managedProfile == null ? UserHandle.USER_NULL : managedProfile.id;
        String callingPackage = getCallingPackage();
        String callingPackage = getLaunchedFromPackage();
        boolean privilegedCallerAskedToSkipUserConsent =
                launchIntent.getBooleanExtra(
                        EXTRA_SKIP_USER_CONFIRMATION, /* defaultValue= */ false)
@@ -524,6 +528,9 @@ public class IntentForwarderActivity extends Activity {
                ? targetUserId : callingUserId;
        int selectedProfile = findSelectedProfile(className);
        sanitizeIntent(intentReceived);
        if (intentReceived.getSelector() != null) {
            sanitizeIntent(intentReceived.getSelector());
        }
        intentReceived.putExtra(EXTRA_SELECTED_PROFILE, selectedProfile);
        intentReceived.putExtra(EXTRA_CALLING_USER, UserHandle.of(callingUserId));
        if (singleTabOnly) {
@@ -593,20 +600,20 @@ public class IntentForwarderActivity extends Activity {
     * forwarding if it can be forwarded, {@code null} otherwise.
     */
    static Intent canForward(Intent incomingIntent, int sourceUserId, int targetUserId,
            IPackageManager packageManager, ContentResolver contentResolver)  {
            IPackageManager packageManager, String resolvedType)  {
        Intent forwardIntent = new Intent(incomingIntent);
        forwardIntent.addFlags(
                Intent.FLAG_ACTIVITY_FORWARD_RESULT | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
        sanitizeIntent(forwardIntent);

        if (!canForwardInner(forwardIntent, sourceUserId, targetUserId, packageManager,
                contentResolver)) {
                resolvedType)) {
            return null;
        }
        if (forwardIntent.getSelector() != null) {
            sanitizeIntent(forwardIntent.getSelector());
            if (!canForwardInner(forwardIntent.getSelector(), sourceUserId, targetUserId,
                    packageManager, contentResolver)) {
                    packageManager, resolvedType)) {
                return null;
            }
        }
@@ -614,11 +621,10 @@ public class IntentForwarderActivity extends Activity {
    }

    private static boolean canForwardInner(Intent intent, int sourceUserId, int targetUserId,
            IPackageManager packageManager, ContentResolver contentResolver) {
            IPackageManager packageManager, String resolvedType) {
        if (Intent.ACTION_CHOOSER.equals(intent.getAction())) {
            return false;
        }
        String resolvedType = intent.resolveTypeIfNeeded(contentResolver);
        try {
            if (packageManager.canForwardTo(
                    intent, resolvedType, sourceUserId, targetUserId)) {
@@ -733,6 +739,15 @@ public class IntentForwarderActivity extends Activity {
            return IntentForwarderActivity.this.getPackageManager();
        }

        @Override
        @Nullable
        public CompletableFuture<ResolveInfo> resolveActivityAsUser(Intent intent,
                String resolvedType, int flags, int userId) {
            return CompletableFuture.supplyAsync(
                    () -> getPackageManager().resolveActivityAsUser(intent,
                            resolvedType, flags, userId));
        }

        @Override
        @Nullable
        public CompletableFuture<ResolveInfo> resolveActivityAsUser(
@@ -754,6 +769,9 @@ public class IntentForwarderActivity extends Activity {

        PackageManager getPackageManager();

        CompletableFuture<ResolveInfo> resolveActivityAsUser(Intent intent,
                String resolvedType, int flags, int userId);

        CompletableFuture<ResolveInfo> resolveActivityAsUser(Intent intent, int flags, int userId);

        void showToast(String message, int duration);
+13 −3
Original line number Diff line number Diff line
@@ -136,7 +136,6 @@ public class IntentForwarderActivityTest {

    @Before
    public void setup() {

        MockitoAnnotations.initMocks(this);
        mContext = InstrumentationRegistry.getTargetContext();
        sInjector = spy(new TestInjector());
@@ -291,13 +290,18 @@ public class IntentForwarderActivityTest {
        IntentForwarderWrapperActivity activity = mActivityRule.launchActivity(intent);

        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
        verify(mIPm, times(2)).canForwardTo(
                intentCaptor.capture(), nullable(String.class), anyInt(), anyInt());
        List<Intent> capturedIntents = intentCaptor.getAllValues();
        // Verify root intent is checked
        // Verify root intent is checked and sanitized
        assertEquals(Intent.ACTION_MAIN, capturedIntents.get(0).getAction());
        // Verify selector is checked
        assertNull(capturedIntents.get(0));
        assertNull(capturedIntents.get(0).getPackage());
        // Verify selector is checked and sanitized
        assertEquals(Intent.ACTION_VIEW, capturedIntents.get(1).getAction());
        assertNull(capturedIntents.get(1));
        assertNull(capturedIntents.get(1).getPackage());
        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
        onView(withId(R.id.icon)).check(matches(isDisplayed()));
        onView(withId(R.id.open_cross_profile)).check(matches(isDisplayed()));
@@ -773,6 +777,12 @@ public class IntentForwarderActivityTest {
            return mPm;
        }

        @Override
        public CompletableFuture<ResolveInfo> resolveActivityAsUser(Intent intent,
                String resolvedType, int flags, int userId) {
            return resolveActivityAsUser(intent, flags, userId);
        }

        @Override
        public CompletableFuture<ResolveInfo> resolveActivityAsUser(
                Intent intent, int flags, int userId) {