1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.launcher3; 18 19 import android.graphics.Rect; 20 21 import com.android.launcher3.accessibility.DragViewStateAnnouncer; 22 import com.android.launcher3.dragndrop.DragView; 23 24 /** 25 * Interface defining an object that can receive a drag. 26 * 27 */ 28 public interface DropTarget { 29 30 class DragObject { 31 public int x = -1; 32 public int y = -1; 33 34 /** X offset from the upper-left corner of the cell to where we touched. */ 35 public int xOffset = -1; 36 37 /** Y offset from the upper-left corner of the cell to where we touched. */ 38 public int yOffset = -1; 39 40 /** This indicates whether a drag is in final stages, either drop or cancel. It 41 * differentiates onDragExit, since this is called when the drag is ending, above 42 * the current drag target, or when the drag moves off the current drag object. 43 */ 44 public boolean dragComplete = false; 45 46 /** The view that moves around while you drag. */ 47 public DragView dragView = null; 48 49 /** The data associated with the object, after item is dropped. */ 50 public ItemInfo dragInfo = null; 51 52 /** The data associated with the object being dragged */ 53 public ItemInfo originalDragInfo = null; 54 55 /** Where the drag originated */ 56 public DragSource dragSource = null; 57 58 /** The object is part of an accessible drag operation */ 59 public boolean accessibleDrag; 60 61 /** Post drag animation runnable */ 62 public Runnable postAnimationRunnable = null; 63 64 /** Indicates that the drag operation was cancelled */ 65 public boolean cancelled = false; 66 67 /** Defers removing the DragView from the DragLayer until after the drop animation. */ 68 public boolean deferDragViewCleanupPostAnimation = true; 69 70 public DragViewStateAnnouncer stateAnnouncer; 71 72 public DragObject() { 73 } 74 75 /** 76 * This is used to compute the visual center of the dragView. This point is then 77 * used to visualize drop locations and determine where to drop an item. The idea is that 78 * the visual center represents the user's interpretation of where the item is, and hence 79 * is the appropriate point to use when determining drop location. 80 */ 81 public final float[] getVisualCenter(float[] recycle) { 82 final float res[] = (recycle == null) ? new float[2] : recycle; 83 84 // These represent the visual top and left of drag view if a dragRect was provided. 85 // If a dragRect was not provided, then they correspond to the actual view left and 86 // top, as the dragRect is in that case taken to be the entire dragView. 87 // R.dimen.dragViewOffsetY. 88 int left = x - xOffset; 89 int top = y - yOffset; 90 91 // In order to find the visual center, we shift by half the dragRect 92 res[0] = left + dragView.getDragRegion().width() / 2; 93 res[1] = top + dragView.getDragRegion().height() / 2; 94 95 return res; 96 } 97 } 98 99 /** 100 * Used to temporarily disable certain drop targets 101 * 102 * @return boolean specifying whether this drop target is currently enabled 103 */ 104 boolean isDropEnabled(); 105 106 /** 107 * Handle an object being dropped on the DropTarget 108 */ 109 void onDrop(DragObject dragObject); 110 111 void onDragEnter(DragObject dragObject); 112 113 void onDragOver(DragObject dragObject); 114 115 void onDragExit(DragObject dragObject); 116 117 /** 118 * Check if a drop action can occur at, or near, the requested location. 119 * This will be called just before onDrop. 120 * @return True if the drop will be accepted, false otherwise. 121 */ 122 boolean acceptDrop(DragObject dragObject); 123 124 void prepareAccessibilityDrop(); 125 126 // These methods are implemented in Views 127 void getHitRectRelativeToDragLayer(Rect outRect); 128 } 129