diff options
author | Winson Chung <winsonc@google.com> | 2010-12-15 13:14:23 -0800 |
---|---|---|
committer | Winson Chung <winsonc@google.com> | 2010-12-15 16:11:18 -0800 |
commit | 760e5375f003accf04f789e90a919ed476d4c335 (patch) | |
tree | ddfc87c374eb5d2fc0877e82e5953b6c1b4418e5 /src | |
parent | fc1fd8dca0829a331035336a092a6bf8bff44b83 (diff) | |
download | android_packages_apps_Trebuchet-760e5375f003accf04f789e90a919ed476d4c335.tar.gz android_packages_apps_Trebuchet-760e5375f003accf04f789e90a919ed476d4c335.tar.bz2 android_packages_apps_Trebuchet-760e5375f003accf04f789e90a919ed476d4c335.zip |
Fixing drawing order issue in bg gradient
- Synchronizing icon button animations + some initial code refactoring for icon buttons
- Fixing crash in non-xlarge devices
- Adding fix to prevent customization bg protection from being drawn in all apps
Change-Id: If231a1bf4b32f59fb1de85ff67143ee08d2c93a1
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/launcher2/ApplicationInfoDropTarget.java | 145 | ||||
-rw-r--r-- | src/com/android/launcher2/DeleteZone.java | 103 | ||||
-rw-r--r-- | src/com/android/launcher2/IconDropTarget.java | 136 | ||||
-rw-r--r-- | src/com/android/launcher2/Launcher.java | 2 | ||||
-rw-r--r-- | src/com/android/launcher2/Workspace.java | 25 |
5 files changed, 246 insertions, 165 deletions
diff --git a/src/com/android/launcher2/ApplicationInfoDropTarget.java b/src/com/android/launcher2/ApplicationInfoDropTarget.java index 849d2b586..fdcbbd478 100644 --- a/src/com/android/launcher2/ApplicationInfoDropTarget.java +++ b/src/com/android/launcher2/ApplicationInfoDropTarget.java @@ -16,15 +16,14 @@ package com.android.launcher2; +import android.animation.Animator; +import android.animation.Animator.AnimatorListener; +import android.animation.ObjectAnimator; import android.content.ComponentName; import android.content.Context; -import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; -import android.graphics.Rect; import android.util.AttributeSet; -import android.view.View; -import android.widget.ImageView; import com.android.launcher.R; @@ -32,21 +31,12 @@ import com.android.launcher.R; * Implements a DropTarget which allows applications to be dropped on it, * in order to launch the application info for that app. */ -public class ApplicationInfoDropTarget extends ImageView implements DropTarget, DragController.DragListener { - private Launcher mLauncher; - private boolean mActive = false; +public class ApplicationInfoDropTarget extends IconDropTarget { + private static final int sFadeInAnimationDuration = 200; + private static final int sFadeOutAnimationDuration = 100; - /** - * If true, this View responsible for managing its own visibility, and that of its handle. - * This is generally the case, but it will be set to false when this is part of the - * Contextual Action Bar. - */ - private boolean mDragAndDropEnabled = true; - - /** The view that this view should appear in the place of. */ - private View mHandle = null; - - private final Paint mPaint = new Paint(); + private ObjectAnimator mFadeAnimator; + private ObjectAnimator mHandleFadeAnimator; public ApplicationInfoDropTarget(Context context, AttributeSet attrs) { this(context, attrs, 0); @@ -54,13 +44,10 @@ public class ApplicationInfoDropTarget extends ImageView implements DropTarget, public ApplicationInfoDropTarget(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - } - /** - * Set the color that will be used as a filter over objects dragged over this object. - */ - public void setDragColor(int color) { - mPaint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP)); + // Set the hover paint colour + int colour = getContext().getResources().getColor(R.color.app_info_filter); + mHoverPaint.setColorFilter(new PorterDuffColorFilter(colour, PorterDuff.Mode.SRC_ATOP)); } public boolean acceptDrop(DragSource source, int x, int y, int xOffset, int yOffset, @@ -81,19 +68,10 @@ public class ApplicationInfoDropTarget extends ImageView implements DropTarget, return false; } - public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset, - DragView dragView, Object dragInfo) { - - } - public void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { if (!mDragAndDropEnabled) return; - dragView.setPaint(mPaint); - } - - public void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset, - DragView dragView, Object dragInfo) { + dragView.setPaint(mHoverPaint); } public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset, @@ -106,63 +84,70 @@ public class ApplicationInfoDropTarget extends ImageView implements DropTarget, if (info != null && mDragAndDropEnabled) { final int itemType = ((ItemInfo)info).itemType; mActive = (itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION); - - // Only show the info icon when an application is selected if (mActive) { + // Fade in this icon + if (mFadeAnimator != null) mFadeAnimator.cancel(); + mFadeAnimator = ObjectAnimator.ofFloat(this, "alpha", 0.0f, 1.0f); + mFadeAnimator.setDuration(sFadeInAnimationDuration); + mFadeAnimator.start(); setVisibility(VISIBLE); - } - if (mHandle != null) { - mHandle.setVisibility(INVISIBLE); + + // Fade out the handle + if (mHandle != null) { + if (mHandleFadeAnimator != null) mHandleFadeAnimator.cancel(); + mHandleFadeAnimator = ObjectAnimator.ofFloat(mHandle, "alpha", 0.0f); + mHandleFadeAnimator.setDuration(sFadeOutAnimationDuration); + mHandleFadeAnimator.addListener(new AnimatorListener() { + public void onAnimationStart(Animator animation) {} + public void onAnimationRepeat(Animator animation) {} + public void onAnimationEnd(Animator animation) { + onEndOrCancel(); + } + public void onAnimationCancel(Animator animation) { + onEndOrCancel(); + } + private void onEndOrCancel() { + mHandle.setVisibility(INVISIBLE); + mHandleFadeAnimator = null; + } + }); + mHandleFadeAnimator.start(); + } } } } - public boolean isDropEnabled() { - return mActive; - } - public void onDragEnd() { if (!mDragAndDropEnabled) return; + if (mActive) mActive = false; + + // Fade out this icon + if (mFadeAnimator != null) mFadeAnimator.cancel(); + mFadeAnimator = ObjectAnimator.ofFloat(this, "alpha", 0.0f); + mFadeAnimator.setDuration(sFadeOutAnimationDuration); + mFadeAnimator.addListener(new AnimatorListener() { + public void onAnimationStart(Animator animation) {} + public void onAnimationRepeat(Animator animation) {} + public void onAnimationEnd(Animator animation) { + onEndOrCancel(); + } + public void onAnimationCancel(Animator animation) { + onEndOrCancel(); + } + private void onEndOrCancel() { + setVisibility(GONE); + mFadeAnimator = null; + } + }); + mFadeAnimator.start(); - if (mActive) { - mActive = false; - } - setVisibility(GONE); + // Fade in the handle if (mHandle != null) { + if (mHandleFadeAnimator != null) mHandleFadeAnimator.cancel(); + mHandleFadeAnimator = ObjectAnimator.ofFloat(mHandle, "alpha", 1.0f); + mHandleFadeAnimator.setDuration(sFadeInAnimationDuration); + mHandleFadeAnimator.start(); mHandle.setVisibility(VISIBLE); } } - - @Override - public void getHitRect(Rect outRect) { - super.getHitRect(outRect); - if (LauncherApplication.isScreenXLarge()) { - final int padding = R.dimen.delete_zone_padding; - final int outerDragPadding = - getResources().getDimensionPixelSize(R.dimen.delete_zone_size); - final int innerDragPadding = getResources().getDimensionPixelSize(padding); - outRect.top -= outerDragPadding; - outRect.left -= innerDragPadding; - outRect.bottom += outerDragPadding; - outRect.right += outerDragPadding; - } - } - - void setLauncher(Launcher launcher) { - mLauncher = launcher; - } - - void setHandle(View view) { - mHandle = view; - } - - void setDragAndDropEnabled(boolean enabled) { - mDragAndDropEnabled = enabled; - } - - @Override - public DropTarget getDropTargetDelegate(DragSource source, int x, int y, int xOffset, int yOffset, - DragView dragView, Object dragInfo) { - return null; - } } diff --git a/src/com/android/launcher2/DeleteZone.java b/src/com/android/launcher2/DeleteZone.java index 33f384f0d..b044ea807 100644 --- a/src/com/android/launcher2/DeleteZone.java +++ b/src/com/android/launcher2/DeleteZone.java @@ -18,7 +18,6 @@ package com.android.launcher2; import android.content.Context; import android.content.res.TypedArray; -import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; @@ -31,26 +30,15 @@ import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.AnimationSet; import android.view.animation.TranslateAnimation; -import android.widget.ImageView; import com.android.launcher.R; -public class DeleteZone extends ImageView implements DropTarget, DragController.DragListener { +public class DeleteZone extends IconDropTarget { private static final int ORIENTATION_HORIZONTAL = 1; private static final int TRANSITION_DURATION = 250; private static final int ANIMATION_DURATION = 200; - - private final int[] mLocation = new int[2]; - - private Launcher mLauncher; - private boolean mTrashMode; - - /** - * If true, this View responsible for managing its own visibility, and that of its handle. - * This is generally the case, but it will be set to false when this is part of the - * Contextual Action Bar. - */ - private boolean mDragAndDropEnabled = true; + private static final int XLARGE_TRANSITION_DURATION = 150; + private static final int XLARGE_ANIMATION_DURATION = 200; private AnimationSet mInAnimation; private AnimationSet mOutAnimation; @@ -63,10 +51,6 @@ public class DeleteZone extends ImageView implements DropTarget, DragController. private final RectF mRegionF = new RectF(); private final Rect mRegion = new Rect(); private TransitionDrawable mTransition; - private final Paint mTrashPaint = new Paint(); - - /** The View that this view will replace. */ - private View mHandle = null; public DeleteZone(Context context, AttributeSet attrs) { this(context, attrs, 0); @@ -75,8 +59,11 @@ public class DeleteZone extends ImageView implements DropTarget, DragController. public DeleteZone(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); + mOuterDragPadding = getResources().getDimensionPixelSize(R.dimen.delete_zone_size); + mInnerDragPadding = getResources().getDimensionPixelSize(R.dimen.delete_zone_padding); + final int srcColor = context.getResources().getColor(R.color.delete_color_filter); - mTrashPaint.setColorFilter(new PorterDuffColorFilter(srcColor, PorterDuff.Mode.SRC_ATOP)); + mHoverPaint.setColorFilter(new PorterDuffColorFilter(srcColor, PorterDuff.Mode.SRC_ATOP)); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DeleteZone, defStyle, 0); mOrientation = a.getInt(R.styleable.DeleteZone_direction, ORIENTATION_HORIZONTAL); @@ -143,26 +130,24 @@ public class DeleteZone extends ImageView implements DropTarget, DragController. public void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { - if (!mDragAndDropEnabled) return; - mTransition.reverseTransition(TRANSITION_DURATION); - dragView.setPaint(mTrashPaint); - } - - public void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset, - DragView dragView, Object dragInfo) { + if (mDragAndDropEnabled) { + mTransition.reverseTransition(getTransitionAnimationDuration()); + super.onDragEnter(source, x, y, xOffset, yOffset, dragView, dragInfo); + } } public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { - if (!mDragAndDropEnabled) return; - mTransition.reverseTransition(TRANSITION_DURATION); - dragView.setPaint(null); + if (mDragAndDropEnabled) { + mTransition.reverseTransition(getTransitionAnimationDuration()); + super.onDragExit(source, x, y, xOffset, yOffset, dragView, dragInfo); + } } public void onDragStart(DragSource source, Object info, int dragAction) { final ItemInfo item = (ItemInfo) info; if (item != null && mDragAndDropEnabled) { - mTrashMode = true; + mActive = true; getHitRect(mRegion); mRegionF.set(mRegion); @@ -188,8 +173,8 @@ public class DeleteZone extends ImageView implements DropTarget, DragController. } public void onDragEnd() { - if (mTrashMode && mDragAndDropEnabled) { - mTrashMode = false; + if (mActive && mDragAndDropEnabled) { + mActive = false; mDragController.setDeleteRegion(null); if (mOutAnimation != null) startAnimation(mOutAnimation); @@ -200,33 +185,11 @@ public class DeleteZone extends ImageView implements DropTarget, DragController. } } - public boolean isDropEnabled() { - return true; - } - - @Override - public void getHitRect(Rect outRect) { - super.getHitRect(outRect); - if (LauncherApplication.isScreenXLarge()) { - // TODO: This is a temporary hack. mManageVisiblity = false when you're in CAB mode. - // In that case, this icon is more tightly spaced next to the delete icon so we want - // it to have a smaller drag region. When the new drag&drop system comes in, we'll - // dispatch the drag/drop by calculating what target you're overlapping - final int padding = R.dimen.delete_zone_padding; - final int outerDragPadding = - getResources().getDimensionPixelSize(R.dimen.delete_zone_size); - final int innerDragPadding = getResources().getDimensionPixelSize(padding); - outRect.top -= outerDragPadding; - outRect.left -= innerDragPadding; - outRect.bottom += outerDragPadding; - outRect.right += innerDragPadding; - } - } - private void createAnimations() { + int duration = getAnimationDuration(); if (mHandleInAnimation == null) { mHandleInAnimation = new AlphaAnimation(0.0f, 1.0f); - mHandleInAnimation.setDuration(ANIMATION_DURATION); + mHandleInAnimation.setDuration(duration); } if (mInAnimation == null) { @@ -244,7 +207,7 @@ public class DeleteZone extends ImageView implements DropTarget, DragController. 1.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f)); } - animationSet.setDuration(ANIMATION_DURATION); + animationSet.setDuration(duration); } else { mInAnimation.addAnimation(mHandleInAnimation); } @@ -253,7 +216,7 @@ public class DeleteZone extends ImageView implements DropTarget, DragController. if (mHandleOutAnimation == null) { mHandleOutAnimation = new AlphaAnimation(1.0f, 0.0f); mHandleOutAnimation.setFillAfter(true); - mHandleOutAnimation.setDuration(ANIMATION_DURATION); + mHandleOutAnimation.setDuration(duration); } if (mOutAnimation == null) { @@ -271,27 +234,25 @@ public class DeleteZone extends ImageView implements DropTarget, DragController. 0.0f, Animation.RELATIVE_TO_SELF, 1.0f, Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f)); } - animationSet.setDuration(ANIMATION_DURATION); + animationSet.setDuration(duration); } else { mOutAnimation.addAnimation(mHandleOutAnimation); } } } - void setLauncher(Launcher launcher) { - mLauncher = launcher; - } - void setDragController(DragController dragController) { mDragController = dragController; } - void setHandle(View view) { - mHandle = view; + private int getTransitionAnimationDuration() { + return LauncherApplication.isScreenXLarge() ? + XLARGE_TRANSITION_DURATION : TRANSITION_DURATION; } - void setDragAndDropEnabled(boolean enabled) { - mDragAndDropEnabled = enabled; + private int getAnimationDuration() { + return LauncherApplication.isScreenXLarge() ? + XLARGE_ANIMATION_DURATION : ANIMATION_DURATION; } private static class FastTranslateAnimation extends TranslateAnimation { @@ -327,10 +288,4 @@ public class DeleteZone extends ImageView implements DropTarget, DragController. return false; } } - - @Override - public DropTarget getDropTargetDelegate(DragSource source, int x, int y, int xOffset, int yOffset, - DragView dragView, Object dragInfo) { - return null; - } } diff --git a/src/com/android/launcher2/IconDropTarget.java b/src/com/android/launcher2/IconDropTarget.java new file mode 100644 index 000000000..5b375c3ff --- /dev/null +++ b/src/com/android/launcher2/IconDropTarget.java @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher2; + +import android.content.ComponentName; +import android.content.Context; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.view.View; +import android.widget.ImageView; + +import com.android.launcher.R; + +/** + * Implements a DropTarget which allows applications to be dropped on it, + * in order to launch the application info for that app. + */ +public class IconDropTarget extends ImageView implements DropTarget, DragController.DragListener { + protected Launcher mLauncher; + + /** + * If true, this View responsible for managing its own visibility, and that of its handle. + * This is generally the case, but it will be set to false when this is part of the + * Contextual Action Bar. + */ + protected boolean mDragAndDropEnabled; + + /** Whether this drop target is active for the current drag */ + protected boolean mActive; + + /** The view that this view should appear in the place of. */ + protected View mHandle = null; + + /** The paint applied to the drag view on hover */ + protected final Paint mHoverPaint = new Paint(); + + /** Drag zone padding */ + protected int mInnerDragPadding; + protected int mOuterDragPadding; + + public IconDropTarget(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public IconDropTarget(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mDragAndDropEnabled = true; + } + + void setLauncher(Launcher launcher) { + mLauncher = launcher; + } + + void setHandle(View view) { + mHandle = view; + } + + void setDragAndDropEnabled(boolean enabled) { + mDragAndDropEnabled = enabled; + } + + public boolean acceptDrop(DragSource source, int x, int y, int xOffset, int yOffset, + DragView dragView, Object dragInfo) { + return false; + } + + public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset, + DragView dragView, Object dragInfo) { + // Do nothing + } + + public void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset, + DragView dragView, Object dragInfo) { + if (mDragAndDropEnabled) { + dragView.setPaint(mHoverPaint); + } + } + + public void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset, + DragView dragView, Object dragInfo) { + // Do nothing + } + + public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset, + DragView dragView, Object dragInfo) { + if (mDragAndDropEnabled) { + dragView.setPaint(null); + } + } + + public void onDragStart(DragSource source, Object info, int dragAction) { + // Do nothing + } + + public boolean isDropEnabled() { + return mDragAndDropEnabled && mActive; + } + + public void onDragEnd() { + // Do nothing + } + + @Override + public void getHitRect(Rect outRect) { + super.getHitRect(outRect); + if (LauncherApplication.isScreenXLarge()) { + outRect.top -= mOuterDragPadding; + outRect.left -= mInnerDragPadding; + outRect.bottom += mOuterDragPadding; + outRect.right += mOuterDragPadding; + } + } + + @Override + public DropTarget getDropTargetDelegate(DragSource source, int x, int y, int xOffset, + int yOffset, DragView dragView, Object dragInfo) { + return null; + } +} diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index 992c506d5..130cb7653 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -974,7 +974,6 @@ public final class Launcher extends Activity if (allAppsInfoTarget != null) { allAppsInfoTarget.setLauncher(this); dragController.addDragListener(allAppsInfoTarget); - allAppsInfoTarget.setDragColor(getResources().getColor(R.color.app_info_filter)); allAppsInfoTarget.setDragAndDropEnabled(false); View marketButton = findViewById(R.id.market_button); if (marketButton != null) { @@ -986,7 +985,6 @@ public final class Launcher extends Activity if (infoButton != null) { infoButton.setLauncher(this); infoButton.setHandle(findViewById(R.id.configure_button)); - infoButton.setDragColor(getResources().getColor(R.color.app_info_filter)); dragController.addDragListener(infoButton); } diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java index bbcd0af33..4b9654358 100644 --- a/src/com/android/launcher2/Workspace.java +++ b/src/com/android/launcher2/Workspace.java @@ -601,6 +601,11 @@ public class Workspace extends SmoothPagedView return mChildrenOutlineAlpha; } + private void showBackgroundGradientForAllApps() { + showBackgroundGradient(); + mDrawCustomizeTrayBackground = false; + } + private void showBackgroundGradientForCustomizeTray() { showBackgroundGradient(); mDrawCustomizeTrayBackground = true; @@ -767,18 +772,18 @@ public class Workspace extends SmoothPagedView mCustomizationDrawerTransformedPos[1] = mCustomizationDrawerContent.getTop(); m.mapPoints(mCustomizationDrawerTransformedPos); + // Draw the bg glow behind the gradient + mCustomizeTrayBackground.setAlpha(alpha); + mCustomizeTrayBackground.setBounds(mScrollX, 0, mScrollX + getMeasuredWidth(), + getMeasuredHeight()); + mCustomizeTrayBackground.draw(canvas); + // Draw the bg gradient final int offset = (int) (mCustomizationDrawerPos[1] + mCustomizationDrawerTransformedPos[1]); mBackground.setBounds(mScrollX, offset, mScrollX + getMeasuredWidth(), offset + getMeasuredHeight()); mBackground.draw(canvas); - - // Draw the bg glow - mCustomizeTrayBackground.setAlpha(alpha); - mCustomizeTrayBackground.setBounds(mScrollX, 0, mScrollX + getMeasuredWidth(), - getMeasuredHeight()); - mCustomizeTrayBackground.draw(canvas); } } super.onDraw(canvas); @@ -1084,7 +1089,7 @@ public class Workspace extends SmoothPagedView if (shrinkState == ShrinkState.TOP) { showBackgroundGradientForCustomizeTray(); } else { - showBackgroundGradient(); + showBackgroundGradientForAllApps(); } } @@ -2241,8 +2246,10 @@ public class Workspace extends SmoothPagedView mSpringLoadedDragController = new SpringLoadedDragController(mLauncher); mCustomizationDrawer = mLauncher.findViewById(R.id.customization_drawer); - mCustomizationDrawerContent = - mCustomizationDrawer.findViewById(com.android.internal.R.id.tabcontent); + if (mCustomizationDrawer != null) { + mCustomizationDrawerContent = + mCustomizationDrawer.findViewById(com.android.internal.R.id.tabcontent); + } } public void setDragController(DragController dragController) { |