Merge "Clean up Sharesheet pinning, add app icon, remove DS pin menu" into rvc-dev am: 7980546c03
Change-Id: Ieb7e627ea61d566b427ca2bba7714acf99444c70
This commit is contained in:
@@ -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,12 +2971,17 @@ public class ChooserActivity extends ResolverActivity implements
|
||||
if (isClickable) {
|
||||
itemView.setOnClickListener(v -> startSelected(mListPosition,
|
||||
false/* always */, true/* filterd */));
|
||||
itemView.setOnLongClickListener(v -> {
|
||||
showTargetDetails(
|
||||
mChooserMultiProfilePagerAdapter.getActiveListAdapter()
|
||||
.targetInfoForPosition(mListPosition, /* filtered */ true));
|
||||
return true;
|
||||
});
|
||||
|
||||
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((DisplayResolveInfo) ti);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
return 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 =
|
||||
|
||||
@@ -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;
|
||||
final PackageManager pm = getContext().getPackageManager();
|
||||
|
||||
if (mTargetInfos == null || mTargetInfos.size() < 2) {
|
||||
items = defaultActions;
|
||||
} else {
|
||||
// Pin item for each sub-item
|
||||
items = new CharSequence[mTargetInfos.size() + 1];
|
||||
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];
|
||||
// Pin item for each sub-item
|
||||
CharSequence[] items = new CharSequence[mTargetInfos.size()];
|
||||
for (int i = 0; i < mTargetInfos.size(); i++) {
|
||||
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);
|
||||
}
|
||||
pinComponent(mTargetInfos.get(which).getResolvedComponentName());
|
||||
((ChooserActivity) getActivity()).handlePackagesChanged();
|
||||
dismiss();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user