161fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung/* 261fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung * Copyright (C) 2010 The Android Open Source Project 361fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung * 461fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung * Licensed under the Apache License, Version 2.0 (the "License"); 561fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung * you may not use this file except in compliance with the License. 661fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung * You may obtain a copy of the License at 761fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung * 861fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung * http://www.apache.org/licenses/LICENSE-2.0 961fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung * 1061fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung * Unless required by applicable law or agreed to in writing, software 1161fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung * distributed under the License is distributed on an "AS IS" BASIS, 1261fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1361fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung * See the License for the specific language governing permissions and 1461fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung * limitations under the License. 1561fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung */ 1661fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 17325dc23624160689e59fbac708cf6f222b20d025Daniel Sandlerpackage com.android.launcher3; 1861fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 193a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyalimport android.animation.AnimatorSet; 203a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyalimport android.animation.FloatArrayEvaluator; 21fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyalimport android.animation.ObjectAnimator; 223a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyalimport android.animation.ValueAnimator; 233a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyalimport android.animation.ValueAnimator.AnimatorUpdateListener; 24fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyalimport android.annotation.TargetApi; 2561fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chungimport android.content.Context; 26fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyalimport android.content.res.ColorStateList; 27855b1b5fff5f6f03a641b3b6973780a24fd9641eTony Wickhamimport android.content.res.Resources; 28f37a21412afb16f61ca23b5aca2e90691b57e171Sunny Goyalimport android.content.res.TypedArray; 293a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyalimport android.graphics.ColorMatrix; 303a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyalimport android.graphics.ColorMatrixColorFilter; 31043f2af567178b82b0b41f12d379e7dd12da2936Winson Chungimport android.graphics.PointF; 3261967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chungimport android.graphics.Rect; 333a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyalimport android.graphics.drawable.Drawable; 34fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyalimport android.os.Build; 3561fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chungimport android.util.AttributeSet; 36d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglioimport android.view.View; 371a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyalimport android.view.View.OnClickListener; 38fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyalimport android.view.ViewGroup; 39e78e3d734b577c1ab6dc0738a83600374908ea52Sunny Goyalimport android.view.accessibility.AccessibilityEvent; 40fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyalimport android.view.animation.DecelerateInterpolator; 41fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyalimport android.view.animation.LinearInterpolator; 42d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohenimport android.widget.TextView; 4361fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 44fedca43d396d6fd7c46fbb2f37dfa7cfe3b31834Vadim Tryshevimport com.android.launcher3.dragndrop.DragController; 45fedca43d396d6fd7c46fbb2f37dfa7cfe3b31834Vadim Tryshevimport com.android.launcher3.dragndrop.DragLayer; 4694b510cc683a6436ae82c6d323cbd8b429561b06Sunny Goyalimport com.android.launcher3.dragndrop.DragOptions; 47fedca43d396d6fd7c46fbb2f37dfa7cfe3b31834Vadim Tryshevimport com.android.launcher3.dragndrop.DragView; 48fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyalimport com.android.launcher3.util.Thunk; 4961fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 5061fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung/** 5161fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung * Implements a DropTarget. 5261fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung */ 531a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyalpublic abstract class ButtonDropTarget extends TextView 541a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal implements DropTarget, DragController.DragListener, OnClickListener { 55fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal 56b54c4a3d864110a222e12683d88e6d46c27bf7a1Tony Wickham private static final int DRAG_VIEW_DROP_DURATION = 285; 5761fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 58f37a21412afb16f61ca23b5aca2e90691b57e171Sunny Goyal private final boolean mHideParentOnDisable; 5947328fd53f43fd0c2ed14ad925dd04483f9229a0Sunny Goyal protected final Launcher mLauncher; 60f37a21412afb16f61ca23b5aca2e90691b57e171Sunny Goyal 61a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung private int mBottomDragPadding; 6247328fd53f43fd0c2ed14ad925dd04483f9229a0Sunny Goyal protected DropTargetBar mDropTargetBar; 6361fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 6461fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung /** Whether this drop target is active for the current drag */ 6561fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung protected boolean mActive; 664583d09c0560a83bfd0320299482cc41ac460b0cSunny Goyal /** Whether an accessible drag is in progress */ 674583d09c0560a83bfd0320299482cc41ac460b0cSunny Goyal private boolean mAccessibleDrag; 68855b1b5fff5f6f03a641b3b6973780a24fd9641eTony Wickham /** An item must be dragged at least this many pixels before this drop target is enabled. */ 69855b1b5fff5f6f03a641b3b6973780a24fd9641eTony Wickham private final int mDragDistanceThreshold; 7061fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 7161fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung /** The paint applied to the drag view on hover */ 7261967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung protected int mHoverColor = 0; 7361fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 74fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal protected ColorStateList mOriginalTextColor; 753a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal protected Drawable mDrawable; 763a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal 773a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal private AnimatorSet mCurrentColorAnim; 78316490e636aad788fcfbfc2e04dd4f0e145bdd00Sunny Goyal @Thunk ColorMatrix mSrcFilter, mDstFilter, mCurrentFilter; 79fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal 8061fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung public ButtonDropTarget(Context context, AttributeSet attrs) { 8161fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung this(context, attrs, 0); 8261fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung } 8361fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 8461fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung public ButtonDropTarget(Context context, AttributeSet attrs, int defStyle) { 8561fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung super(context, attrs, defStyle); 862fd020860533e18c64a93d14d11cb2d34bc9cbafTony mLauncher = Launcher.getLauncher(context); 8747328fd53f43fd0c2ed14ad925dd04483f9229a0Sunny Goyal 88855b1b5fff5f6f03a641b3b6973780a24fd9641eTony Wickham Resources resources = getResources(); 89855b1b5fff5f6f03a641b3b6973780a24fd9641eTony Wickham mBottomDragPadding = resources.getDimensionPixelSize(R.dimen.drop_target_drag_padding); 90f37a21412afb16f61ca23b5aca2e90691b57e171Sunny Goyal 91f37a21412afb16f61ca23b5aca2e90691b57e171Sunny Goyal TypedArray a = context.obtainStyledAttributes(attrs, 92f37a21412afb16f61ca23b5aca2e90691b57e171Sunny Goyal R.styleable.ButtonDropTarget, defStyle, 0); 93f37a21412afb16f61ca23b5aca2e90691b57e171Sunny Goyal mHideParentOnDisable = a.getBoolean(R.styleable.ButtonDropTarget_hideParentOnDisable, false); 94f37a21412afb16f61ca23b5aca2e90691b57e171Sunny Goyal a.recycle(); 95855b1b5fff5f6f03a641b3b6973780a24fd9641eTony Wickham mDragDistanceThreshold = resources.getDimensionPixelSize(R.dimen.drag_distanceThreshold); 9661fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung } 9761fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 98fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal @Override 99fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal protected void onFinishInflate() { 100fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal super.onFinishInflate(); 101fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal mOriginalTextColor = getTextColors(); 10261fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung } 10361fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 1047066003b2032a49ae5e59dab9b706259bdeb7e6eSunny Goyal @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) 105fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal protected void setDrawable(int resId) { 106e0cab303b8cf1fd00b152219aa56663608582f5aSunny Goyal // We do not set the drawable in the xml as that inflates two drawables corresponding to 107e0cab303b8cf1fd00b152219aa56663608582f5aSunny Goyal // drawableLeft and drawableStart. 1083a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal mDrawable = getResources().getDrawable(resId); 109fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal 1109fc953b94dbc6b99e6de08c9dcc80a0cb8e3e319Sunny Goyal if (Utilities.ATLEAST_JB_MR1) { 111e0cab303b8cf1fd00b152219aa56663608582f5aSunny Goyal setCompoundDrawablesRelativeWithIntrinsicBounds(mDrawable, null, null, null); 112e0cab303b8cf1fd00b152219aa56663608582f5aSunny Goyal } else { 113e0cab303b8cf1fd00b152219aa56663608582f5aSunny Goyal setCompoundDrawablesWithIntrinsicBounds(mDrawable, null, null, null); 114fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal } 115fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal } 116fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal 11747328fd53f43fd0c2ed14ad925dd04483f9229a0Sunny Goyal public void setDropTargetBar(DropTargetBar dropTargetBar) { 118b54c4a3d864110a222e12683d88e6d46c27bf7a1Tony Wickham mDropTargetBar = dropTargetBar; 119d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen } 120d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen 121fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal @Override 122ddec73471eb6cc1f15eb9421a205bb2362509075Sunny Goyal public void onFlingToDelete(DragObject d, PointF vec) { } 123fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal 124fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal @Override 125fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal public final void onDragEnter(DragObject d) { 126fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal d.dragView.setColor(mHoverColor); 1279fc953b94dbc6b99e6de08c9dcc80a0cb8e3e319Sunny Goyal if (Utilities.ATLEAST_LOLLIPOP) { 128fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal animateTextColor(mHoverColor); 129fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal } else { 1303a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal if (mCurrentFilter == null) { 1313a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal mCurrentFilter = new ColorMatrix(); 1323a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal } 1333a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal DragView.setColorScale(mHoverColor, mCurrentFilter); 1343a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal mDrawable.setColorFilter(new ColorMatrixColorFilter(mCurrentFilter)); 135fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal setTextColor(mHoverColor); 136fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal } 137d21301e674377ecd72bd14f32b52c68fabcfd3beSunny Goyal if (d.stateAnnouncer != null) { 138d21301e674377ecd72bd14f32b52c68fabcfd3beSunny Goyal d.stateAnnouncer.cancel(); 139d21301e674377ecd72bd14f32b52c68fabcfd3beSunny Goyal } 140e78e3d734b577c1ab6dc0738a83600374908ea52Sunny Goyal sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); 14161fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung } 14261fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 143fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal @Override 144fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal public void onDragOver(DragObject d) { 145043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung // Do nothing 146043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung } 147043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung 1489fc953b94dbc6b99e6de08c9dcc80a0cb8e3e319Sunny Goyal protected void resetHoverColor() { 1499fc953b94dbc6b99e6de08c9dcc80a0cb8e3e319Sunny Goyal if (Utilities.ATLEAST_LOLLIPOP) { 150fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal animateTextColor(mOriginalTextColor.getDefaultColor()); 151fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal } else { 1523a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal mDrawable.setColorFilter(null); 153fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal setTextColor(mOriginalTextColor); 154fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal } 155fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal } 156fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal 157fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal @TargetApi(Build.VERSION_CODES.LOLLIPOP) 158fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal private void animateTextColor(int targetColor) { 159fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal if (mCurrentColorAnim != null) { 160fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal mCurrentColorAnim.cancel(); 161fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal } 1623a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal 1633a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal mCurrentColorAnim = new AnimatorSet(); 164fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal mCurrentColorAnim.setDuration(DragView.COLOR_CHANGE_DURATION); 1653a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal 1663a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal if (mSrcFilter == null) { 1673a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal mSrcFilter = new ColorMatrix(); 1683a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal mDstFilter = new ColorMatrix(); 1693a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal mCurrentFilter = new ColorMatrix(); 1703a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal } 1713a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal 1723a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal DragView.setColorScale(getTextColor(), mSrcFilter); 1733a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal DragView.setColorScale(targetColor, mDstFilter); 1743a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal ValueAnimator anim1 = ValueAnimator.ofObject( 1753a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal new FloatArrayEvaluator(mCurrentFilter.getArray()), 1763a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal mSrcFilter.getArray(), mDstFilter.getArray()); 1773a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal anim1.addUpdateListener(new AnimatorUpdateListener() { 1783a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal 1793a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal @Override 1803a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal public void onAnimationUpdate(ValueAnimator animation) { 1813a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal mDrawable.setColorFilter(new ColorMatrixColorFilter(mCurrentFilter)); 1823a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal invalidate(); 1833a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal } 1843a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal }); 1853a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal 1863a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal mCurrentColorAnim.play(anim1); 1873a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal mCurrentColorAnim.play(ObjectAnimator.ofArgb(this, "textColor", targetColor)); 188fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal mCurrentColorAnim.start(); 18961fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung } 19061fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 191fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal @Override 192fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal public final void onDragExit(DragObject d) { 193fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal if (!d.dragComplete) { 194fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal d.dragView.setColor(0); 195fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal resetHoverColor(); 196fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal } else { 197fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal // Restore the hover color 198fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal d.dragView.setColor(mHoverColor); 199fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal } 20061fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung } 20161fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 202aa8ef119f18864f4ab41c12f9c2ad6d7f643a0a9Sunny Goyal @Override 20394b510cc683a6436ae82c6d323cbd8b429561b06Sunny Goyal public void onDragStart(DropTarget.DragObject dragObject, DragOptions options) { 20494b510cc683a6436ae82c6d323cbd8b429561b06Sunny Goyal mActive = supportsDrop(dragObject.dragSource, dragObject.dragInfo); 2053a644ed1ce12554fcdf5c499e959bda986d10551Sunny Goyal mDrawable.setColorFilter(null); 206fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal if (mCurrentColorAnim != null) { 207fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal mCurrentColorAnim.cancel(); 208fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal mCurrentColorAnim = null; 209fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal } 210fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal setTextColor(mOriginalTextColor); 211f37a21412afb16f61ca23b5aca2e90691b57e171Sunny Goyal (mHideParentOnDisable ? ((ViewGroup) getParent()) : this) 212f37a21412afb16f61ca23b5aca2e90691b57e171Sunny Goyal .setVisibility(mActive ? View.VISIBLE : View.GONE); 21394b510cc683a6436ae82c6d323cbd8b429561b06Sunny Goyal 21494b510cc683a6436ae82c6d323cbd8b429561b06Sunny Goyal mAccessibleDrag = options.isAccessibleDrag; 21594b510cc683a6436ae82c6d323cbd8b429561b06Sunny Goyal setOnClickListener(mAccessibleDrag ? this : null); 21661fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung } 21761fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 218fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal @Override 219fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal public final boolean acceptDrop(DragObject dragObject) { 220fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal return supportsDrop(dragObject.dragSource, dragObject.dragInfo); 22161fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung } 22261fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 223aa8ef119f18864f4ab41c12f9c2ad6d7f643a0a9Sunny Goyal protected abstract boolean supportsDrop(DragSource source, ItemInfo info); 224fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal 225fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal @Override 22661fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung public boolean isDropEnabled() { 2274583d09c0560a83bfd0320299482cc41ac460b0cSunny Goyal return mActive && (mAccessibleDrag || 2284583d09c0560a83bfd0320299482cc41ac460b0cSunny Goyal mLauncher.getDragController().getDistanceDragged() >= mDragDistanceThreshold); 22961fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung } 23061fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 231fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal @Override 23261fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung public void onDragEnd() { 233fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal mActive = false; 23494b510cc683a6436ae82c6d323cbd8b429561b06Sunny Goyal setOnClickListener(null); 23561fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung } 23661fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung 237fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal /** 238fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal * On drop animate the dropView to the icon. 239fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal */ 240fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal @Override 241fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal public void onDrop(final DragObject d) { 242fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal final DragLayer dragLayer = mLauncher.getDragLayer(); 243fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal final Rect from = new Rect(); 244fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal dragLayer.getViewRectRelativeToSelf(d.dragView, from); 245fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal 246fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal int width = mDrawable.getIntrinsicWidth(); 247fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal int height = mDrawable.getIntrinsicHeight(); 248fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal final Rect to = getIconRect(d.dragView.getMeasuredWidth(), d.dragView.getMeasuredHeight(), 249fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal width, height); 250fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal final float scale = (float) to.width() / from.width(); 251b54c4a3d864110a222e12683d88e6d46c27bf7a1Tony Wickham mDropTargetBar.deferOnDragEnd(); 252fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal 253fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal Runnable onAnimationEndRunnable = new Runnable() { 254fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal @Override 255fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal public void run() { 256fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal completeDrop(d); 257b54c4a3d864110a222e12683d88e6d46c27bf7a1Tony Wickham mDropTargetBar.onDragEnd(); 258fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal mLauncher.exitSpringLoadedDragModeDelayed(true, 0, null); 259fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal } 260fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal }; 261fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal dragLayer.animateView(d.dragView, from, to, scale, 1f, 1f, 0.1f, 0.1f, 262d139b0aa7d03f676dc7869dc5b39fd9f24ff0a1dSunny Goyal mLauncher.getDragController().isExternalDrag() ? 1 : DRAG_VIEW_DROP_DURATION, 263d139b0aa7d03f676dc7869dc5b39fd9f24ff0a1dSunny Goyal new DecelerateInterpolator(2), 264fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal new LinearInterpolator(), onAnimationEndRunnable, 265fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal DragLayer.ANIMATION_END_DISAPPEAR, null); 266fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal } 267fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal 268e9b651eef1b9f3647eba94f833bff3fc52f5956bSunny Goyal @Override 269e9b651eef1b9f3647eba94f833bff3fc52f5956bSunny Goyal public void prepareAccessibilityDrop() { } 270e9b651eef1b9f3647eba94f833bff3fc52f5956bSunny Goyal 271fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal @Thunk abstract void completeDrop(DragObject d); 272fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal 27361fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung @Override 2747d30a37007bac318db1c9af47a9af12d348042a5Adam Cohen public void getHitRectRelativeToDragLayer(android.graphics.Rect outRect) { 275a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung super.getHitRect(outRect); 276a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung outRect.bottom += mBottomDragPadding; 277156ab5b22e45b36a1c5edbe5accccf6aefcb4907Winson Chung 278156ab5b22e45b36a1c5edbe5accccf6aefcb4907Winson Chung int[] coords = new int[2]; 279156ab5b22e45b36a1c5edbe5accccf6aefcb4907Winson Chung mLauncher.getDragLayer().getDescendantCoordRelativeToSelf(this, coords); 280156ab5b22e45b36a1c5edbe5accccf6aefcb4907Winson Chung outRect.offsetTo(coords[0], coords[1]); 281a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung } 282a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung 283fa401a10e7e9341daf6f3c5949bf9331902c26d0Sunny Goyal protected Rect getIconRect(int viewWidth, int viewHeight, int drawableWidth, int drawableHeight) { 28461967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung DragLayer dragLayer = mLauncher.getDragLayer(); 28561967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung 28661967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung // Find the rect to animate to (the view is center aligned) 28761967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung Rect to = new Rect(); 28861967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung dragLayer.getViewRectRelativeToSelf(this, to); 289d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio 290d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio final int width = drawableWidth; 291d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio final int height = drawableHeight; 292d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio 293d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio final int left; 294d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio final int right; 295d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio 2967066003b2032a49ae5e59dab9b706259bdeb7e6eSunny Goyal if (Utilities.isRtl(getResources())) { 297d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio right = to.right - getPaddingRight(); 298d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio left = right - width; 299d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio } else { 300d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio left = to.left + getPaddingLeft(); 301d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio right = left + width; 302d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio } 303d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio 304d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio final int top = to.top + (getMeasuredHeight() - height) / 2; 305d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio final int bottom = top + height; 306d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio 307d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio to.set(left, top, right, bottom); 30861967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung 30961967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung // Center the destination rect about the trash icon 310d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio final int xOffset = (int) -(viewWidth - width) / 2; 311d6a33c6f348d1316e0fdc519eda43468fcdcbfe7Fabrice Di Meglio final int yOffset = (int) -(viewHeight - height) / 2; 31261967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung to.offset(xOffset, yOffset); 31361967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung 31461967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung return to; 31561967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung } 31661967cb17f8fa9ee01f93e9f25a1074559b54cf3Winson Chung 3171a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal @Override 3181a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal public void onClick(View v) { 319ae50284e0a838139c67caf0064a0977c871497faSunny Goyal mLauncher.getAccessibilityDelegate().handleAccessibleDrop(this, null, null); 3201a70cef9884270f2f0a760f079a10fdfb1544c98Sunny Goyal } 321fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal 322fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal public int getTextColor() { 323fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal return getTextColors().getDefaultColor(); 324fe0d1f2458e6a442613b070ae549124a4780e759Sunny Goyal } 32561fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung} 326