blob: 6560e16b526ca338a55350e627cc63f153d26af0 [file] [log] [blame]
Andrew Cole44898c32023-04-05 13:49:32 -07001package com.android.launcher3
2
3import android.content.ComponentName
4import android.view.View
5import com.android.launcher3.DropTarget.DragObject
6import com.android.launcher3.SecondaryDropTarget.DeferredOnComplete
7import com.android.launcher3.dragndrop.DragLayer
8import com.android.launcher3.logging.StatsLogManager.LauncherEvent
Andrew Cole44898c32023-04-05 13:49:32 -07009import com.android.launcher3.model.data.ItemInfo
10import com.android.launcher3.model.data.LauncherAppWidgetInfo
11import com.android.launcher3.util.IntSet
12import com.android.launcher3.util.PendingRequestArgs
13import com.android.launcher3.views.Snackbar
14
15/**
16 * Handler class for drop target actions that require modifying or interacting with launcher.
17 *
18 * This class is created by Launcher and provided the instance of launcher when created, which
19 * allows us to decouple drop target controllers from Launcher to enable easier testing.
20 */
21class DropTargetHandler(launcher: Launcher) {
22 val mLauncher: Launcher = launcher
23
Andrew Cole44898c32023-04-05 13:49:32 -070024 fun onDropAnimationComplete() {
25 mLauncher.stateManager.goToState(LauncherState.NORMAL)
26 }
27
28 fun onSecondaryTargetCompleteDrop(target: ComponentName?, d: DragObject) {
29 when (val dragSource = d.dragSource) {
30 is DeferredOnComplete -> {
31 val deferred: DeferredOnComplete = dragSource
32 if (d.dragSource is SecondaryDropTarget.DeferredOnComplete) {
33 target?.let {
34 deferred.mPackageName = it.packageName
35 mLauncher.addOnResumeCallback { deferred.onLauncherResume() }
36 }
37 ?: deferred.sendFailure()
38 }
39 }
40 }
41 }
42
43 fun reconfigureWidget(widgetId: Int, info: ItemInfo) {
44 mLauncher.setWaitingForResult(PendingRequestArgs.forWidgetInfo(widgetId, null, info))
45 mLauncher.appWidgetHolder.startConfigActivity(
46 mLauncher,
47 widgetId,
48 Launcher.REQUEST_RECONFIGURE_APPWIDGET
49 )
50 }
51
52 fun dismissPrediction(
53 announcement: CharSequence,
54 onActionClicked: Runnable,
55 onDismiss: Runnable?
56 ) {
57 mLauncher.dragLayer.announceForAccessibility(announcement)
58 Snackbar.show(mLauncher, R.string.item_removed, R.string.undo, onDismiss, onActionClicked)
59 }
60
61 fun getViewUnderDrag(info: ItemInfo): View? {
62 return if (
63 info is LauncherAppWidgetInfo &&
64 info.container == LauncherSettings.Favorites.CONTAINER_DESKTOP &&
65 mLauncher.workspace.dragInfo != null
66 ) {
67 mLauncher.workspace.dragInfo.cell
68 } else null
69 }
70
71 fun prepareToUndoDelete() {
72 mLauncher.modelWriter.prepareToUndoDelete()
73 }
74
75 fun onDeleteComplete(item: ItemInfo) {
76 var pageItem: ItemInfo = item
77 if (item.container <= 0) {
78 val v = mLauncher.workspace.getHomescreenIconByItemId(item.container)
79 v?.let { pageItem = v.tag as ItemInfo }
80 }
81 val pageIds =
82 if (pageItem.container == LauncherSettings.Favorites.CONTAINER_DESKTOP)
83 IntSet.wrap(pageItem.screenId)
84 else mLauncher.workspace.currentPageScreenIds
85 val onUndoClicked = Runnable {
86 mLauncher.setPagesToBindSynchronously(pageIds)
Sebastian Francoa64f3a62023-05-05 16:00:32 -060087 mLauncher.modelWriter.abortDelete()
Andrew Cole44898c32023-04-05 13:49:32 -070088 mLauncher.statsLogManager.logger().log(LauncherEvent.LAUNCHER_UNDO)
89 }
90
91 Snackbar.show(
92 mLauncher,
93 R.string.item_removed,
94 R.string.undo,
Sebastian Francoa64f3a62023-05-05 16:00:32 -060095 mLauncher.modelWriter::commitDelete,
Andrew Cole44898c32023-04-05 13:49:32 -070096 onUndoClicked
97 )
98 }
99
100 fun onAccessibilityDelete(view: View?, item: ItemInfo, announcement: CharSequence) {
101 // Remove the item from launcher and the db, we can ignore the containerInfo in this call
102 // because we already remove the drag view from the folder (if the drag originated from
103 // a folder) in Folder.beginDrag()
104 mLauncher.removeItem(view, item, true /* deleteFromDb */, "removed by accessibility drop")
105 mLauncher.workspace.stripEmptyScreens()
106 mLauncher.dragLayer.announceForAccessibility(announcement)
107 }
108
109 fun getDragLayer(): DragLayer {
110 return mLauncher.dragLayer
111 }
112
113 fun onClick(buttonDropTarget: ButtonDropTarget) {
114 mLauncher.accessibilityDelegate.handleAccessibleDrop(buttonDropTarget, null, null)
115 }
116}