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

Commit 053ecd88 authored by Mike Digman's avatar Mike Digman Committed by Automerger Merge Worker
Browse files

Merge "Clean up Sharesheet pinning, add app icon, remove DS pin menu" into...

Merge "Clean up Sharesheet pinning, add app icon, remove DS pin menu" into rvc-dev am: 7980546c am: 4d9d1f73

Change-Id: I6f375d644573cecaedbfc0558836676c1a1c1ab9
parents 8ce47345 4d9d1f73
Loading
Loading
Loading
Loading
+33 −33
Original line number Diff line number Diff line
@@ -99,7 +99,6 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.AccelerateInterpolator;
@@ -1622,32 +1621,22 @@ public class ChooserActivity extends ResolverActivity implements
        return getIntent().getBooleanExtra(Intent.EXTRA_AUTO_LAUNCH_SINGLE_CHOICE, true);
    }

    void showTargetDetails(TargetInfo ti) {
        if (ti == null) {
            return;
        }
        ComponentName name = ti.getResolveInfo().activityInfo.getComponentName();
        boolean pinned = mPinnedSharedPrefs.getBoolean(name.flattenToString(), false);
    private void showTargetDetails(DisplayResolveInfo ti) {
        if (ti == null) return;

        ResolverTargetActionsDialogFragment f;
        List<DisplayResolveInfo> targetList;

        // For multiple targets, include info on all targets
        if (ti instanceof MultiDisplayResolveInfo) {
            MultiDisplayResolveInfo mti = (MultiDisplayResolveInfo) ti;
            List<CharSequence> labels = new ArrayList<>();

            for (TargetInfo innerInfo : mti.getTargets()) {
                labels.add(innerInfo.getResolveInfo().loadLabel(getPackageManager()));
            }
            f = new ResolverTargetActionsDialogFragment(mti.getDisplayLabel(), name,
                    mti.getTargets(), labels,
                    mChooserMultiProfilePagerAdapter.getCurrentUserHandle());
            targetList = mti.getTargets();
        } else {
            f = new ResolverTargetActionsDialogFragment(
                    ti.getResolveInfo().loadLabel(getPackageManager()), name, pinned,
                    mChooserMultiProfilePagerAdapter.getCurrentUserHandle());
            targetList = Collections.singletonList(ti);
        }

        ResolverTargetActionsDialogFragment f = new ResolverTargetActionsDialogFragment(
                targetList, mChooserMultiProfilePagerAdapter.getCurrentUserHandle());

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

@@ -2982,15 +2971,20 @@ public class ChooserActivity extends ResolverActivity implements
            if (isClickable) {
                itemView.setOnClickListener(v -> startSelected(mListPosition,
                        false/* always */, true/* filterd */));

                TargetInfo ti = mChooserMultiProfilePagerAdapter.getActiveListAdapter()
                        .targetInfoForPosition(mListPosition, /* filtered */ true);

                // This should always be the case for ItemViewHolder, check for sanity
                if (ti instanceof DisplayResolveInfo) {
                    itemView.setOnLongClickListener(v -> {
                    showTargetDetails(
                            mChooserMultiProfilePagerAdapter.getActiveListAdapter()
                                    .targetInfoForPosition(mListPosition, /* filtered */ true));
                        showTargetDetails((DisplayResolveInfo) ti);
                        return true;
                    });
                }
            }
        }
    }

    /**
     * Add a footer to the list, to support scrolling behavior below the navbar.
@@ -3312,15 +3306,21 @@ public class ChooserActivity extends ResolverActivity implements
                        startSelected(holder.getItemIndex(column), false, true);
                    }
                });
                v.setOnLongClickListener(new OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        showTargetDetails(
                                mChooserListAdapter.targetInfoForPosition(
                                        holder.getItemIndex(column), true));

                // Direct Share targets should not show any menu
                if (!isDirectShare) {
                    final TargetInfo ti = mChooserListAdapter.targetInfoForPosition(
                            holder.getItemIndex(column), true);

                    // This should always be the case for non-DS targets, check for sanity
                    if (ti instanceof DisplayResolveInfo) {
                        v.setOnLongClickListener(v1 -> {
                            showTargetDetails((DisplayResolveInfo) ti);
                            return true;
                    }
                        });
                    }
                }

                holder.addView(i, v);

                // Force Direct Share to be 2 lines and auto-wrap to second line via hoz scroll =
+31 −68
Original line number Diff line number Diff line
@@ -17,21 +17,25 @@

package com.android.internal.app;

import static android.content.Context.ACTIVITY_SERVICE;

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

import android.app.ActivityManager;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.os.UserHandle;
import android.provider.Settings;

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

import java.util.ArrayList;
import java.util.List;
@@ -41,94 +45,53 @@ import java.util.List;
 */
