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