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

Commit e12616a3 authored by Alison Cichowlas's avatar Alison Cichowlas
Browse files

Send stacked apps through full standard start flow.

Test: Verify logs manually; atest ChooserActivityTest
Fixes: 146672936
Change-Id: I25296cc13e2b5f033552623753e3271b540faa82
parent 2aea1e07
Loading
Loading
Loading
Loading
+13 −12
Original line number Diff line number Diff line
@@ -120,7 +120,6 @@ import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.internal.content.PackageMonitor;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.ImageUtils;
import com.android.internal.widget.GridLayoutManager;
import com.android.internal.widget.RecyclerView;
import com.android.internal.widget.ResolverDrawerLayout;
@@ -1439,9 +1438,10 @@ public class ChooserActivity extends ResolverActivity implements

        final long selectionCost = System.currentTimeMillis() - mChooserShownTime;

        // Stacked apps get a disambiguation first
        if (targetInfo instanceof MultiDisplayResolveInfo) {
            MultiDisplayResolveInfo mti = (MultiDisplayResolveInfo) targetInfo;
            if (!mti.hasSelected()) {
                // Stacked apps get a disambiguation first
                CharSequence[] labels = new CharSequence[mti.getTargets().size()];
                int i = 0;
                for (TargetInfo ti : mti.getTargets()) {
@@ -1449,11 +1449,12 @@ public class ChooserActivity extends ResolverActivity implements
                }
                ChooserStackedAppDialogFragment f = new ChooserStackedAppDialogFragment(
                        targetInfo.getDisplayLabel(),
                    ((MultiDisplayResolveInfo) targetInfo).getTargets(), labels);
                        ((MultiDisplayResolveInfo) targetInfo), labels, which);

                f.show(getFragmentManager(), TARGET_DETAILS_FRAGMENT_TAG);
                return;
            }
        }

        super.startSelected(which, always, filtered);

+7 −13
Original line number Diff line number Diff line
@@ -24,10 +24,7 @@ import android.content.DialogInterface;
import android.content.res.Configuration;
import android.os.Bundle;

import com.android.internal.app.chooser.DisplayResolveInfo;

import java.util.ArrayList;
import java.util.List;
import com.android.internal.app.chooser.MultiDisplayResolveInfo;

/**
 * Shows individual actions for a "stacked" app target - such as an app with multiple posting
@@ -38,24 +35,20 @@ public class ChooserStackedAppDialogFragment extends DialogFragment
    private static final String TITLE_KEY = "title";
    private static final String PINNED_KEY = "pinned";

    private List<DisplayResolveInfo> mTargetInfos = new ArrayList<>();
    private MultiDisplayResolveInfo mTargetInfos;
    private CharSequence[] mLabels;
    private int mParentWhich;

    public ChooserStackedAppDialogFragment() {
    }

    public ChooserStackedAppDialogFragment(CharSequence title) {
        Bundle args = new Bundle();
        args.putCharSequence(TITLE_KEY, title);
        setArguments(args);
    }

    public ChooserStackedAppDialogFragment(CharSequence title,
            List<DisplayResolveInfo> targets, CharSequence[] labels) {
            MultiDisplayResolveInfo targets, CharSequence[] labels, int parentWhich) {
        Bundle args = new Bundle();
        args.putCharSequence(TITLE_KEY, title);
        mTargetInfos = targets;
        mLabels = labels;
        mParentWhich = parentWhich;
        setArguments(args);
    }

@@ -72,7 +65,8 @@ public class ChooserStackedAppDialogFragment extends DialogFragment
    @Override
    public void onClick(DialogInterface dialog, int which) {
        final Bundle args = getArguments();
        mTargetInfos.get(which).start(getActivity(), null);
        mTargetInfos.setSelected(which);
        ((ChooserActivity) getActivity()).startSelected(mParentWhich, false, true);
        dismiss();
    }

+34 −0
Original line number Diff line number Diff line
@@ -16,6 +16,12 @@

package com.android.internal.app.chooser;

import android.app.Activity;
import android.os.Bundle;
import android.os.UserHandle;

import com.android.internal.app.ResolverActivity;

import java.util.ArrayList;
import java.util.List;

@@ -28,6 +34,8 @@ public class MultiDisplayResolveInfo extends DisplayResolveInfo {
    String mPackageName;
    // We'll use this DRI for basic presentation info - eg icon, name.
    final DisplayResolveInfo mBaseInfo;
    // Index of selected target
    private int mSelected = -1;

    /**
     * @param firstInfo A representative DRI to use for the main icon, title, etc for this Info.
@@ -52,4 +60,30 @@ public class MultiDisplayResolveInfo extends DisplayResolveInfo {
        return mTargetInfos;
    }

    public void setSelected(int selected) {
        mSelected = selected;
    }

    /**
     * Whether or not the user has selected a specific target for this MultiInfo.
     */
    public boolean hasSelected() {
        return mSelected >= 0;
    }

    @Override
    public boolean start(Activity activity, Bundle options) {
        return mTargetInfos.get(mSelected).start(activity, options);
    }

    @Override
    public boolean startAsCaller(ResolverActivity activity, Bundle options, int userId) {
        return mTargetInfos.get(mSelected).startAsCaller(activity, options, userId);
    }

    @Override
    public boolean startAsUser(Activity activity, Bundle options, UserHandle user) {
        return mTargetInfos.get(mSelected).startAsUser(activity, options, user);
    }

}