public class ResolverTargetActionsDialogFragment extends DialogFragment
        implements DialogInterface.OnClickListener {
    private static final String NAME_KEY = "componentName";
    private static final String TITLE_KEY = "title";
    private static final String PINNED_KEY = "pinned";
    private static final String USER_ID_KEY = "userId";

    // Sync with R.array.resolver_target_actions_* resources
    private static final int TOGGLE_PIN_INDEX = 0;
    private static final int APP_INFO_INDEX = 1;

    private List<DisplayResolveInfo> mTargetInfos = new ArrayList<>();
    private List<CharSequence> mLabels = new ArrayList<>();
    private boolean[] mPinned;
    private UserHandle mUserHandle;

    public ResolverTargetActionsDialogFragment() {
    }

    public ResolverTargetActionsDialogFragment(CharSequence title, ComponentName name,
            boolean pinned, UserHandle userHandle) {
        Bundle args = new Bundle();
        args.putCharSequence(TITLE_KEY, title);
        args.putParcelable(NAME_KEY, name);
        args.putBoolean(PINNED_KEY, pinned);
        args.putParcelable(USER_ID_KEY, userHandle);
        setArguments(args);
    }

    public ResolverTargetActionsDialogFragment(CharSequence title, ComponentName name,
            List<DisplayResolveInfo> targets, List<CharSequence> labels, UserHandle userHandle) {
        Bundle args = new Bundle();
        args.putCharSequence(TITLE_KEY, title);
        args.putParcelable(NAME_KEY, name);
        args.putParcelable(USER_ID_KEY, userHandle);
    public ResolverTargetActionsDialogFragment(List<DisplayResolveInfo> targets,
            UserHandle userHandle) {
        mUserHandle = userHandle;
        mTargetInfos = targets;
        mLabels = labels;
        setArguments(args);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Bundle args = getArguments();
        final int itemRes = args.getBoolean(PINNED_KEY, false)
                ? R.array.resolver_target_actions_unpin
                : R.array.resolver_target_actions_pin;
        String[] defaultActions = getResources().getStringArray(itemRes);
        CharSequence[] items;

        if (mTargetInfos == null || mTargetInfos.size() < 2) {
            items = defaultActions;
        } else {
        final PackageManager pm = getContext().getPackageManager();

        // Pin item for each sub-item
            items = new CharSequence[mTargetInfos.size() + 1];
        CharSequence[] items = new CharSequence[mTargetInfos.size()];
        for (int i = 0; i < mTargetInfos.size(); i++) {
                items[i] = mTargetInfos.get(i).isPinned()
                         ? getResources().getString(R.string.unpin_specific_target, mLabels.get(i))
                         : getResources().getString(R.string.pin_specific_target, mLabels.get(i));
            }
            // "App info"
            items[mTargetInfos.size()] = defaultActions[1];
            final TargetInfo ti = mTargetInfos.get(i);
            final CharSequence label = ti.getResolveInfo().loadLabel(pm);
            items[i] = ti.isPinned()
                     ? getResources().getString(R.string.unpin_specific_target, label)
                     : getResources().getString(R.string.pin_specific_target, label);
        }

        // Use the matching application icon and label for the title, any TargetInfo will do
        final ActivityManager am = (ActivityManager) getContext()
                .getSystemService(ACTIVITY_SERVICE);
        final int iconDpi = am.getLauncherLargeIconDensity();
        final ResolveInfoPresentationGetter pg = new ResolveInfoPresentationGetter(getContext(),
                iconDpi, mTargetInfos.get(0).getResolveInfo());

        return new Builder(getContext())
                .setTitle(pg.getLabel())
                .setIcon(pg.getIcon(mUserHandle))
                .setCancelable(true)
                .setItems(items, this)
                .setTitle(args.getCharSequence(TITLE_KEY))
                .create();
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        final Bundle args = getArguments();
        ComponentName name = args.getParcelable(NAME_KEY);
        if (which == 0 || (mTargetInfos.size() > 0 && which < mTargetInfos.size())) {
            if (mTargetInfos == null || mTargetInfos.size() == 0) {
                pinComponent(name);
            } else {
        pinComponent(mTargetInfos.get(which).getResolvedComponentName());
            }
            // Force the chooser to requery and resort things
        ((ChooserActivity) getActivity()).handlePackagesChanged();
        } else {
            // Last item in dialog is App Info
            Intent in = new Intent().setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
                    .setData(Uri.fromParts("package", name.getPackageName(), null))
                    .addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
            UserHandle userHandle = args.getParcelable(USER_ID_KEY);
            getActivity().startActivityAsUser(in, userHandle);
        }
        dismiss();
    }