diff options
author | Adam Cohen <adamcohen@google.com> | 2011-08-31 14:21:55 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-08-31 14:21:55 -0700 |
commit | 02f258733a79329d4b7300839ed7ff3763ad7d42 (patch) | |
tree | 16ca4a134c0438d1696641d2c8f7bb4f16f8056a /src | |
parent | 2e9f4fb38e833b18fe403da17b00f830d6a5e86c (diff) | |
parent | 7777d967a60ecfd34ad2d94141d598fca4021058 (diff) | |
download | android_packages_apps_Trebuchet-02f258733a79329d4b7300839ed7ff3763ad7d42.tar.gz android_packages_apps_Trebuchet-02f258733a79329d4b7300839ed7ff3763ad7d42.tar.bz2 android_packages_apps_Trebuchet-02f258733a79329d4b7300839ed7ff3763ad7d42.zip |
Merge "Refactor and simplify home transitions"
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/launcher2/AppsCustomizePagedView.java | 2 | ||||
-rw-r--r-- | src/com/android/launcher2/Launcher.java | 64 | ||||
-rw-r--r-- | src/com/android/launcher2/Workspace.java | 617 |
3 files changed, 178 insertions, 505 deletions
diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java index 3adf404b5..df98c89ff 100644 --- a/src/com/android/launcher2/AppsCustomizePagedView.java +++ b/src/com/android/launcher2/AppsCustomizePagedView.java @@ -529,7 +529,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen // Go into spring loaded mode (must happen before we startDrag()) int currentPageIndex = mLauncher.getWorkspace().getCurrentPage(); CellLayout currentPage = (CellLayout) mLauncher.getWorkspace().getChildAt(currentPageIndex); - mLauncher.enterSpringLoadedDragMode(currentPage); + mLauncher.enterSpringLoadedDragMode(); if (v instanceof PagedViewIcon) { beginDraggingApplication(v); diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index a6c1de6ef..27382e85c 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -90,6 +90,7 @@ import android.widget.Toast; import com.android.common.Search; import com.android.launcher.R; import com.android.launcher2.DropTarget.DragObject; +import com.android.launcher2.Workspace.State; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -2058,18 +2059,8 @@ public final class Launcher extends Activity */ private void setPivotsForZoom(View view, State state, float scaleFactor) { final int height = view.getHeight(); - view.setPivotX(view.getWidth() / 2.0f); - // Set pivotY so that at the starting zoom factor, the view is partially - // visible. Modifying initialHeightFactor changes how much of the view is - // initially showing, and hence the perceived angle from which the view enters. - if (state == State.APPS_CUSTOMIZE) { - final float initialHeightFactor = 0.175f; - view.setPivotY((1 - initialHeightFactor) * height); - } else { - final float initialHeightFactor = 0.2f; - view.setPivotY(-initialHeightFactor * height); - } + view.setPivotY(view.getHeight() / 2.0f); } void updateWallpaperVisibility(boolean visible) { @@ -2098,7 +2089,7 @@ public final class Launcher extends Activity setPivotsForZoom(toView, toState, scale); // Shrink workspaces away if going to AppsCustomize from workspace - mWorkspace.shrink(Workspace.State.SMALL, animated); + mWorkspace.changeState(Workspace.State.SMALL, animated); hideHotseat(animated); if (animated) { @@ -2106,7 +2097,8 @@ public final class Launcher extends Activity scaleAnim.setInterpolator(new Workspace.ZoomOutInterpolator()); scaleAnim.addUpdateListener(new LauncherAnimatorUpdateListener() { public void onAnimationUpdate(float a, float b) { - ((View) toView.getParent()).fastInvalidate(); + ((View) toView.getParent()).invalidate(); + toView.fastInvalidate(); toView.setFastScaleX(a * scale + b * 1f); toView.setFastScaleY(a * scale + b * 1f); } @@ -2152,6 +2144,7 @@ public final class Launcher extends Activity // Hide the workspace scrollbar mWorkspace.hideScrollingIndicator(true); mWorkspace.hideDockDivider(true); + mWorkspace.showAllAppsAnimationComplete(); } updateWallpaperVisibility(false); } @@ -2200,12 +2193,7 @@ public final class Launcher extends Activity final View fromView = mAppsCustomizeTabHost; setPivotsForZoom(fromView, fromState, scaleFactor); - updateWallpaperVisibility(true); - - if (!springLoaded) { - mWorkspace.unshrink(animated); - } showHotseat(animated); if (animated) { if (mStateAnimation != null) mStateAnimation.cancel(); @@ -2237,13 +2225,6 @@ public final class Launcher extends Activity } alphaAnim.addListener(new AnimatorListenerAdapter() { @Override - public void onAnimationStart(android.animation.Animator animation) { - if (!springLoaded) { - mWorkspace.showDockDivider(false); - } - mWorkspace.showScrollingIndicator(false); - } - @Override public void onAnimationEnd(Animator animation) { updateWallpaperVisibility(true); fromView.setVisibility(View.GONE); @@ -2261,32 +2242,19 @@ public final class Launcher extends Activity if (fromView instanceof LauncherTransitionable) { ((LauncherTransitionable) fromView).onLauncherTransitionStart(null, true); ((LauncherTransitionable) fromView).onLauncherTransitionEnd(null, true); - - if (!springLoaded && !LauncherApplication.isScreenLarge()) { - // Flash the workspace scrollbar - mWorkspace.showDockDivider(true); - mWorkspace.flashScrollingIndicator(); - } } } } void showWorkspace(boolean animated) { - showWorkspace(animated, null); - } - - void showWorkspace(boolean animated, CellLayout layout) { - if (layout != null) { - // always animated, but that's ok since we never specify a layout and - // want no animation - mWorkspace.unshrink(layout); - } else { - mWorkspace.unshrink(animated); - } + mWorkspace.changeState(Workspace.State.NORMAL, animated); if (mState == State.APPS_CUSTOMIZE) { closeAllApps(animated); } + mWorkspace.showDockDivider(!animated); + mWorkspace.flashScrollingIndicator(); + // Change the state *after* we've called all the transition code mState = State.WORKSPACE; @@ -2298,26 +2266,27 @@ public final class Launcher extends Activity getWindow().getDecorView().sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); } - void enterSpringLoadedDragMode(CellLayout layout) { + void enterSpringLoadedDragMode() { if (mState == State.APPS_CUSTOMIZE) { - mWorkspace.enterSpringLoadedDragMode(layout); + mWorkspace.changeState(Workspace.State.SPRING_LOADED); cameraZoomIn(State.APPS_CUSTOMIZE, true, true); mState = State.APPS_CUSTOMIZE_SPRING_LOADED; } - // Otherwise, we are not in spring loaded mode, so don't do anything. } + void exitSpringLoadedDragModeDelayed(final boolean successfulDrop, boolean extendedDelay) { mHandler.postDelayed(new Runnable() { @Override public void run() { - exitSpringLoadedDragMode(); - if (successfulDrop) { // Before we show workspace, hide all apps again because // exitSpringLoadedDragMode made it visible. This is a bit hacky; we should // clean up our state transition functions mAppsCustomizeTabHost.setVisibility(View.GONE); + mSearchDeleteBar.showSearchBar(true); showWorkspace(true); + } else { + exitSpringLoadedDragMode(); } } }, (extendedDelay ? @@ -2326,7 +2295,6 @@ public final class Launcher extends Activity } void exitSpringLoadedDragMode() { if (mState == State.APPS_CUSTOMIZE_SPRING_LOADED) { - mWorkspace.exitSpringLoadedDragMode(Workspace.State.SMALL); cameraZoomOut(State.APPS_CUSTOMIZE, true, true); mState = State.APPS_CUSTOMIZE; } diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java index 633cbe525..6f94c9310 100644 --- a/src/com/android/launcher2/Workspace.java +++ b/src/com/android/launcher2/Workspace.java @@ -157,19 +157,14 @@ public class Workspace extends SmoothPagedView // in all apps or customize mode) enum State { NORMAL, SPRING_LOADED, SMALL }; - private State mState; + private State mState = State.NORMAL; private boolean mIsSwitchingState = false; - + boolean mEnableSyncWallpaper = false; private boolean mSwitchStateAfterFirstLayout = false; private State mStateAfterFirstLayout; private AnimatorSet mAnimator; - private AnimatorListener mShrinkAnimationListener; - private AnimatorListener mUnshrinkAnimationListener; - // Working around the face that cancelled animations may not actually be cancelled if they - // are cancelled before starting - private boolean mShrinkAnimationEnabled; - private boolean mUnshrinkAnimationEnabled; + private AnimatorListener mChangeStateAnimationListener; boolean mAnimatingViewIntoPlace = false; boolean mIsDragOccuring = false; @@ -341,6 +336,7 @@ public class Workspace extends SmoothPagedView mIconCache = app.getIconCache(); mExternalDragOutlinePaint.setAntiAlias(true); setWillNotDraw(false); + setChildrenDrawnWithCacheEnabled(true); try { final Resources res = getResources(); @@ -349,7 +345,7 @@ public class Workspace extends SmoothPagedView // In this case, we will skip drawing background protection } - mUnshrinkAnimationListener = new AnimatorListenerAdapter() { + mChangeStateAnimationListener = new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { mIsSwitchingState = true; @@ -358,24 +354,12 @@ public class Workspace extends SmoothPagedView @Override public void onAnimationEnd(Animator animation) { mIsSwitchingState = false; - mSyncWallpaperOffsetWithScroll = true; mWallpaperOffset.setOverrideHorizontalCatchupConstant(false); mAnimator = null; updateChildrenLayersEnabled(); } }; - mShrinkAnimationListener = new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animation) { - mIsSwitchingState = true; - } - @Override - public void onAnimationEnd(Animator animation) { - mIsSwitchingState = false; - mWallpaperOffset.setOverrideHorizontalCatchupConstant(false); - mAnimator = null; - } - }; + mSnapVelocity = 600; mWallpaperOffset = new WallpaperOffsetInterpolator(); } @@ -1097,7 +1081,7 @@ public class Workspace extends SmoothPagedView scrollProgress = Math.min(scrollProgress, 1.0f); scrollProgress = Math.max(scrollProgress, -1.0f); - if (mState != State.SPRING_LOADED) { + if (!isSmall()) { // If the current page (i) is being overscrolled, we use a different // set of rules for setting the background alpha multiplier. if ((mScrollX < 0 && i == 0) || (mScrollX > mMaxScrollX && @@ -1146,7 +1130,7 @@ public class Workspace extends SmoothPagedView // post this to avoid a stack overflow / tangled onLayout calls post(new Runnable() { public void run() { - shrink(mStateAfterFirstLayout, false); + changeState(mStateAfterFirstLayout, false); } }); } @@ -1264,8 +1248,7 @@ public class Workspace extends SmoothPagedView } private void updateChildrenLayersEnabled() { - boolean small = - isSmall() || mIsSwitchingState || mState == State.SPRING_LOADED; + boolean small = isSmall() || mIsSwitchingState; boolean dragging = mAnimatingViewIntoPlace || mIsDragOccuring; boolean enableChildrenLayers = small || dragging || isPageMoving(); @@ -1291,228 +1274,6 @@ public class Workspace extends SmoothPagedView position[0], position[1], 0, null); } - private float getYScaleForScreen(int screen) { - int x = Math.abs(screen - 2); - - // TODO: This should be generalized for use with arbitrary rotation angles. - switch(x) { - case 0: return EXTRA_SCALE_FACTOR_0; - case 1: return EXTRA_SCALE_FACTOR_1; - case 2: return EXTRA_SCALE_FACTOR_2; - } - return 1.0f; - } - - public void shrink(State shrinkState) { - shrink(shrinkState, true); - } - - // we use this to shrink the workspace for the all apps view and the customize view - public void shrink(final State shrinkState, boolean animated) { - if (mFirstLayout) { - // (mFirstLayout == "first layout has not happened yet") - // if we get a call to shrink() as part of our initialization (for example, if - // Launcher is started in All Apps mode) then we need to wait for a layout call - // to get our width so we can layout the mini-screen views correctly - mSwitchStateAfterFirstLayout = true; - mStateAfterFirstLayout = shrinkState; - return; - } - - // Stop any scrolling, move to the current page right away - setCurrentPage((mNextPage != INVALID_PAGE) ? mNextPage : mCurrentPage); - - CellLayout currentPage = (CellLayout) getChildAt(mCurrentPage); - if (currentPage == null) { - Log.w(TAG, "currentPage is NULL! mCurrentPage " + mCurrentPage - + " mNextPage " + mNextPage); - return; - } - if (currentPage.getBackgroundAlphaMultiplier() < 1.0f) { - currentPage.setBackgroundAlpha(0.0f); - } - currentPage.setBackgroundAlphaMultiplier(1.0f); - - mState = shrinkState; - updateChildrenLayersEnabled(); - - // we intercept and reject all touch events when we're small, so be sure to reset the state - mTouchState = TOUCH_STATE_REST; - mActivePointerId = INVALID_POINTER; - - final Resources res = getResources(); - final int screenWidth = getWidth(); - final int screenHeight = getHeight(); - - // How much the workspace shrinks when we enter all apps or customization mode - final float shrinkFactor = res.getInteger(R.integer.config_workspaceShrinkPercent) / 100.0f; - - // Making the assumption that all pages have the same width as the 0th - final int pageWidth = getChildAt(0).getMeasuredWidth(); - final int pageHeight = getChildAt(0).getMeasuredHeight(); - - final int scaledPageWidth = (int) (shrinkFactor * pageWidth); - final int scaledPageHeight = (int) (shrinkFactor * pageHeight); - final float extraScaledSpacing = res.getDimension(R.dimen.smallScreenExtraSpacing); - - final int screenCount = getChildCount(); - float totalWidth = screenCount * scaledPageWidth + (screenCount - 1) * extraScaledSpacing; - - // We shrink and disappear to nothing - boolean isPortrait = getMeasuredHeight() > getMeasuredWidth(); - float y = screenHeight - scaledPageHeight - (isPortrait ? - getResources().getDimension(R.dimen.allAppsSmallScreenVerticalMarginPortrait) : - getResources().getDimension(R.dimen.allAppsSmallScreenVerticalMarginLandscape)); - float finalAlpha = 0.0f; - - int duration = res.getInteger(R.integer.config_appsCustomizeWorkspaceShrinkTime); - - // We animate all the screens to the centered position in workspace - // At the same time, the screens become greyed/dimmed - - // newX is initialized to the left-most position of the centered screens - float x = mScroller.getFinalX() + screenWidth / 2 - totalWidth / 2; - - // We are going to scale about the center of the view, so we need to adjust the positions - // of the views accordingly - x -= (pageWidth - scaledPageWidth) / 2.0f; - y -= (pageHeight - scaledPageHeight) / 2.0f; - - if (mAnimator != null) { - mAnimator.cancel(); - } - - mAnimator = new AnimatorSet(); - // Workaround the AnimatorSet cancel bug... - mUnshrinkAnimationEnabled = false; - mShrinkAnimationEnabled = true; - - initAnimationArrays(); - - for (int i = 0; i < screenCount; i++) { - final CellLayout cl = (CellLayout) getChildAt(i); - - float rotation = (-i + 2) * WORKSPACE_ROTATION; - float rotationScaleX = (float) (1.0f / Math.cos(Math.PI * rotation / 180.0f)); - float rotationScaleY = getYScaleForScreen(i); - - mOldAlphas[i] = cl.getAlpha(); - mNewAlphas[i] = finalAlpha; - if (animated && (mOldAlphas[i] != 0f || mNewAlphas[i] != 0f)) { - // if the CellLayout will be visible during the animation, force building its - // hardware layer immediately so we don't see a blip later in the animation - cl.buildChildrenLayer(); - } - if (animated) { - mOldTranslationXs[i] = cl.getX(); - mOldTranslationYs[i] = cl.getY(); - mOldScaleXs[i] = cl.getScaleX(); - mOldScaleYs[i] = cl.getScaleY(); - mOldBackgroundAlphas[i] = cl.getBackgroundAlpha(); - mOldRotationYs[i] = cl.getRotationY(); - mNewTranslationXs[i] = x; - mNewTranslationYs[i] = y; - mNewScaleXs[i] = shrinkFactor * rotationScaleX; - mNewScaleYs[i] = shrinkFactor * rotationScaleY; - mNewBackgroundAlphas[i] = finalAlpha; - mNewRotationYs[i] = rotation; - } else { - cl.setX((int)x); - cl.setY((int)y); - cl.setScaleX(shrinkFactor * rotationScaleX); - cl.setScaleY(shrinkFactor * rotationScaleY); - cl.setBackgroundAlpha(finalAlpha); - cl.setFastAlpha(finalAlpha); - cl.setRotationY(rotation); - mShrinkAnimationListener.onAnimationEnd(null); - } - // increment newX for the next screen - x += scaledPageWidth + extraScaledSpacing; - } - - float wallpaperOffset = 0.5f; - Display display = mLauncher.getWindowManager().getDefaultDisplay(); - int wallpaperTravelHeight = (int) (display.getHeight() * - wallpaperTravelToScreenHeightRatio(display.getWidth(), display.getHeight())); - float offsetFromCenter = (wallpaperTravelHeight / (float) mWallpaperHeight) / 2f; - boolean isLandscape = display.getWidth() > display.getHeight(); - - // on phones, don't scroll the wallpaper horizontally or vertically when switching - // to/from all apps - final boolean enableWallpaperEffects = - isHardwareAccelerated() && LauncherApplication.isScreenLarge(); - if (enableWallpaperEffects) { - switch (shrinkState) { - // animating in - case SPRING_LOADED: - wallpaperOffset = 0.5f; - mWallpaperOffset.setVerticalCatchupConstant(isLandscape ? 0.34f : 0.32f); - break; - case SMALL: - // allapps - wallpaperOffset = 0.5f - offsetFromCenter; - mWallpaperOffset.setVerticalCatchupConstant(isLandscape ? 0.34f : 0.32f); - break; - } - } - - setLayoutScale(1.0f); - if (animated) { - if (enableWallpaperEffects) { - mWallpaperOffset.setHorizontalCatchupConstant(0.46f); - mWallpaperOffset.setOverrideHorizontalCatchupConstant(true); - } - - mSyncWallpaperOffsetWithScroll = false; - - ValueAnimator animWithInterpolator = - ValueAnimator.ofFloat(0f, 1f).setDuration(duration); - animWithInterpolator.setInterpolator(mZoomOutInterpolator); - - final float oldHorizontalWallpaperOffset = getHorizontalWallpaperOffset(); - final float oldVerticalWallpaperOffset = getVerticalWallpaperOffset(); - final float newHorizontalWallpaperOffset = 0.5f; - final float newVerticalWallpaperOffset = wallpaperOffset; - animWithInterpolator.addUpdateListener(new LauncherAnimatorUpdateListener() { - public void onAnimationUpdate(float a, float b) { - if (!mShrinkAnimationEnabled) return; - mTransitionProgress = b; - if (b == 0f) { - // an optimization, and required for correct behavior. - return; - } - invalidate(); - if (enableWallpaperEffects) { - setHorizontalWallpaperOffset( - a * oldHorizontalWallpaperOffset + b * newHorizontalWallpaperOffset); - setVerticalWallpaperOffset( - a * oldVerticalWallpaperOffset + b * newVerticalWallpaperOffset); - } - for (int i = 0; i < screenCount; i++) { - final CellLayout cl = (CellLayout) getChildAt(i); - cl.fastInvalidate(); - cl.setFastX(a * mOldTranslationXs[i] + b * mNewTranslationXs[i]); - cl.setFastY(a * mOldTranslationYs[i] + b * mNewTranslationYs[i]); - cl.setFastScaleX(a * mOldScaleXs[i] + b * mNewScaleXs[i]); - cl.setFastScaleY(a * mOldScaleYs[i] + b * mNewScaleYs[i]); - cl.setFastBackgroundAlpha( - a * mOldBackgroundAlphas[i] + b * mNewBackgroundAlphas[i]); - cl.setFastAlpha(a * mOldAlphas[i] + b * mNewAlphas[i]); - cl.setFastRotationY(a * mOldRotationYs[i] + b * mNewRotationYs[i]); - } - } - }); - mAnimator.playTogether(animWithInterpolator); - mAnimator.addListener(mShrinkAnimationListener); - mAnimator.start(); - } else if (enableWallpaperEffects) { - setVerticalWallpaperOffset(wallpaperOffset); - setHorizontalWallpaperOffset(0.5f); - updateWallpaperOffsetImmediately(); - } - setChildrenDrawnWithCacheEnabled(true); - } - @Override protected void updateAdjacentPagesAlpha() { if (!isSmall()) { @@ -1576,7 +1337,6 @@ public class Workspace extends SmoothPagedView } } - private final ZoomOutInterpolator mZoomOutInterpolator = new ZoomOutInterpolator(); private final ZoomInInterpolator mZoomInInterpolator = new ZoomInInterpolator(); /* @@ -1621,40 +1381,11 @@ public class Workspace extends SmoothPagedView } } - // We call this when we trigger an unshrink by clicking on the CellLayout cl - public void unshrink(CellLayout clThatWasClicked) { - unshrink(clThatWasClicked, false); - } - - public void unshrink(CellLayout clThatWasClicked, boolean springLoaded) { - int newCurrentPage = indexOfChild(clThatWasClicked); - if (isSmall()) { - if (springLoaded) { - setLayoutScale(mSpringLoadedShrinkFactor); - } - scrollToNewPageWithoutMovingPages(newCurrentPage); - unshrink(true, springLoaded); - } - } - - - public void enterSpringLoadedDragMode(CellLayout clThatWasClicked) { - unshrink(clThatWasClicked, true); - } - - public void exitSpringLoadedDragMode(State shrinkState) { - shrink(shrinkState); - } - public void exitWidgetResizeMode() { DragLayer dragLayer = mLauncher.getDragLayer(); dragLayer.clearAllResizeFrames(); } - void unshrink(boolean animated) { - unshrink(animated, false); - } - private void initAnimationArrays() { final int childCount = getChildCount(); if (mOldTranslationXs != null) return; @@ -1676,213 +1407,187 @@ public class Workspace extends SmoothPagedView mNewRotationYs = new float[childCount]; } - void unshrink(boolean animated, final boolean springLoaded) { + public void changeState(State shrinkState) { + changeState(shrinkState, true); + } + + void showAllAppsAnimationComplete() { + if (mEnableSyncWallpaper) { + mSyncWallpaperOffsetWithScroll = true; + mEnableSyncWallpaper = true; + } + } + + void changeState(final State state, boolean animated) { if (mFirstLayout) { // (mFirstLayout == "first layout has not happened yet") // cancel any pending shrinks that were set earlier mSwitchStateAfterFirstLayout = false; - mStateAfterFirstLayout = State.NORMAL; + mStateAfterFirstLayout = state; return; } - if (isSmall()) { - float finalScaleFactor = 1.0f; - float finalBackgroundAlpha = 0.0f; - if (springLoaded) { - finalScaleFactor = mSpringLoadedShrinkFactor; - finalBackgroundAlpha = 1.0f; - mState = State.SPRING_LOADED; + if (mAnimator != null) { + mAnimator.cancel(); + } + + // Stop any scrolling, move to the current page right away + setCurrentPage((mNextPage != INVALID_PAGE) ? mNextPage : mCurrentPage); + + float finalScaleFactor = 1.0f; + float finalBackgroundAlpha = 0.0f; + boolean normalState = false; + State oldState = mState; + mState = state; + boolean zoomIn = true; + if (state != State.NORMAL) { + finalScaleFactor = mSpringLoadedShrinkFactor - (state == State.SMALL ? 0.1f : 0); + finalBackgroundAlpha = 1.0f; + if (oldState == State.NORMAL && state == State.SMALL) { + zoomIn = false; + if (animated) { + mEnableSyncWallpaper = true; + mSyncWallpaperOffsetWithScroll = false; + hideScrollingIndicator(true); + } + setLayoutScale(finalScaleFactor); + updateChildrenLayersEnabled(); } else { - mState = State.NORMAL; - } - if (mAnimator != null) { - mAnimator.cancel(); + setLayoutScale(finalScaleFactor); } + } else { + setLayoutScale(1.0f); + normalState = true; + } - mAnimator = new AnimatorSet(); - - // Workaround the AnimatorSet cancel bug... - mShrinkAnimationEnabled = false; - mUnshrinkAnimationEnabled = true; + float translationX = 0; + float translationY = 0; - final int screenCount = getChildCount(); - initAnimationArrays(); + mAnimator = new AnimatorSet(); - final int duration = getResources().getInteger(R.integer.config_workspaceUnshrinkTime); - for (int i = 0; i < screenCount; i++) { - final CellLayout cl = (CellLayout)getChildAt(i); - float finalAlphaValue = 0f; - float rotation = 0f; + final int screenCount = getChildCount(); + initAnimationArrays(); - // Set the final alpha depending on whether we are fading side pages. On phone ui, - // we don't do any of the rotation, or the fading alpha in portrait. See the - // ctor and screenScrolled(). - if (mFadeInAdjacentScreens && !springLoaded) { - finalAlphaValue = (i == mCurrentPage) ? 1f : 0f; - } else { - finalAlphaValue = 1f; - } + final int duration = zoomIn ? + getResources().getInteger(R.integer.config_workspaceUnshrinkTime) : + getResources().getInteger(R.integer.config_appsCustomizeWorkspaceShrinkTime); + for (int i = 0; i < screenCount; i++) { + final CellLayout cl = (CellLayout)getChildAt(i); + float finalAlphaValue = 0f; + float rotation = 0f; + + // Set the final alpha depending on whether we are fading side pages. On phone ui, + // we don't do any of the rotation, or the fading alpha in portrait. See the + // ctor and screenScrolled(). + if (mFadeInAdjacentScreens && normalState) { + finalAlphaValue = (i == mCurrentPage) ? 1f : 0f; + } else { + finalAlphaValue = 1f; + } - if (LauncherApplication.isScreenLarge()) { - if (i < mCurrentPage) { - rotation = WORKSPACE_ROTATION; - } else if (i > mCurrentPage) { - rotation = -WORKSPACE_ROTATION; - } + if (LauncherApplication.isScreenLarge()) { + if (i < mCurrentPage) { + rotation = WORKSPACE_ROTATION; + } else if (i > mCurrentPage) { + rotation = -WORKSPACE_ROTATION; } - float finalAlphaMultiplierValue = 1f; + } - float translation = 0f; + float finalAlphaMultiplierValue = 1f; + // If the screen is not xlarge, then don't rotate the CellLayouts + // NOTE: If we don't update the side pages alpha, then we should not hide the side + // pages. see unshrink(). + if (LauncherApplication.isScreenLarge()) { + translationX = getOffsetXForRotation(rotation, cl.getWidth(), cl.getHeight()); + } - // If the screen is not xlarge, then don't rotate the CellLayouts - // NOTE: If we don't update the side pages alpha, then we should not hide the side - // pages. see unshrink(). - if (LauncherApplication.isScreenLarge()) { - translation = getOffsetXForRotation(rotation, cl.getWidth(), cl.getHeight()); - } + mOldAlphas[i] = cl.getAlpha(); + mNewAlphas[i] = finalAlphaValue; + if (animated) { + mOldTranslationXs[i] = cl.getTranslationX(); + mOldTranslationYs[i] = cl.getTranslationY(); + mOldScaleXs[i] = cl.getScaleX(); + mOldScaleYs[i] = cl.getScaleY(); + mOldBackgroundAlphas[i] = cl.getBackgroundAlpha(); + mOldBackgroundAlphaMultipliers[i] = cl.getBackgroundAlphaMultiplier(); + mOldRotationYs[i] = cl.getRotationY(); - mOldAlphas[i] = cl.getAlpha(); - mNewAlphas[i] = finalAlphaValue; - if (animated) { - mOldTranslationXs[i] = cl.getTranslationX(); - mOldTranslationYs[i] = cl.getTranslationY(); - mOldScaleXs[i] = cl.getScaleX(); - mOldScaleYs[i] = cl.getScaleY(); - mOldBackgroundAlphas[i] = cl.getBackgroundAlpha(); - mOldBackgroundAlphaMultipliers[i] = cl.getBackgroundAlphaMultiplier(); - mOldRotationYs[i] = cl.getRotationY(); - - mNewTranslationXs[i] = translation; - mNewTranslationYs[i] = 0f; - mNewScaleXs[i] = finalScaleFactor; - mNewScaleYs[i] = finalScaleFactor; - mNewBackgroundAlphas[i] = finalBackgroundAlpha; - mNewBackgroundAlphaMultipliers[i] = finalAlphaMultiplierValue; - mNewRotationYs[i] = rotation; - } else { - cl.setTranslationX(translation); - cl.setTranslationY(0.0f); - cl.setScaleX(finalScaleFactor); - cl.setScaleY(finalScaleFactor); - cl.setBackgroundAlpha(0.0f); - cl.setBackgroundAlphaMultiplier(finalAlphaMultiplierValue); - cl.setAlpha(finalAlphaValue); - cl.setRotationY(rotation); - mUnshrinkAnimationListener.onAnimationEnd(null); - } + mNewTranslationXs[i] = translationX; + mNewTranslationYs[i] = translationY; + mNewScaleXs[i] = finalScaleFactor; + mNewScaleYs[i] = finalScaleFactor; + mNewBackgroundAlphas[i] = finalBackgroundAlpha; + mNewBackgroundAlphaMultipliers[i] = finalAlphaMultiplierValue; + mNewRotationYs[i] = rotation; + } else { + cl.setTranslationX(translationX); + cl.setTranslationY(translationY); + cl.setScaleX(finalScaleFactor); + cl.setScaleY(finalScaleFactor); + cl.setBackgroundAlpha(0.0f); + cl.setBackgroundAlphaMultiplier(finalAlphaMultiplierValue); + cl.setAlpha(finalAlphaValue); + cl.setRotationY(rotation); + mChangeStateAnimationListener.onAnimationEnd(null); } + } - // Unshrink the hotset the same amount we are unshrinking the screens - if (mLauncher.getHotseat() != null) { - View hotseat = mLauncher.getHotseat().getLayout(); - hotseat.setScaleX(finalScaleFactor); - hotseat.setScaleY(finalScaleFactor); - } + if (animated) { + ValueAnimator animWithInterpolator = + ValueAnimator.ofFloat(0f, 1f).setDuration(duration); - Display display = mLauncher.getWindowManager().getDefaultDisplay(); - boolean isLandscape = display.getWidth() > display.getHeight(); - // on phones, don't scroll the wallpaper horizontally or vertically when switching - // to/from all apps - final boolean enableWallpaperEffects = - isHardwareAccelerated() && LauncherApplication.isScreenLarge(); - if (enableWallpaperEffects) { - switch (mState) { - // animating out - case SPRING_LOADED: - if (animated) { - mWallpaperOffset.setHorizontalCatchupConstant(isLandscape ? 0.49f : 0.46f); - mWallpaperOffset.setVerticalCatchupConstant(isLandscape ? 0.49f : 0.46f); - mWallpaperOffset.setOverrideHorizontalCatchupConstant(true); - } - break; - case SMALL: - // all apps - if (animated) { - mWallpaperOffset.setHorizontalCatchupConstant(isLandscape ? 0.65f : 0.65f); - mWallpaperOffset.setVerticalCatchupConstant(isLandscape ? 0.65f : 0.65f); - mWallpaperOffset.setOverrideHorizontalCatchupConstant(true); - } - break; - } - } - if (animated) { - ValueAnimator animWithInterpolator = - ValueAnimator.ofFloat(0f, 1f).setDuration(duration); + if (zoomIn) { animWithInterpolator.setInterpolator(mZoomInInterpolator); + } - final float oldHorizontalWallpaperOffset = enableWallpaperEffects ? - getHorizontalWallpaperOffset() : 0; - final float oldVerticalWallpaperOffset = enableWallpaperEffects ? - getVerticalWallpaperOffset() : 0; - final float newHorizontalWallpaperOffset = enableWallpaperEffects ? - wallpaperOffsetForCurrentScroll() : 0; - final float newVerticalWallpaperOffset = enableWallpaperEffects ? 0.5f : 0; - animWithInterpolator.addUpdateListener(new LauncherAnimatorUpdateListener() { - public void onAnimationUpdate(float a, float b) { - if (!mUnshrinkAnimationEnabled) return; - mTransitionProgress = b; - if (b == 0f) { - // an optimization, but not required - return; - } - invalidate(); - if (enableWallpaperEffects) { - setHorizontalWallpaperOffset(a * oldHorizontalWallpaperOffset - + b * newHorizontalWallpaperOffset); - setVerticalWallpaperOffset(a * oldVerticalWallpaperOffset - + b * newVerticalWallpaperOffset); - } - for (int i = 0; i < screenCount; i++) { - final CellLayout cl = (CellLayout) getChildAt(i); - cl.fastInvalidate(); - cl.setFastTranslationX( - a * mOldTranslationXs[i] + b * mNewTranslationXs[i]); - cl.setFastTranslationY( - a * mOldTranslationYs[i] + b * mNewTranslationYs[i]); - cl.setFastScaleX(a * mOldScaleXs[i] + b * mNewScaleXs[i]); - cl.setFastScaleY(a * mOldScaleYs[i] + b * mNewScaleYs[i]); - cl.setFastBackgroundAlpha( - a * mOldBackgroundAlphas[i] + b * mNewBackgroundAlphas[i]); - cl.setBackgroundAlphaMultiplier(a * mOldBackgroundAlphaMultipliers[i] + - b * mNewBackgroundAlphaMultipliers[i]); - cl.setFastAlpha(a * mOldAlphas[i] + b * mNewAlphas[i]); - } + animWithInterpolator.addUpdateListener(new LauncherAnimatorUpdateListener() { + public void onAnimationUpdate(float a, float b) { + mTransitionProgress = b; + if (b == 0f) { + // an optimization, but not required + return; } - }); - - ValueAnimator rotationAnim = - ValueAnimator.ofFloat(0f, 1f).setDuration(duration); - rotationAnim.setInterpolator(new DecelerateInterpolator(2.0f)); - rotationAnim.addUpdateListener(new LauncherAnimatorUpdateListener() { - public void onAnimationUpdate(float a, float b) { - if (!mUnshrinkAnimationEnabled) return; - // don't invalidate workspace because we did it above - if (b == 0f) { - // an optimization, but not required - return; - } - for (int i = 0; i < screenCount; i++) { - final CellLayout cl = (CellLayout) getChildAt(i); - cl.setFastRotationY(a * mOldRotationYs[i] + b * mNewRotationYs[i]); - } + invalidate(); + for (int i = 0; i < screenCount; i++) { + final CellLayout cl = (CellLayout) getChildAt(i); + cl.fastInvalidate(); + cl.setFastTranslationX(a * mOldTranslationXs[i] + b * mNewTranslationXs[i]); + cl.setFastTranslationY(a * mOldTranslationYs[i] + b * mNewTranslationYs[i]); + cl.setFastScaleX(a * mOldScaleXs[i] + b * mNewScaleXs[i]); + cl.setFastScaleY(a * mOldScaleYs[i] + b * mNewScaleYs[i]); + cl.setFastBackgroundAlpha( + a * mOldBackgroundAlphas[i] + b * mNewBackgroundAlphas[i]); + cl.setBackgroundAlphaMultiplier(a * mOldBackgroundAlphaMultipliers[i] + + b * mNewBackgroundAlphaMultipliers[i]); + cl.setFastAlpha(a * mOldAlphas[i] + b * mNewAlphas[i]); } - }); + } + }); - mAnimator.playTogether(animWithInterpolator, rotationAnim); - // 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 - mAnimator.addListener(mUnshrinkAnimationListener); - mAnimator.start(); - } else { - if (enableWallpaperEffects) { - setHorizontalWallpaperOffset(wallpaperOffsetForCurrentScroll()); - setVerticalWallpaperOffset(0.5f); - updateWallpaperOffsetImmediately(); + ValueAnimator rotationAnim = + ValueAnimator.ofFloat(0f, 1f).setDuration(duration); + rotationAnim.setInterpolator(new DecelerateInterpolator(2.0f)); + rotationAnim.addUpdateListener(new LauncherAnimatorUpdateListener() { + public void onAnimationUpdate(float a, float b) { + if (b == 0f) { + // an optimization, but not required + return; + } + for (int i = 0; i < screenCount; i++) { + final CellLayout cl = (CellLayout) getChildAt(i); + cl.setFastRotationY(a * mOldRotationYs[i] + b * mNewRotationYs[i]); + } } - } + }); + + mAnimator.playTogether(animWithInterpolator, rotationAnim); + // 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 + mAnimator.addListener(mChangeStateAnimationListener); + mAnimator.start(); } - if (springLoaded) { + if (state == State.SPRING_LOADED) { // Right now we're covered by Apps Customize // Show the background gradient immediately, so the gradient will // be showing once AppsCustomize disappears |