• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.android.launcher3
2 
3 import android.content.ComponentName
4 import android.view.View
5 import com.android.launcher3.DropTarget.DragObject
6 import com.android.launcher3.SecondaryDropTarget.DeferredOnComplete
7 import com.android.launcher3.dragndrop.DragLayer
8 import com.android.launcher3.logging.StatsLogManager.LauncherEvent
9 import com.android.launcher3.model.data.ItemInfo
10 import com.android.launcher3.model.data.LauncherAppWidgetInfo
11 import com.android.launcher3.util.IntSet
12 import com.android.launcher3.util.PendingRequestArgs
13 import 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  */
21 class DropTargetHandler(launcher: Launcher) {
22     val mLauncher: Launcher = launcher
23 
onDropAnimationCompletenull24     fun onDropAnimationComplete() {
25         mLauncher.stateManager.goToState(LauncherState.NORMAL)
26     }
27 
onSecondaryTargetCompleteDropnull28     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 
reconfigureWidgetnull43     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 
dismissPredictionnull52     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 
getViewUnderDragnull61     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 
prepareToUndoDeletenull71     fun prepareToUndoDelete() {
72         mLauncher.modelWriter.prepareToUndoDelete()
73     }
74 
onDeleteCompletenull75     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)
87             mLauncher.modelWriter.abortDelete()
88             mLauncher.statsLogManager.logger().log(LauncherEvent.LAUNCHER_UNDO)
89         }
90 
91         Snackbar.show(
92             mLauncher,
93             R.string.item_removed,
94             R.string.undo,
95             mLauncher.modelWriter::commitDelete,
96             onUndoClicked
97         )
98     }
99 
onAccessibilityDeletenull100     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 
getDragLayernull109     fun getDragLayer(): DragLayer {
110         return mLauncher.dragLayer
111     }
112 
onClicknull113     fun onClick(buttonDropTarget: ButtonDropTarget) {
114         mLauncher.accessibilityDelegate.handleAccessibleDrop(buttonDropTarget, null, null)
115     }
116 }
117