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

Commit 3e1f2372 authored by Himanshu Gupta's avatar Himanshu Gupta Committed by Android (Google) Code Review
Browse files

Merge "App Cloning fixes for Sharesheet"

parents adb05fc0 b8362e90
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -2525,8 +2525,7 @@ public class ChooserActivity extends ResolverActivity implements
            List<Intent> payloadIntents, Intent[] initialIntents, List<ResolveInfo> rList,
            boolean filterLastUsed, UserHandle userHandle) {
        ChooserListAdapter chooserListAdapter = createChooserListAdapter(context, payloadIntents,
                initialIntents, rList, filterLastUsed,
                createListController(userHandle));
                initialIntents, rList, filterLastUsed, userHandle);
        AppPredictor.Callback appPredictorCallback = createAppPredictorCallback(chooserListAdapter);
        AppPredictor appPredictor = setupAppPredictorForUser(userHandle, appPredictorCallback);
        chooserListAdapter.setAppPredictor(appPredictor);
@@ -2536,12 +2535,18 @@ public class ChooserActivity extends ResolverActivity implements

    @VisibleForTesting
    public ChooserListAdapter createChooserListAdapter(Context context,
            List<Intent> payloadIntents, Intent[] initialIntents, List<ResolveInfo> rList,
            boolean filterLastUsed, ResolverListController resolverListController) {
            List<Intent> payloadIntents,
            Intent[] initialIntents,
            List<ResolveInfo> rList,
            boolean filterLastUsed,
            UserHandle userHandle) {
        UserHandle initialIntentsUserSpace = isLaunchedAsCloneProfile()
                && userHandle.equals(getPersonalProfileUserHandle())
                ? getCloneProfileUserHandle() : userHandle;
        return new ChooserListAdapter(context, payloadIntents, initialIntents, rList,
                filterLastUsed, resolverListController, this,
                filterLastUsed, createListController(userHandle), this,
                this, context.getPackageManager(),
                getChooserActivityLogger());
                getChooserActivityLogger(), initialIntentsUserSpace);
    }

    @VisibleForTesting
