package com.android.launcher3.popup; import android.content.Intent; import android.graphics.Rect; 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.ShortcutInfo; import com.android.launcher3.model.WidgetItem; 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; 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 { public final int iconResId; public final int labelResId; public SystemShortcut(int iconResId, int labelResId) { this.iconResId = iconResId; this.labelResId = labelResId; } 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) { final List widgets = launcher.getPopupDataProvider().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, sourceBounds, opts); launcher.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(final Launcher launcher, final ItemInfo itemInfo) { boolean supportsWebUI = (itemInfo instanceof ShortcutInfo) && ((ShortcutInfo) itemInfo).hasStatusFlag(ShortcutInfo.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(launcher).isInstantApp(appInfo); } boolean enabled = supportsWebUI || isInstantApp; if (!enabled) { return null; } return new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = PackageManagerHelper.getMarketIntent(itemInfo .getTargetComponent().getPackageName()); launcher.startActivitySafely(view, intent, itemInfo); AbstractFloatingView.closeAllOpenViews(launcher); } }; } } }