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

Commit 6b4ba64a authored by Alison Cichowlas's avatar Alison Cichowlas Committed by Android (Google) Code Review
Browse files

Merge "Sharesheet: maintain dialog fragment state."

parents d0463050 c6c0a8c5
Loading
Loading
Loading
Loading
+17 −6
Original line number Diff line number Diff line
@@ -1655,18 +1655,24 @@ public class ChooserActivity extends ResolverActivity implements
    private void showTargetDetails(DisplayResolveInfo ti) {
        if (ti == null) return;

        List<DisplayResolveInfo> targetList;
        ArrayList<DisplayResolveInfo> targetList;

        // For multiple targets, include info on all targets
        if (ti instanceof MultiDisplayResolveInfo) {
            MultiDisplayResolveInfo mti = (MultiDisplayResolveInfo) ti;
            targetList = mti.getTargets();
        } else {
            targetList = Collections.singletonList(ti);
            targetList = new ArrayList<DisplayResolveInfo>();
            targetList.add(ti);
        }

        ChooserTargetActionsDialogFragment f = new ChooserTargetActionsDialogFragment(
                targetList, mChooserMultiProfilePagerAdapter.getCurrentUserHandle());
        ChooserTargetActionsDialogFragment f = new ChooserTargetActionsDialogFragment();
        Bundle b = new Bundle();
        b.putParcelable(ChooserTargetActionsDialogFragment.USER_HANDLE_KEY,
                mChooserMultiProfilePagerAdapter.getCurrentUserHandle());
        b.putParcelableArrayList(ChooserTargetActionsDialogFragment.TARGET_INFOS_KEY,
                targetList);
        f.setArguments(b);

        f.show(getFragmentManager(), TARGET_DETAILS_FRAGMENT_TAG);
    }
