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 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