+12 −3
Original line number Diff line number Diff line
@@ -105,6 +105,9 @@ public class ChooserListAdapter extends ResolverListAdapter {
    private AppPredictor mAppPredictor;
    private AppPredictor.Callback mAppPredictorCallback;

    // Represents the UserSpace in which the Initial Intents should be resolved.
    private final UserHandle mInitialIntentsUserSpace;

    // For pinned direct share labels, if the text spans multiple lines, the TextView will consume
    // the full width, even if the characters actually take up less than that. Measure the actual
    // line widths and constrain the View's width based upon that so that the pin doesn't end up
@@ -142,11 +145,12 @@ public class ChooserListAdapter extends ResolverListAdapter {
            ChooserListCommunicator chooserListCommunicator,
            SelectableTargetInfo.SelectableTargetInfoCommunicator selectableTargetInfoCommunicator,
            PackageManager packageManager,
            ChooserActivityLogger chooserActivityLogger) {
            ChooserActivityLogger chooserActivityLogger,
            UserHandle initialIntentsUserSpace) {
        // Don't send the initial intents through the shared ResolverActivity path,
        // we want to separate them into a different section.
        super(context, payloadIntents, null, rList, filterLastUsed,
                resolverListController, chooserListCommunicator, false);
                resolverListController, chooserListCommunicator, false, initialIntentsUserSpace);

        mMaxShortcutTargetsPerApp =
                context.getResources().getInteger(R.integer.config_maxShortcutTargetsPerApp);
@@ -154,6 +158,7 @@ public class ChooserListAdapter extends ResolverListAdapter {
        createPlaceHolders();
        mSelectableTargetInfoCommunicator = selectableTargetInfoCommunicator;
        mChooserActivityLogger = chooserActivityLogger;
        mInitialIntentsUserSpace = initialIntentsUserSpace;

        if (initialIntents != null) {
            for (int i = 0; i < initialIntents.length; i++) {
@@ -197,7 +202,7 @@ public class ChooserListAdapter extends ResolverListAdapter {
                    ri.nonLocalizedLabel = li.getNonLocalizedLabel();
                    ri.icon = li.getIconResource();
                    ri.iconResourceId = ri.icon;
                    ri.userHandle = getUserHandle();
                    ri.userHandle = mInitialIntentsUserSpace;
                }
                if (userManager.isManagedProfile()) {
                    ri.noResourceId = true;
@@ -351,6 +356,10 @@ public class ChooserListAdapter extends ResolverListAdapter {
                // Consolidate multiple targets from same app.
                Map<String, DisplayResolveInfo> consolidated = new HashMap<>();
                for (DisplayResolveInfo info : allTargets) {
                    if (info.getResolveInfo().userHandle == null) {
                        Log.e(TAG, "ResolveInfo with null UserHandle found: "
                                + info.getResolveInfo());
                    }
                    String resolvedTarget = info.getResolvedComponentName().getPackageName()
                            + '#' + info.getDisplayLabel()
                            + '#' + ResolverActivity.getResolveInfoUserHandle(
+28 −15
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ import static android.stats.devicepolicy.nano.DevicePolicyEnums.RESOLVER_EMPTY_S
import static android.stats.devicepolicy.nano.DevicePolicyEnums.RESOLVER_EMPTY_STATE_NO_SHARING_TO_WORK;
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;

import static com.android.internal.annotations.VisibleForTesting.Visibility.PROTECTED;

import android.annotation.Nullable;
import android.annotation.StringRes;
import android.annotation.UiThread;
@@ -780,7 +782,7 @@ public class ResolverActivity extends Activity implements
        return getCloneProfileUserHandle() != null;
    }

    private boolean isLaunchedAsCloneProfile() {
    protected final boolean isLaunchedAsCloneProfile() {
        return hasCloneProfile()
                && (UserHandle.myUserId() == getCloneProfileUserHandle().getIdentifier());
    }
@@ -1517,9 +1519,7 @@ public class ResolverActivity extends Activity implements
        safelyStartActivityAsUser(cti, user, null);
    }

    // TODO: Make method public final.
    @VisibleForTesting
    protected void safelyStartActivityAsUser(
    protected final void safelyStartActivityAsUser(
            TargetInfo cti, UserHandle user, @Nullable Bundle options) {
        // We're dispatching intents that might be coming from legacy apps, so
        // don't kill ourselves.
@@ -1609,9 +1609,12 @@ public class ResolverActivity extends Activity implements
        Intent startIntent = getIntent();
        boolean isAudioCaptureDevice =
                startIntent.getBooleanExtra(EXTRA_IS_AUDIO_CAPTURE_DEVICE, false);
        UserHandle initialIntentsUserSpace = isLaunchedAsCloneProfile()
                && userHandle.equals(getPersonalProfileUserHandle())
                ? getCloneProfileUserHandle() : userHandle;
        return new ResolverListAdapter(context, payloadIntents, initialIntents, rList,
                filterLastUsed, createListController(userHandle), this,
                isAudioCaptureDevice);
                isAudioCaptureDevice, initialIntentsUserSpace);
    }

    @VisibleForTesting
@@ -2535,20 +2538,18 @@ public class ResolverActivity extends Activity implements
        return queryIntentsUser;
    }

    /**
     * This function is temporary in nature, and its usages will be replaced with just
     * resolveInfo.userHandle, once it is available, once sharesheet is stable.
     */
    public static UserHandle getResolveInfoUserHandle(ResolveInfo resolveInfo,
            UserHandle predictedHandle) {
        return resolveInfo.userHandle;
    }

    /**
     * Returns the {@link List} of {@link UserHandle} to pass on to the
     * {@link ResolverRankerServiceResolverComparator} as per the provided {@code userHandle}.
     */
    protected final List<UserHandle> getResolverRankerServiceUserHandleList(UserHandle userHandle) {
    @VisibleForTesting(visibility = PROTECTED)
    public final List<UserHandle> getResolverRankerServiceUserHandleList(UserHandle userHandle) {
        return getResolverRankerServiceUserHandleListInternal(userHandle);
    }

    @VisibleForTesting
    protected List<UserHandle> getResolverRankerServiceUserHandleListInternal(UserHandle
            userHandle) {
        List<UserHandle> userList = new ArrayList<>();
        userList.add(userHandle);
        // Add clonedProfileUserHandle to the list only if we are:
@@ -2560,4 +2561,16 @@ public class ResolverActivity extends Activity implements
        }
        return userList;
    }

    /**
     * This function is temporary in nature, and its usages will be replaced with just
     * resolveInfo.userHandle, once it is available, once sharesheet is stable.
     */
    public static UserHandle getResolveInfoUserHandle(ResolveInfo resolveInfo,
            UserHandle predictedHandle) {
        if (resolveInfo.userHandle == null) {
            Log.e(TAG, "ResolveInfo with null UserHandle found: " + resolveInfo);
        }
        return resolveInfo.userHandle;
    }
}
+10 −2
Original line number Diff line number Diff line
@@ -91,13 +91,16 @@ public class ResolverListAdapter extends BaseAdapter {
    private boolean mIsTabLoaded;
    private final Map<DisplayResolveInfo, LoadIconTask> mIconLoaders = new HashMap<>();
    private final Map<DisplayResolveInfo, LoadLabelTask> mLabelLoaders = new HashMap<>();
    // Represents the UserSpace in which the Initial Intents should be resolved.
    private final UserHandle mInitialIntentsUserSpace;

    public ResolverListAdapter(Context context, List<Intent> payloadIntents,
            Intent[] initialIntents, List<ResolveInfo> rList,
            boolean filterLastUsed,
            ResolverListController resolverListController,
            ResolverListCommunicator resolverListCommunicator,
            boolean isAudioCaptureDevice) {
            boolean isAudioCaptureDevice,
            UserHandle initialIntentsUserSpace) {
        mContext = context;
        mIntents = payloadIntents;
        mInitialIntents = initialIntents;
@@ -111,6 +114,11 @@ public class ResolverListAdapter extends BaseAdapter {
        mIsAudioCaptureDevice = isAudioCaptureDevice;
        final ActivityManager am = (ActivityManager) mContext.getSystemService(ACTIVITY_SERVICE);
        mIconDpi = am.getLauncherLargeIconDensity();
        mInitialIntentsUserSpace = initialIntentsUserSpace;
    }

    public ResolverListController getResolverListController() {
        return mResolverListController;
    }

    public void handlePackagesChanged() {
@@ -439,7 +447,7 @@ public class ResolverListAdapter extends BaseAdapter {
                        ri.nonLocalizedLabel = li.getNonLocalizedLabel();
                        ri.icon = li.getIconResource();
                        ri.iconResourceId = ri.icon;
                        ri.userHandle = getUserHandle();
                        ri.userHandle = mInitialIntentsUserSpace;
                    }
                    if (userManager.isManagedProfile()) {
                        ri.noResourceId = true;
+2 −2
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@ public class ChooserActivityOverrideData {

    @SuppressWarnings("Since15")
    public Function<PackageManager, PackageManager> createPackageManager;
    public Function<TargetInfo, Boolean> onSafelyStartCallback;
    public Function<TargetInfo, Boolean> onSafelyStartInternalCallback;
    public Function<ChooserListAdapter, Void> onQueryDirectShareTargets;
    public BiFunction<
            IChooserWrapper, ChooserListAdapter, Pair<Integer, ChooserActivity.ServiceResultInfo[]>>
@@ -82,7 +82,7 @@ public class ChooserActivityOverrideData {
    public PackageManager packageManager;

    public void reset() {
        onSafelyStartCallback = null;
        onSafelyStartInternalCallback = null;
        onQueryDirectShareTargets = null;
        directShareTargets = null;
        isVoiceInteraction = null;
Loading