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