mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-27 15:26:58 +00:00
Test: LongPress on a pridicted app to see dismiss options. Bug:139020180 Change-Id: I877863c65def0d845c0ae2f0987fe7a4f6277565
234 lines
9.1 KiB
Java
234 lines
9.1 KiB
Java
package com.android.launcher3.popup;
|
|
|
|
|
|
import android.app.ActivityOptions;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.graphics.Rect;
|
|
import android.graphics.drawable.Icon;
|
|
import android.os.Handler;
|
|
import android.os.Looper;
|
|
import android.view.View;
|
|
import android.view.accessibility.AccessibilityNodeInfo;
|
|
import android.widget.ImageView;
|
|
import android.widget.TextView;
|
|
|
|
import com.android.launcher3.AbstractFloatingView;
|
|
import com.android.launcher3.BaseDraggingActivity;
|
|
import com.android.launcher3.ItemInfo;
|
|
import com.android.launcher3.Launcher;
|
|
import com.android.launcher3.LauncherSettings;
|
|
import com.android.launcher3.R;
|
|
import com.android.launcher3.WorkspaceItemInfo;
|
|
import com.android.launcher3.config.FeatureFlags;
|
|
import com.android.launcher3.model.AppLaunchTracker;
|
|
import com.android.launcher3.model.WidgetItem;
|
|
import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
|
|
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
|
|
import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType;
|
|
import com.android.launcher3.util.InstantAppResolver;
|
|
import com.android.launcher3.util.PackageManagerHelper;
|
|
import com.android.launcher3.util.PackageUserKey;
|
|
import com.android.launcher3.widget.WidgetsBottomSheet;
|
|
|
|
import java.util.List;
|
|
/**
|
|
* Represents a system shortcut for a given app. The shortcut should have a label and icon, and an
|
|
* onClickListener that depends on the item that the shortcut services.
|
|
*
|
|
* Example system shortcuts, defined as inner classes, include Widgets and AppInfo.
|
|
* @param <T>
|
|
*/
|
|
public abstract class SystemShortcut<T extends BaseDraggingActivity>
|
|
extends ItemInfo {
|
|
private final int mIconResId;
|
|
private final int mLabelResId;
|
|
private final Icon mIcon;
|
|
private final CharSequence mLabel;
|
|
private final CharSequence mContentDescription;
|
|
private final int mAccessibilityActionId;
|
|
|
|
public SystemShortcut(int iconResId, int labelResId) {
|
|
mIconResId = iconResId;
|
|
mLabelResId = labelResId;
|
|
mAccessibilityActionId = labelResId;
|
|
mIcon = null;
|
|
mLabel = null;
|
|
mContentDescription = null;
|
|
}
|
|
|
|
public SystemShortcut(Icon icon, CharSequence label, CharSequence contentDescription,
|
|
int accessibilityActionId) {
|
|
mIcon = icon;
|
|
mLabel = label;
|
|
mContentDescription = contentDescription;
|
|
mAccessibilityActionId = accessibilityActionId;
|
|
mIconResId = 0;
|
|
mLabelResId = 0;
|
|
}
|
|
|
|
public SystemShortcut(SystemShortcut other) {
|
|
mIconResId = other.mIconResId;
|
|
mLabelResId = other.mLabelResId;
|
|
mIcon = other.mIcon;
|
|
mLabel = other.mLabel;
|
|
mContentDescription = other.mContentDescription;
|
|
mAccessibilityActionId = other.mAccessibilityActionId;
|
|
}
|
|
|
|
/**
|
|
* Should be in the left group of icons in app's context menu header.
|
|
*/
|
|
public boolean isLeftGroup() {
|
|
return false;
|
|
}
|
|
|
|
public void setIconAndLabelFor(View iconView, TextView labelView) {
|
|
if (mIcon != null) {
|
|
mIcon.loadDrawableAsync(iconView.getContext(),
|
|
iconView::setBackground,
|
|
new Handler(Looper.getMainLooper()));
|
|
} else {
|
|
iconView.setBackgroundResource(mIconResId);
|
|
}
|
|
|
|
if (mLabel != null) {
|
|
labelView.setText(mLabel);
|
|
} else {
|
|
labelView.setText(mLabelResId);
|
|
}
|
|
}
|
|
|
|
public void setIconAndContentDescriptionFor(ImageView view) {
|
|
if (mIcon != null) {
|
|
mIcon.loadDrawableAsync(view.getContext(),
|
|
view::setImageDrawable,
|
|
new Handler(Looper.getMainLooper()));
|
|
} else {
|
|
view.setImageResource(mIconResId);
|
|
}
|
|
|
|
view.setContentDescription(getContentDescription(view.getContext()));
|
|
}
|
|
|
|
private CharSequence getContentDescription(Context context) {
|
|
return mContentDescription != null ? mContentDescription : context.getText(mLabelResId);
|
|
}
|
|
|
|
public AccessibilityNodeInfo.AccessibilityAction createAccessibilityAction(Context context) {
|
|
return new AccessibilityNodeInfo.AccessibilityAction(mAccessibilityActionId,
|
|
getContentDescription(context));
|
|
}
|
|
|
|
public boolean hasHandlerForAction(int action) {
|
|
return mAccessibilityActionId == action;
|
|
}
|
|
|
|
public abstract View.OnClickListener getOnClickListener(T activity, ItemInfo itemInfo);
|
|
|
|
public static class Widgets extends SystemShortcut<Launcher> {
|
|
|
|
public Widgets() {
|
|
super(R.drawable.ic_widget, R.string.widget_button_text);
|
|
}
|
|
|
|
@Override
|
|
public View.OnClickListener getOnClickListener(final Launcher launcher,
|
|
final ItemInfo itemInfo) {
|
|
final List<WidgetItem> widgets =
|
|
launcher.getPopupDataProvider().getWidgetsForPackageUser(new PackageUserKey(
|
|
itemInfo.getTargetComponent().getPackageName(), itemInfo.user));
|
|
if (widgets == null) {
|
|
return null;
|
|
}
|
|
return (view) -> {
|
|
AbstractFloatingView.closeAllOpenViews(launcher);
|
|
WidgetsBottomSheet widgetsBottomSheet =
|
|
(WidgetsBottomSheet) launcher.getLayoutInflater().inflate(
|
|
R.layout.widgets_bottom_sheet, launcher.getDragLayer(), false);
|
|
widgetsBottomSheet.populateAndShow(itemInfo);
|
|
launcher.getUserEventDispatcher().logActionOnControl(Action.Touch.TAP,
|
|
ControlType.WIDGETS_BUTTON, view);
|
|
};
|
|
}
|
|
}
|
|
|
|
public static class AppInfo extends SystemShortcut {
|
|
public AppInfo() {
|
|
super(R.drawable.ic_info_no_shadow, R.string.app_info_drop_target_label);
|
|
}
|
|
|
|
@Override
|
|
public View.OnClickListener getOnClickListener(
|
|
BaseDraggingActivity activity, ItemInfo itemInfo) {
|
|
return (view) -> {
|
|
dismissTaskMenuView(activity);
|
|
Rect sourceBounds = activity.getViewBounds(view);
|
|
new PackageManagerHelper(activity).startDetailsActivityForInfo(
|
|
itemInfo, sourceBounds, ActivityOptions.makeBasic().toBundle());
|
|
activity.getUserEventDispatcher().logActionOnControl(Action.Touch.TAP,
|
|
ControlType.APPINFO_TARGET, view);
|
|
};
|
|
}
|
|
}
|
|
|
|
public static class Install extends SystemShortcut {
|
|
public Install() {
|
|
super(R.drawable.ic_install_no_shadow, R.string.install_drop_target_label);
|
|
}
|
|
|
|
@Override
|
|
public View.OnClickListener getOnClickListener(
|
|
BaseDraggingActivity activity, ItemInfo itemInfo) {
|
|
boolean supportsWebUI = (itemInfo instanceof WorkspaceItemInfo) &&
|
|
((WorkspaceItemInfo) itemInfo).hasStatusFlag(WorkspaceItemInfo.FLAG_SUPPORTS_WEB_UI);
|
|
boolean isInstantApp = false;
|
|
if (itemInfo instanceof com.android.launcher3.AppInfo) {
|
|
com.android.launcher3.AppInfo appInfo = (com.android.launcher3.AppInfo) itemInfo;
|
|
isInstantApp = InstantAppResolver.newInstance(activity).isInstantApp(appInfo);
|
|
}
|
|
boolean enabled = supportsWebUI || isInstantApp;
|
|
if (!enabled) {
|
|
return null;
|
|
}
|
|
return createOnClickListener(activity, itemInfo);
|
|
}
|
|
|
|
public View.OnClickListener createOnClickListener(
|
|
BaseDraggingActivity activity, ItemInfo itemInfo) {
|
|
return view -> {
|
|
Intent intent = new PackageManagerHelper(view.getContext()).getMarketIntent(
|
|
itemInfo.getTargetComponent().getPackageName());
|
|
activity.startActivitySafely(view, intent, itemInfo, null);
|
|
AbstractFloatingView.closeAllOpenViews(activity);
|
|
};
|
|
}
|
|
}
|
|
|
|
public static class DismissPrediction extends SystemShortcut<Launcher> {
|
|
public DismissPrediction() {
|
|
super(R.drawable.ic_remove_no_shadow, R.string.dismiss_prediction_label);
|
|
}
|
|
|
|
@Override
|
|
public View.OnClickListener getOnClickListener(Launcher activity, ItemInfo itemInfo) {
|
|
if (!FeatureFlags.ENABLE_PREDICTION_DISMISS.get()) return null;
|
|
if (itemInfo.container != LauncherSettings.Favorites.CONTAINER_PREDICTION) return null;
|
|
return (view) -> {
|
|
PopupContainerWithArrow.closeAllOpenViews(activity);
|
|
activity.getUserEventDispatcher().logActionOnControl(Action.Touch.TAP,
|
|
ControlType.DISMISS_PREDICTION, ContainerType.DEEPSHORTCUTS);
|
|
AppLaunchTracker.INSTANCE.get(view.getContext())
|
|
.onDismissApp(itemInfo.getTargetComponent(),
|
|
itemInfo.user,
|
|
AppLaunchTracker.CONTAINER_PREDICTIONS);
|
|
};
|
|
}
|
|
}
|
|
|
|
protected static void dismissTaskMenuView(BaseDraggingActivity activity) {
|
|
AbstractFloatingView.closeOpenViews(activity, true,
|
|
AbstractFloatingView.TYPE_ALL & ~AbstractFloatingView.TYPE_REBIND_SAFE);
|
|
}
|
|
}
|