diff --git a/src/com/android/launcher2/AppsCustomizeTabHost.java b/src/com/android/launcher2/AppsCustomizeTabHost.java index caababa8e6..023946b26e 100644 --- a/src/com/android/launcher2/AppsCustomizeTabHost.java +++ b/src/com/android/launcher2/AppsCustomizeTabHost.java @@ -347,8 +347,9 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona /* LauncherTransitionable overrides */ @Override - public void onLauncherTransitionStart(Launcher l, boolean animated, boolean toWorkspace) { + public void onLauncherTransitionStart(Launcher l, Animator animation, boolean toWorkspace) { mInTransition = true; + boolean animated = (animation != null); mContent.setVisibility(VISIBLE); @@ -371,9 +372,9 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona } @Override - public void onLauncherTransitionEnd(Launcher l, boolean animated, boolean toWorkspace) { + public void onLauncherTransitionEnd(Launcher l, Animator animation, boolean toWorkspace) { mInTransition = false; - if (animated) { + if (animation != null) { setLayerType(LAYER_TYPE_NONE, null); } diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index 40621454a3..8850cf8062 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -2213,18 +2213,6 @@ public final class Launcher extends Activity } } - private void dispatchOnLauncherTransitionStart(View v, boolean animated, boolean toWorkspace) { - if (v instanceof LauncherTransitionable) { - ((LauncherTransitionable) v).onLauncherTransitionStart(this, animated, toWorkspace); - } - } - - private void dispatchOnLauncherTransitionEnd(View v, boolean animated, boolean toWorkspace) { - if (v instanceof LauncherTransitionable) { - ((LauncherTransitionable) v).onLauncherTransitionEnd(this, animated, toWorkspace); - } - } - /** * Things to test when changing the following seven functions. * - Home from workspace @@ -2270,7 +2258,7 @@ public final class Launcher extends Activity * Assumes that the view to show is anchored at either the very top or very bottom * of the screen. */ - private void showAppsCustomizeHelper(final boolean animated, final boolean springLoaded) { + private void showAppsCustomizeHelper(boolean animated, final boolean springLoaded) { if (mStateAnimation != null) { mStateAnimation.cancel(); mStateAnimation = null; @@ -2281,7 +2269,6 @@ public final class Launcher extends Activity final int duration = res.getInteger(R.integer.config_appsCustomizeZoomInTime); final int fadeDuration = res.getInteger(R.integer.config_appsCustomizeFadeInTime); final float scale = (float) res.getInteger(R.integer.config_appsCustomizeZoomScaleFactor); - final View fromView = mWorkspace; final View toView = mAppsCustomizeTabHost; final int startDelay = res.getInteger(R.integer.config_workspaceAppsCustomizeAnimationStagger); @@ -2328,8 +2315,10 @@ public final class Launcher extends Activity } @Override public void onAnimationEnd(Animator animation) { - dispatchOnLauncherTransitionEnd(fromView, animated, false); - dispatchOnLauncherTransitionEnd(toView, animated, false); + if (toView instanceof LauncherTransitionable) { + ((LauncherTransitionable) toView).onLauncherTransitionEnd(instance, + scaleAnim, false); + } if (!springLoaded && !LauncherApplication.isScreenLarge()) { // Hide the workspace scrollbar @@ -2352,14 +2341,14 @@ public final class Launcher extends Activity } boolean delayAnim = false; + LauncherTransitionable lt = (LauncherTransitionable) toView; final ViewTreeObserver observer; - dispatchOnLauncherTransitionStart(fromView, animated, false); - dispatchOnLauncherTransitionStart(toView, animated, false); + lt.onLauncherTransitionStart(instance, mStateAnimation, false); // If any of the objects being animated haven't been measured/laid out // yet, delay the animation until we get a layout pass - if ((((LauncherTransitionable) toView).getContent().getMeasuredWidth() == 0) || + if ((lt.getContent().getMeasuredWidth() == 0) || (mWorkspace.getMeasuredWidth() == 0) || (toView.getMeasuredWidth() == 0)) { observer = mWorkspace.getViewTreeObserver(); @@ -2398,16 +2387,16 @@ public final class Launcher extends Activity toView.setScaleY(1.0f); toView.setVisibility(View.VISIBLE); toView.bringToFront(); + if (toView instanceof LauncherTransitionable) { + ((LauncherTransitionable) toView).onLauncherTransitionStart(instance, null, false); + ((LauncherTransitionable) toView).onLauncherTransitionEnd(instance, null, false); - if (!springLoaded && !LauncherApplication.isScreenLarge()) { - // Hide the workspace scrollbar - mWorkspace.hideScrollingIndicator(true); - hideDockDivider(); + if (!springLoaded && !LauncherApplication.isScreenLarge()) { + // Hide the workspace scrollbar + mWorkspace.hideScrollingIndicator(true); + hideDockDivider(); + } } - dispatchOnLauncherTransitionStart(fromView, animated, false); - dispatchOnLauncherTransitionEnd(fromView, animated, false); - dispatchOnLauncherTransitionStart(toView, animated, false); - dispatchOnLauncherTransitionEnd(toView, animated, false); updateWallpaperVisibility(false); } } @@ -2419,12 +2408,12 @@ public final class Launcher extends Activity */ private void hideAppsCustomizeHelper(State toState, final boolean animated, final boolean springLoaded, final Runnable onCompleteRunnable) { - if (mStateAnimation != null) { mStateAnimation.cancel(); mStateAnimation = null; } Resources res = getResources(); + final Launcher instance = this; final int duration = res.getInteger(R.integer.config_appsCustomizeZoomOutTime); final int fadeOutDuration = @@ -2432,7 +2421,6 @@ public final class Launcher extends Activity final float scaleFactor = (float) res.getInteger(R.integer.config_appsCustomizeZoomScaleFactor); final View fromView = mAppsCustomizeTabHost; - final View toView = mWorkspace; Animator workspaceAnim = null; if (toState == State.WORKSPACE) { @@ -2463,18 +2451,19 @@ public final class Launcher extends Activity .setDuration(fadeOutDuration); alphaAnim.setInterpolator(new AccelerateDecelerateInterpolator()); - mStateAnimation = new AnimatorSet(); - - dispatchOnLauncherTransitionStart(fromView, animated, true); - dispatchOnLauncherTransitionStart(toView, animated, true); - - mStateAnimation.addListener(new AnimatorListenerAdapter() { + if (fromView instanceof LauncherTransitionable) { + ((LauncherTransitionable) fromView).onLauncherTransitionStart(instance, alphaAnim, + true); + } + alphaAnim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { updateWallpaperVisibility(true); fromView.setVisibility(View.GONE); - dispatchOnLauncherTransitionEnd(fromView, animated, true); - dispatchOnLauncherTransitionEnd(toView, animated, true); + if (fromView instanceof LauncherTransitionable) { + ((LauncherTransitionable) fromView).onLauncherTransitionEnd(instance, + alphaAnim, true); + } mWorkspace.hideScrollingIndicator(false); if (onCompleteRunnable != null) { onCompleteRunnable.run(); @@ -2482,6 +2471,7 @@ public final class Launcher extends Activity } }); + mStateAnimation = new AnimatorSet(); mStateAnimation.playTogether(scaleAnim, alphaAnim); if (workspaceAnim != null) { mStateAnimation.play(workspaceAnim); @@ -2489,10 +2479,10 @@ public final class Launcher extends Activity mStateAnimation.start(); } else { fromView.setVisibility(View.GONE); - dispatchOnLauncherTransitionStart(fromView, animated, false); - dispatchOnLauncherTransitionEnd(fromView, animated, false); - dispatchOnLauncherTransitionStart(toView, animated, false); - dispatchOnLauncherTransitionEnd(toView, animated, false); + if (fromView instanceof LauncherTransitionable) { + ((LauncherTransitionable) fromView).onLauncherTransitionStart(instance, null, true); + ((LauncherTransitionable) fromView).onLauncherTransitionEnd(instance, null, true); + } mWorkspace.hideScrollingIndicator(false); } } @@ -3439,6 +3429,6 @@ public final class Launcher extends Activity interface LauncherTransitionable { View getContent(); - void onLauncherTransitionStart(Launcher l, boolean animated, boolean toWorkspace); - void onLauncherTransitionEnd(Launcher l, boolean animated, boolean toWorkspace); + void onLauncherTransitionStart(Launcher l, Animator animation, boolean toWorkspace); + void onLauncherTransitionEnd(Launcher l, Animator animation, boolean toWorkspace); } diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java index 7abe6e1d6d..9a140d2886 100644 --- a/src/com/android/launcher2/PagedView.java +++ b/src/com/android/launcher2/PagedView.java @@ -1680,7 +1680,6 @@ public abstract class PagedView extends ViewGroup { if (mHasScrollIndicator && mScrollIndicator == null) { ViewGroup parent = (ViewGroup) getParent(); mScrollIndicator = (View) (parent.findViewById(R.id.paged_view_indicator)); - mScrollIndicator.setLayerType(View.LAYER_TYPE_HARDWARE, null); mHasScrollIndicator = mScrollIndicator != null; if (mHasScrollIndicator) { mScrollIndicator.setVisibility(View.VISIBLE); @@ -1806,6 +1805,7 @@ public abstract class PagedView extends ViewGroup { indicatorPos += indicatorCenterOffset; } mScrollIndicator.setTranslationX(indicatorPos); + mScrollIndicator.invalidate(); } public void showScrollIndicatorTrack() { diff --git a/src/com/android/launcher2/SearchDropTargetBar.java b/src/com/android/launcher2/SearchDropTargetBar.java index 03ca38fb42..3a7f24b093 100644 --- a/src/com/android/launcher2/SearchDropTargetBar.java +++ b/src/com/android/launcher2/SearchDropTargetBar.java @@ -129,26 +129,14 @@ public class SearchDropTargetBar extends FrameLayout implements DragController.D @Override public void onAnimationStart(Animator animation) { mQSBSearchBar.setVisibility(View.VISIBLE); - mQSBSearchBar.setLayerType(View.LAYER_TYPE_HARDWARE, null); - } - - @Override - public void onAnimationEnd(Animator animation) { - mQSBSearchBar.setLayerType(View.LAYER_TYPE_NONE, null); } }); mQSBSearchBarFadeOutAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "alpha", 0f); mQSBSearchBarFadeOutAnim.setDuration(sTransitionOutDuration); mQSBSearchBarFadeOutAnim.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animation) { - mQSBSearchBar.setLayerType(View.LAYER_TYPE_HARDWARE, null); - } - @Override public void onAnimationEnd(Animator animation) { mQSBSearchBar.setVisibility(View.INVISIBLE); - mQSBSearchBar.setLayerType(View.LAYER_TYPE_NONE, null); } }); } diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java index 309fda8915..3a45dd2fe0 100644 --- a/src/com/android/launcher2/Workspace.java +++ b/src/com/android/launcher2/Workspace.java @@ -17,6 +17,8 @@ package com.android.launcher2; import android.animation.Animator; +import android.animation.Animator.AnimatorListener; +import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.TimeInterpolator; @@ -24,7 +26,6 @@ import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.app.AlertDialog; import android.app.WallpaperManager; -import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.content.ClipData; @@ -56,7 +57,6 @@ import android.view.DragEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import android.view.View.MeasureSpec; import android.view.animation.DecelerateInterpolator; import android.widget.ImageView; import android.widget.TextView; @@ -77,7 +77,7 @@ import java.util.List; */ public class Workspace extends SmoothPagedView implements DropTarget, DragSource, DragScroller, View.OnTouchListener, - DragController.DragListener, LauncherTransitionable { + DragController.DragListener { @SuppressWarnings({"UnusedDeclaration"}) private static final String TAG = "Launcher.Workspace"; @@ -159,6 +159,8 @@ public class Workspace extends SmoothPagedView private State mState = State.NORMAL; private boolean mIsSwitchingState = false; + private AnimatorListener mChangeStateAnimationListener; + boolean mAnimatingViewIntoPlace = false; boolean mIsDragOccuring = false; boolean mChildrenLayersEnabled = true; @@ -385,6 +387,20 @@ public class Workspace extends SmoothPagedView // In this case, we will skip drawing background protection } + mChangeStateAnimationListener = new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + mIsSwitchingState = true; + } + + @Override + public void onAnimationEnd(Animator animation) { + mIsSwitchingState = false; + mWallpaperOffset.setOverrideHorizontalCatchupConstant(false); + updateChildrenLayersEnabled(); + } + }; + mWallpaperOffset = new WallpaperOffsetInterpolator(); Display display = mLauncher.getWindowManager().getDefaultDisplay(); mDisplayWidth = display.getWidth(); @@ -1624,10 +1640,26 @@ public class Workspace extends SmoothPagedView cl.setBackgroundAlphaMultiplier(finalAlphaMultiplierValue); cl.setAlpha(finalAlpha); cl.setRotationY(rotation); + mChangeStateAnimationListener.onAnimationEnd(null); } } if (animated) { + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(android.animation.Animator animation) { + // The above code to determine initialAlpha and finalAlpha will ensure that only + // the current page is visible during (and subsequently, after) the transition + // animation. If fade adjacent pages is disabled, then re-enable the page + // visibility after the transition animation. + if (!mFadeInAdjacentScreens) { + for (int i = 0; i < getChildCount(); i++) { + final CellLayout cl = (CellLayout) getChildAt(i); + cl.setAlpha(1f); + } + } + } + }); for (int index = 0; index < getChildCount(); index++) { final int i = index; final CellLayout cl = (CellLayout) getChildAt(i); @@ -1683,6 +1715,9 @@ public class Workspace extends SmoothPagedView } } anim.setStartDelay(delay); + // If we call this when we're not animated, onAnimationEnd is never called on + // the listener; make sure we only use the listener when we're actually animating + anim.addListener(mChangeStateAnimationListener); } if (stateIsSpringLoaded) { @@ -1698,33 +1733,6 @@ public class Workspace extends SmoothPagedView return anim; } - @Override - public void onLauncherTransitionStart(Launcher l, boolean animated, boolean toWorkspace) { - mIsSwitchingState = true; - } - - @Override - public void onLauncherTransitionEnd(Launcher l, boolean animated, boolean toWorkspace) { - mIsSwitchingState = false; - mWallpaperOffset.setOverrideHorizontalCatchupConstant(false); - updateChildrenLayersEnabled(); - // The code in getChangeStateAnimation to determine initialAlpha and finalAlpha will ensure - // ensure that only the current page is visible during (and subsequently, after) the - // transition animation. If fade adjacent pages is disabled, then re-enable the page - // visibility after the transition animation. - if (!mFadeInAdjacentScreens) { - for (int i = 0; i < getChildCount(); i++) { - final CellLayout cl = (CellLayout) getChildAt(i); - cl.setAlpha(1f); - } - } - } - - @Override - public View getContent() { - return this; - } - /** * Draw the View v into the given Canvas. *