1 /*
2  * Copyright (C) 2010 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.launcher2;
18 
19 import android.content.Context;
20 import android.content.res.Resources;
21 import android.graphics.PointF;
22 import android.graphics.Rect;
23 import android.graphics.drawable.Drawable;
24 import android.util.AttributeSet;
25 import android.view.View;
26 import android.widget.TextView;
27 
28 import com.android.launcher.R;
29 
30 
31 /**
32  * Implements a DropTarget.
33  */
34 public class ButtonDropTarget extends TextView implements DropTarget, DragController.DragListener {
35 
36     protected final int mTransitionDuration;
37 
38     protected Launcher mLauncher;
39     private int mBottomDragPadding;
40     protected TextView mText;
41     protected SearchDropTargetBar mSearchDropTargetBar;
42 
43     /** Whether this drop target is active for the current drag */
44     protected boolean mActive;
45 
46     /** The paint applied to the drag view on hover */
47     protected int mHoverColor = 0;
48 
ButtonDropTarget(Context context, AttributeSet attrs)49     public ButtonDropTarget(Context context, AttributeSet attrs) {
50         this(context, attrs, 0);
51     }
52 
ButtonDropTarget(Context context, AttributeSet attrs, int defStyle)53     public ButtonDropTarget(Context context, AttributeSet attrs, int defStyle) {
54         super(context, attrs, defStyle);
55 
56         Resources r = getResources();
57         mTransitionDuration = r.getInteger(R.integer.config_dropTargetBgTransitionDuration);
58         mBottomDragPadding = r.getDimensionPixelSize(R.dimen.drop_target_drag_padding);
59     }
60 
setLauncher(Launcher launcher)61     void setLauncher(Launcher launcher) {
62         mLauncher = launcher;
63     }
64 
acceptDrop(DragObject d)65     public boolean acceptDrop(DragObject d) {
66         return false;
67     }
68 
setSearchDropTargetBar(SearchDropTargetBar searchDropTargetBar)69     public void setSearchDropTargetBar(SearchDropTargetBar searchDropTargetBar) {
70         mSearchDropTargetBar = searchDropTargetBar;
71     }
72 
getCurrentDrawable()73     protected Drawable getCurrentDrawable() {
74         Drawable[] drawables = getCompoundDrawablesRelative();
75         for (int i = 0; i < drawables.length; ++i) {
76             if (drawables[i] != null) {
77                 return drawables[i];
78             }
79         }
80         return null;
81     }
82 
onDrop(DragObject d)83     public void onDrop(DragObject d) {
84     }
85 
onFlingToDelete(DragObject d, int x, int y, PointF vec)86     public void onFlingToDelete(DragObject d, int x, int y, PointF vec) {
87         // Do nothing
88     }
89 
onDragEnter(DragObject d)90     public void onDragEnter(DragObject d) {
91         d.dragView.setColor(mHoverColor);
92     }
93 
onDragOver(DragObject d)94     public void onDragOver(DragObject d) {
95         // Do nothing
96     }
97 
onDragExit(DragObject d)98     public void onDragExit(DragObject d) {
99         d.dragView.setColor(0);
100     }
101 
onDragStart(DragSource source, Object info, int dragAction)102     public void onDragStart(DragSource source, Object info, int dragAction) {
103         // Do nothing
104     }
105 
isDropEnabled()106     public boolean isDropEnabled() {
107         return mActive;
108     }
109 
onDragEnd()110     public void onDragEnd() {
111         // Do nothing
112     }
113 
114     @Override
getHitRect(android.graphics.Rect outRect)115     public void getHitRect(android.graphics.Rect outRect) {
116         super.getHitRect(outRect);
117         outRect.bottom += mBottomDragPadding;
118     }
119 
isRtl()120     private boolean isRtl() {
121         return (getLayoutDirection() == View.LAYOUT_DIRECTION_RTL);
122     }
123 
getIconRect(int viewWidth, int viewHeight, int drawableWidth, int drawableHeight)124     Rect getIconRect(int viewWidth, int viewHeight, int drawableWidth, int drawableHeight) {
125         DragLayer dragLayer = mLauncher.getDragLayer();
126 
127         // Find the rect to animate to (the view is center aligned)
128         Rect to = new Rect();
129         dragLayer.getViewRectRelativeToSelf(this, to);
130 
131         final int width = drawableWidth;
132         final int height = drawableHeight;
133 
134         final int left;
135         final int right;
136 
137         if (isRtl()) {
138             right = to.right - getPaddingRight();
139             left = right - width;
140         } else {
141             left = to.left + getPaddingLeft();
142             right = left + width;
143         }
144 
145         final int top = to.top + (getMeasuredHeight() - height) / 2;
146         final int bottom = top +  height;
147 
148         to.set(left, top, right, bottom);
149 
150         // Center the destination rect about the trash icon
151         final int xOffset = (int) -(viewWidth - width) / 2;
152         final int yOffset = (int) -(viewHeight - height) / 2;
153         to.offset(xOffset, yOffset);
154 
155         return to;
156     }
157 
158     @Override
getDropTargetDelegate(DragObject d)159     public DropTarget getDropTargetDelegate(DragObject d) {
160         return null;
161     }
162 
getLocationInDragLayer(int[] loc)163     public void getLocationInDragLayer(int[] loc) {
164         mLauncher.getDragLayer().getLocationInDragLayer(this, loc);
165     }
166 }
167