Home | History | Annotate | Download | only in launcher3
      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