@@ -1725,9 +1731,14 @@ public class ChooserActivity extends ResolverActivity implements
        if (targetInfo instanceof MultiDisplayResolveInfo) {
            MultiDisplayResolveInfo mti = (MultiDisplayResolveInfo) targetInfo;
            if (!mti.hasSelected()) {
                ChooserStackedAppDialogFragment f = new ChooserStackedAppDialogFragment(
                        mti, which,
                ChooserStackedAppDialogFragment f = new ChooserStackedAppDialogFragment();
                Bundle b = new Bundle();
                b.putParcelable(ChooserTargetActionsDialogFragment.USER_HANDLE_KEY,
                        mChooserMultiProfilePagerAdapter.getCurrentUserHandle());
                b.putObject(ChooserStackedAppDialogFragment.MULTI_DRI_KEY,
                        mti);
                b.putInt(ChooserStackedAppDialogFragment.WHICH_KEY, which);
                f.setArguments(b);

                f.show(getFragmentManager(), TARGET_DETAILS_FRAGMENT_TAG);
                return;
+17 −6
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ package com.android.internal.app;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.UserHandle;

import com.android.internal.app.chooser.DisplayResolveInfo;
@@ -32,17 +33,26 @@ import com.android.internal.app.chooser.MultiDisplayResolveInfo;
public class ChooserStackedAppDialogFragment extends ChooserTargetActionsDialogFragment
        implements DialogInterface.OnClickListener {

    static final String WHICH_KEY = "which_key";
    static final String MULTI_DRI_KEY = "multi_dri_key";

    private MultiDisplayResolveInfo mMultiDisplayResolveInfo;
    private int mParentWhich;

    public ChooserStackedAppDialogFragment() {
    public ChooserStackedAppDialogFragment() {}

    void setStateFromBundle(Bundle b) {
        mMultiDisplayResolveInfo = (MultiDisplayResolveInfo) b.get(MULTI_DRI_KEY);
        mTargetInfos = mMultiDisplayResolveInfo.getTargets();
        mUserHandle = (UserHandle) b.get(USER_HANDLE_KEY);
        mParentWhich = b.getInt(WHICH_KEY);
    }

    public ChooserStackedAppDialogFragment(MultiDisplayResolveInfo targets,
            int parentWhich, UserHandle userHandle) {
        super(targets.getTargets(), userHandle);
        mMultiDisplayResolveInfo = targets;
        mParentWhich = parentWhich;
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(WHICH_KEY, mParentWhich);
        outState.putParcelable(MULTI_DRI_KEY, mMultiDisplayResolveInfo);
    }

    @Override
@@ -53,6 +63,7 @@ public class ChooserStackedAppDialogFragment extends ChooserTargetActionsDialogF

    @Override
    protected Drawable getItemIcon(DisplayResolveInfo dri) {

        // Show no icon for the group disambig dialog, null hides the imageview
        return null;
    }
+33 −16
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
@@ -59,25 +58,51 @@ import java.util.Optional;
public class ChooserTargetActionsDialogFragment extends DialogFragment
        implements DialogInterface.OnClickListener {

    protected List<DisplayResolveInfo> mTargetInfos = new ArrayList<>();
    protected ArrayList<DisplayResolveInfo> mTargetInfos = new ArrayList<>();
    protected UserHandle mUserHandle;

    public ChooserTargetActionsDialogFragment() {
    public static final String USER_HANDLE_KEY = "user_handle";
    public static final String TARGET_INFOS_KEY = "target_infos";

    public ChooserTargetActionsDialogFragment() {}

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            setStateFromBundle(savedInstanceState);
        } else {
            setStateFromBundle(getArguments());
        }
    }

    public ChooserTargetActionsDialogFragment(List<DisplayResolveInfo> targets,
            UserHandle userHandle) {
        mUserHandle = userHandle;
        mTargetInfos = targets;
    void setStateFromBundle(Bundle b) {
        mTargetInfos = (ArrayList<DisplayResolveInfo>) b.get(TARGET_INFOS_KEY);
        mUserHandle = (UserHandle) b.get(USER_HANDLE_KEY);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putParcelable(ChooserTargetActionsDialogFragment.USER_HANDLE_KEY,
                mUserHandle);
        outState.putParcelableArrayList(ChooserTargetActionsDialogFragment.TARGET_INFOS_KEY,
                mTargetInfos);
    }

    /**
     * Recreate the layout from scratch to match new Sharesheet redlines
     */
    @Override
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container,
            Bundle savedInstanceState) {

        if (savedInstanceState != null) {
            setStateFromBundle(savedInstanceState);
        } else {
            setStateFromBundle(getArguments());
        }
        // Make the background transparent to show dialog rounding
        Optional.of(getDialog()).map(Dialog::getWindow)
                .ifPresent(window -> {
@@ -204,12 +229,4 @@ public class ChooserTargetActionsDialogFragment extends DialogFragment
                mTargetInfos.get(0).getResolveInfo());
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // Dismiss on config changed (eg: rotation)
        // TODO: Maintain state on config change
        super.onConfigurationChanged(newConfig);
        dismiss();
    }

}
+41 −1
Original line number Diff line number Diff line
@@ -27,19 +27,22 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.UserHandle;

import com.android.internal.app.ResolverActivity;
import com.android.internal.app.ResolverListAdapter.ResolveInfoPresentationGetter;

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

/**
 * A TargetInfo plus additional information needed to render it (such as icon and label) and
 * resolve it to an activity.
 */
public class DisplayResolveInfo implements TargetInfo {
public class DisplayResolveInfo implements TargetInfo, Parcelable {
    // Temporary flag for new chooser delegate behavior. There are occassional token
    // permission errors from bouncing through the delegate. Watch out before reenabling:
    // b/157272342 is one example but this issue has been reported many times
@@ -202,4 +205,41 @@ public class DisplayResolveInfo implements TargetInfo {
        mPinned = pinned;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeCharSequence(mDisplayLabel);
        dest.writeCharSequence(mExtendedInfo);
        dest.writeParcelable(mResolvedIntent, 0);
        dest.writeParcelableArray((Intent[]) mSourceIntents.toArray(), 0);
        dest.writeBoolean(mIsSuspended);
        dest.writeBoolean(mPinned);
        dest.writeParcelable(mResolveInfo, 0);
    }

    public static final Parcelable.Creator<DisplayResolveInfo> CREATOR =
            new Parcelable.Creator<DisplayResolveInfo>() {
        public DisplayResolveInfo createFromParcel(Parcel in) {
            return new DisplayResolveInfo(in);
        }

        public DisplayResolveInfo[] newArray(int size) {
            return new DisplayResolveInfo[size];
        }
    };

    private DisplayResolveInfo(Parcel in) {
        mDisplayLabel = in.readCharSequence();
        mExtendedInfo = in.readCharSequence();
        mResolvedIntent = in.readParcelable(null /* ClassLoader */);
        mSourceIntents.addAll(
                Arrays.asList((Intent[]) in.readParcelableArray(null /* ClassLoader */)));
        mIsSuspended = in.readBoolean();
        mPinned = in.readBoolean();
        mResolveInfo = in.readParcelable(null /* ClassLoader */);
    }
}
+2 −3
Original line number Diff line number Diff line
@@ -23,14 +23,13 @@ import android.os.UserHandle;
import com.android.internal.app.ResolverActivity;

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

/**
 * Represents a "stack" of chooser targets for various activities within the same component.
 */
public class MultiDisplayResolveInfo extends DisplayResolveInfo {

    List<DisplayResolveInfo> mTargetInfos = new ArrayList<>();
    ArrayList<DisplayResolveInfo> mTargetInfos = new ArrayList<>();
    // We'll use this DRI for basic presentation info - eg icon, name.
    final DisplayResolveInfo mBaseInfo;
    // Index of selected target
@@ -61,7 +60,7 @@ public class MultiDisplayResolveInfo extends DisplayResolveInfo {
    /**
     * List of all DisplayResolveInfos included in this target.
     */
    public List<DisplayResolveInfo> getTargets() {
    public ArrayList<DisplayResolveInfo> getTargets() {
        return mTargetInfos;
    }