package com.android.launcher3.popup; import android.content.ComponentName; import android.content.Context; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.View; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.InfoDropTarget; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.model.WidgetItem; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.widget.WidgetsBottomSheet; import java.util.List; import static com.android.launcher3.userevent.nano.LauncherLogProto.Action; import static com.android.launcher3.userevent.nano.LauncherLogProto.ControlType; /** * Represents a system shortcut for a given app. The shortcut should have a static 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. */ public abstract class SystemShortcut extends ItemInfo { private final int mIconResId; private final int mLabelResId; public SystemShortcut(int iconResId, int labelResId) { mIconResId = iconResId; mLabelResId = labelResId; } public Drawable getIcon(Context context) { return context.getResources().getDrawable(mIconResId, context.getTheme()); } public String getLabel(Context context) { return context.getString(mLabelResId); } public abstract View.OnClickListener getOnClickListener(final Launcher launcher, final ItemInfo itemInfo); public static class Widgets extends SystemShortcut { public Widgets() { super(R.drawable.ic_widget, R.string.widget_button_text); } @Override public View.OnClickListener getOnClickListener(final Launcher launcher, final ItemInfo itemInfo) { if (!Utilities.isWorkspaceEditAllowed(launcher.getApplicationContext())) { return null; } final List widgets = launcher.getWidgetsForPackageUser(new PackageUserKey( itemInfo.getTargetComponent().getPackageName(), itemInfo.user)); if (widgets == null) { return null; } return new View.OnClickListener() { @Override public void onClick(View 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(final Launcher launcher, final ItemInfo itemInfo) { return new View.OnClickListener() { @Override public void onClick(View view) { Rect sourceBounds = launcher.getViewBounds(view); Bundle opts = launcher.getActivityLaunchOptions(view); InfoDropTarget.startDetailsActivityForInfo(itemInfo, launcher, null, sourceBounds, opts); launcher.getUserEventDispatcher().logActionOnControl(Action.Touch.TAP, ControlType.APPINFO_TARGET, view); } }; } } public static class AppEdit extends SystemShortcut { AppEdit() { super(R.drawable.ic_edit_app_no_shadow, R.string.app_edit_drop_target_label); } @Override public View.OnClickListener getOnClickListener(final Launcher launcher, final ItemInfo itemInfo) { return view -> { ComponentName componentName = itemInfo.getTargetComponent(); launcher.startEdit(itemInfo, componentName); }; } } }