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