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
17package com.android.launcher3;
18
19import android.content.Context;
20import android.content.res.Resources;
21import android.graphics.PointF;
22import android.graphics.Rect;
23import android.graphics.drawable.Drawable;
24import android.util.AttributeSet;
25import android.view.View;
26import android.widget.TextView;
27
28
29/**
30 * Implements a DropTarget.
31 */
32public 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
47    public ButtonDropTarget(Context context, AttributeSet attrs) {
48        this(context, attrs, 0);
49    }
50
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
59    void setLauncher(Launcher launcher) {
60        mLauncher = launcher;
61    }
62
63    public boolean acceptDrop(DragObject d) {
64        return false;
65    }
66
67    public void setSearchDropTargetBar(SearchDropTargetBar searchDropTargetBar) {
68        mSearchDropTargetBar = searchDropTargetBar;
69    }
70
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
81    public void onDrop(DragObject d) {
82    }
83
84    public void onFlingToDelete(DragObject d, int x, int y, PointF vec) {
85        // Do nothing
86    }
87
88    public void onDragEnter(DragObject d) {
89        d.dragView.setColor(mHoverColor);
90    }
91
92    public void onDragOver(DragObject d) {
93        // Do nothing
94    }
95
96    public void onDragExit(DragObject d) {
97        d.dragView.setColor(0);
98    }
99
100    public void onDragStart(DragSource source, Object info, int dragAction) {
101        // Do nothing
102    }
103
104    public boolean isDropEnabled() {
105        return mActive;
106    }
107
108    public void onDragEnd() {
109        // Do nothing
110    }
111
112    @Override
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
122    private boolean isRtl() {
123        return (getLayoutDirection() == View.LAYOUT_DIRECTION_RTL);
124    }
125
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
160    public void getLocationInDragLayer(int[] loc) {
161        mLauncher.getDragLayer().getLocationInDragLayer(this, loc);
162    }
163}
164