Loading core/java/com/android/internal/app/ChooserActivity.java +17 −6 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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; Loading core/java/com/android/internal/app/ChooserStackedAppDialogFragment.java +17 −6 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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; } Loading core/java/com/android/internal/app/ChooserTargetActionsDialogFragment.java +33 −16 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 -> { Loading Loading @@ -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(); } } core/java/com/android/internal/app/chooser/DisplayResolveInfo.java +41 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 */); } } core/java/com/android/internal/app/chooser/MultiDisplayResolveInfo.java +2 −3 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; } Loading Loading
core/java/com/android/internal/app/ChooserActivity.java +17 −6 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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; Loading
core/java/com/android/internal/app/ChooserStackedAppDialogFragment.java +17 −6 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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; } Loading
core/java/com/android/internal/app/ChooserTargetActionsDialogFragment.java +33 −16 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 -> { Loading Loading @@ -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(); } }
core/java/com/android/internal/app/chooser/DisplayResolveInfo.java +41 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 */); } }
core/java/com/android/internal/app/chooser/MultiDisplayResolveInfo.java +2 −3 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; } Loading