diff --git a/core/java/com/android/internal/app/ChooserTargetActionsDialogFragment.java b/core/java/com/android/internal/app/ChooserTargetActionsDialogFragment.java index 3991a7674f38b..21063d5d5857b 100644 --- a/core/java/com/android/internal/app/ChooserTargetActionsDialogFragment.java +++ b/core/java/com/android/internal/app/ChooserTargetActionsDialogFragment.java @@ -26,7 +26,6 @@ import static java.util.stream.Collectors.toList; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; -import android.app.AlertDialog.Builder; import android.app.Dialog; import android.app.DialogFragment; import android.content.ComponentName; @@ -34,21 +33,25 @@ 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; import android.os.Bundle; import android.os.UserHandle; import android.util.Pair; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; import com.android.internal.R; import com.android.internal.app.chooser.DisplayResolveInfo; +import com.android.internal.widget.RecyclerView; import java.util.ArrayList; import java.util.List; +import java.util.Optional; /** * Shows a dialog with actions to take on a chooser target. @@ -68,47 +71,86 @@ public class ChooserTargetActionsDialogFragment extends DialogFragment mTargetInfos = targets; } - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { + /** + * Recreate the layout from scratch to match new Sharesheet redlines + */ + public View onCreateView(LayoutInflater inflater, + @Nullable ViewGroup container, + Bundle savedInstanceState) { + + // Make the background transparent to show dialog rounding + Optional.of(getDialog()).map(Dialog::getWindow) + .ifPresent(window -> { + window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + }); // Fetch UI details from target info - List> items = mTargetInfos.stream().map(dri -> { - return new Pair<>(getItemLabel(dri), getItemIcon(dri)); + List> items = mTargetInfos.stream().map(dri -> { + return new Pair<>(getItemIcon(dri), getItemLabel(dri)); }).collect(toList()); + View v = inflater.inflate(R.layout.chooser_dialog, container, false); + + TextView title = v.findViewById(R.id.title); + ImageView icon = v.findViewById(R.id.icon); + RecyclerView rv = v.findViewById(R.id.listContainer); + final ResolveInfoPresentationGetter pg = getProvidingAppPresentationGetter(); - return new Builder(getContext()) - .setTitle(pg.getLabel()) - .setIcon(pg.getIcon(mUserHandle)) - .setCancelable(true) - .setAdapter(getAdapterForContent(items), this) - .create(); + title.setText(pg.getLabel()); + icon.setImageDrawable(pg.getIcon(mUserHandle)); + rv.setAdapter(new VHAdapter(items)); + + return v; } - protected ArrayAdapter> getAdapterForContent( - List> items) { - return new ArrayAdapter>(getContext(), - R.layout.chooser_dialog_item, R.id.text, items) { - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View v = super.getView(position, convertView, parent); // super recycles views - TextView label = v.findViewById(R.id.text); - ImageView icon = v.findViewById(R.id.icon); + class VHAdapter extends RecyclerView.Adapter { - Pair pair = getItem(position); - label.setText(pair.first); + List> mItems; - // Hide icon view if one isn't available - if (pair.second == null) { - icon.setVisibility(View.GONE); - } else { - icon.setImageDrawable(pair.second); - icon.setVisibility(View.VISIBLE); - } + VHAdapter(List> items) { + mItems = items; + } - return v; + @NonNull + @Override + public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new VH(LayoutInflater.from(parent.getContext()).inflate( + R.layout.chooser_dialog_item, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull VH holder, int position) { + holder.bind(mItems.get(position), position); + } + + @Override + public int getItemCount() { + return mItems.size(); + } + } + + class VH extends RecyclerView.ViewHolder { + TextView mLabel; + ImageView mIcon; + + VH(@NonNull View itemView) { + super(itemView); + mLabel = itemView.findViewById(R.id.text); + mIcon = itemView.findViewById(R.id.icon); + } + + public void bind(Pair item, int position) { + mLabel.setText(item.second); + + if (item.first == null) { + mIcon.setVisibility(View.GONE); + } else { + mIcon.setVisibility(View.VISIBLE); + mIcon.setImageDrawable(item.first); } - }; + + itemView.setOnClickListener(v -> onClick(getDialog(), position)); + } } @Override diff --git a/core/res/res/drawable/chooser_dialog_background.xml b/core/res/res/drawable/chooser_dialog_background.xml new file mode 100644 index 0000000000000..b914d63187e70 --- /dev/null +++ b/core/res/res/drawable/chooser_dialog_background.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/core/res/res/layout/chooser_dialog.xml b/core/res/res/layout/chooser_dialog.xml new file mode 100644 index 0000000000000..824136cd970aa --- /dev/null +++ b/core/res/res/layout/chooser_dialog.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/res/res/layout/chooser_dialog_item.xml b/core/res/res/layout/chooser_dialog_item.xml index 1d6369793bfbc..4a88bb02372e3 100644 --- a/core/res/res/layout/chooser_dialog_item.xml +++ b/core/res/res/layout/chooser_dialog_item.xml @@ -16,27 +16,28 @@ --> + android:layout_height="wrap_content"> - + android:alpha="0.54" + android:tint="?android:attr/textColorPrimary" + android:layout_marginEnd="16dp" + android:layout_width="24dp" + android:layout_height="24dp"/> - diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 19d2e7d75302b..c82b3a1eb7827 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3839,7 +3839,9 @@ + +