From fb0ca67aea25f4282096d9247ddaebee6fbf7e00 Mon Sep 17 00:00:00 2001 From: Joe Onorato Date: Mon, 14 Sep 2009 17:55:46 -0400 Subject: [PATCH] checkpoint 3d all apps entrance / exit animations --- res/drawable-land/trash.png | Bin 0 -> 1623 bytes res/raw/rollo.c | 14 +- .../android/launcher2/AllAppsGridView.java | 4 +- src/com/android/launcher2/AllAppsView.java | 203 ++++++++---------- src/com/android/launcher2/HandleView.java | 2 +- src/com/android/launcher2/Launcher.java | 67 +++--- .../android/launcher2/SwipeController.java | 36 ++++ src/com/android/launcher2/Workspace.java | 8 +- 8 files changed, 184 insertions(+), 150 deletions(-) create mode 100644 res/drawable-land/trash.png diff --git a/res/drawable-land/trash.png b/res/drawable-land/trash.png new file mode 100644 index 0000000000000000000000000000000000000000..dccf89151bbff75d2c644bdc751f98d6b425cc78 GIT binary patch literal 1623 zcmV-d2B`UoP)5 zVt4t{?)KMzohl!DjI}m^pnVnMD}VqD1YjTl0|6Kaz(5dyfdC8yU?2bk0T>9tKoEd| z+ECobgMRSzqW53?FHi2nVIVk+uQK8XV-DEPssdmJ0E&YoqR$?QQta5y0g{&`qbU~) zVEl!}ecnk~#x&2+?CUa_fF>==jHU&E@eh_!S&pcT=`}mezQ9OWmbATtWTII zP8kVUj;V}=!|WUME(K&pEFTXczKK19Wm}xWAWfCiBy{rao(?moeM%)miEm<$U`Yso zlPz&dqF|Ydb@tIhtZVm(Z`hgUzBEsHD>f$+~y?w{q>1}7yDyX>W0_tOubUOX3$Hfe}&Lg6eN z&x~k(0bsiE8DfHBqFiQMoKn4Zx0Z)DhHh?pO-0-KKJ>A07#ZIfa+H+Hh{_>jJpks8 z9VSvep+q>&u>fbJnuKawD?*phG!s+UT709Og$*bau&}EnLH&A_>3i_&12A%|MS?Su zj^pB#t1Pd@DM=WbygYqTxfeHG6h)pEh1KiC#)Q1i_mA#w!{+SwGq1%T;Zlhjo5^S`eCF~(Fu>POEm zURHx9W!y?7pkl?esnnLaeU$t9vD$07@2`IS}-VH;uB$t^rxD9~mU{8sE z)w7_UMaQGCN6l@Fp`F-+>r{_u)==gGoE*S(N4Wq+!oo>ab;9hr87gCt@5)JX{`mA0 zUcOIV!{dz$0qh$EP3p@yj4!}g)f90`=GGunUIcLSE(qRLx1%|eZpX091CKK9e7aSZ zf8qIE#tVBsIGwxuY2exIC%)ZVZChXQ?T^O-7*A#2qHZVxFf9NCU_3wXwqe$;hJ>)d`63hoy$>FjYVN8jjn)@JQO!+sw@99FF!whC>d~dKRvqlP_M7+%}OuNj;*8b79QdZB~@Xx*(|M*l}=dw!>lIF#U>8nsRCRb#AUL!`}9+ zlHc&X)BGMq!~5a+Fg<`pr$shp-+j}LqPXzbqFc5%&01O0RAPB%f00sgu5P*RI3 mScrollHandleTop) { - mTouchHandler = mScrollHandler; + int x = (int)ev.getX(); + int deltaX; + switch (ev.getAction()) { + case MotionEvent.ACTION_DOWN: + mMotionDownRawX = (int)ev.getRawX(); + mMotionDownRawY = (int)ev.getRawY(); + mLastMotionX = x; + mRollo.mState.read(); + mRollo.mState.startScrollX = mRollo.mState.scrollX = mLastScrollX + = mRollo.mState.currentScrollX; + if (mRollo.mState.flingVelocityX != 0) { + mRollo.clearSelectedIcon(); } else { - mTouchHandler = mFlingHandler; + mRollo.selectIcon(x, (int)ev.getY(), mRollo.mState.startScrollX, + (-mRollo.mState.startScrollX / Defines.SCREEN_WIDTH_PX)); } + mRollo.mState.flingVelocityX = 0; + mRollo.mState.adjustedDeceleration = 0; + mRollo.mState.save(); + mVelocity = VelocityTracker.obtain(); + mVelocity.addMovement(ev); + mStartedScrolling = false; + break; + case MotionEvent.ACTION_MOVE: + case MotionEvent.ACTION_OUTSIDE: + int slop = Math.abs(x - mLastMotionX); + if (!mStartedScrolling && slop < mConfig.getScaledTouchSlop()) { + // don't update mLastMotionX so slop is right and when we do start scrolling + // below, we get the right delta. + } else { + mStartedScrolling = true; + mRollo.clearSelectedIcon(); + deltaX = x - mLastMotionX; + mVelocity.addMovement(ev); + mRollo.mState.currentScrollX = mLastScrollX; + mLastScrollX += deltaX; + mRollo.mState.scrollX = mLastScrollX; + mRollo.mState.save(); + mLastMotionX = x; + } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + mVelocity.computeCurrentVelocity(1000 /* px/sec */, + mConfig.getScaledMaximumFlingVelocity()); + mRollo.mState.flingTimeMs = (int)SystemClock.uptimeMillis(); // TODO: use long + mRollo.mState.flingVelocityX = (int)mVelocity.getXVelocity(); + mRollo.clearSelectedIcon(); + mRollo.mState.save(); + mLastMotionX = -10000; + mVelocity.recycle(); + mVelocity = null; + break; } - */ - mTouchHandler.onTouchEvent(ev); return true; } - private abstract class TouchHandler { - abstract boolean onTouchEvent(MotionEvent ev); - }; - - private TouchHandler mFlingHandler = new TouchHandler() { - @Override - public boolean onTouchEvent(MotionEvent ev) - { - int x = (int)ev.getX(); - int deltaX; - switch (ev.getAction()) { - case MotionEvent.ACTION_DOWN: - mMotionDownRawX = (int)ev.getRawX(); - mMotionDownRawY = (int)ev.getRawY(); - mLastMotionX = x; - mRollo.mState.read(); - mRollo.mState.startScrollX = mRollo.mState.scrollX = mLastScrollX - = mRollo.mState.currentScrollX; - if (mRollo.mState.flingVelocityX != 0) { - mRollo.clearSelectedIcon(); - } else { - mRollo.selectIcon(x, (int)ev.getY(), mRollo.mState.startScrollX, - (-mRollo.mState.startScrollX / Defines.SCREEN_WIDTH_PX)); - } - mRollo.mState.flingVelocityX = 0; - mRollo.mState.adjustedDeceleration = 0; - mRollo.mState.save(); - mVelocity = VelocityTracker.obtain(); - mVelocity.addMovement(ev); - mStartedScrolling = false; - break; - case MotionEvent.ACTION_MOVE: - case MotionEvent.ACTION_OUTSIDE: - int slop = Math.abs(x - mLastMotionX); - if (!mStartedScrolling && slop < mConfig.getScaledTouchSlop()) { - // don't update mLastMotionX so slop is right and when we do start scrolling - // below, we get the right delta. - } else { - mStartedScrolling = true; - mRollo.clearSelectedIcon(); - deltaX = x - mLastMotionX; - mVelocity.addMovement(ev); - mRollo.mState.currentScrollX = mLastScrollX; - mLastScrollX += deltaX; - mRollo.mState.scrollX = mLastScrollX; - mRollo.mState.save(); - mLastMotionX = x; - } - break; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - mVelocity.computeCurrentVelocity(1000 /* px/sec */, - mConfig.getScaledMaximumFlingVelocity()); - mRollo.mState.flingTimeMs = (int)SystemClock.uptimeMillis(); // TODO: use long - mRollo.mState.flingVelocityX = (int)mVelocity.getXVelocity(); - mRollo.clearSelectedIcon(); - mRollo.mState.save(); - mLastMotionX = -10000; - mVelocity.recycle(); - mVelocity = null; - break; - } - return true; - } - }; - public void onClick(View v) { + if (mLocks != 0) { + return; + } int index = mRollo.mState.selectedIconIndex; if (mRollo.mState.flingVelocityX == 0 && index >= 0 && index < mAllAppsList.size()) { ApplicationInfo app = mAllAppsList.get(index); @@ -265,6 +252,9 @@ public class AllAppsView extends RSSurfaceView } public boolean onLongClick(View v) { + if (mLocks != 0) { + return true; + } int index = mRollo.mState.selectedIconIndex; Log.d(TAG, "long click! velocity=" + mRollo.mState.flingVelocityX + " index=" + index); if (mRollo.mState.flingVelocityX == 0 && index >= 0 && index < mAllAppsList.size()) { @@ -280,7 +270,7 @@ public class AllAppsView extends RSSurfaceView left, top, Defines.ICON_WIDTH_PX, Defines.ICON_HEIGHT_PX, this, app, DragController.DRAG_ACTION_COPY); - mLauncher.closeAllAppsDialog(true); + mLauncher.closeAllApps(true); } return true; } @@ -294,15 +284,10 @@ public class AllAppsView extends RSSurfaceView private static final int SCALE_SCALE = 100000; - public void show() { - mRollo.mState.read(); - mRollo.mState.visible = 1; - mRollo.mState.zoom = SCALE_SCALE; - mRollo.mState.save(); - } - public void setScale(float amount) { + cancelLongPress(); mRollo.mState.read(); + mRollo.clearSelectedIcon(); if (amount > 0.001f) { mRollo.mState.visible = 1; mRollo.mState.zoom = (int)(SCALE_SCALE*amount); @@ -310,37 +295,21 @@ public class AllAppsView extends RSSurfaceView mRollo.mState.visible = 0; mRollo.mState.zoom = 0; } - mRollo.mState.save(); - } - - public void hide() { - mRollo.mState.read(); - mRollo.mState.visible = 0; - mRollo.mState.zoom = 0; - mRollo.mState.save(); - } - - /* - private TouchHandler mScrollHandler = new TouchHandler() { - @Override - public boolean onTouchEvent(MotionEvent ev) - { - int x = (int)ev.getX(); - int w = getWidth(); - - float percent = x / (float)w; - - mRollo.mState.read(); - - mRollo.mState.scrollX = mLastScrollX = -(int)(mPageCount * w * percent); - mRollo.mState.flingVelocityX = 0; - mRollo.mState.adjustedDeceleration = 0; - mRollo.mState.save(); - - return true; + if (amount > 0.001f && amount < 0.999f) { + mLocks |= LOCK_ZOOMING; + } else { + mLocks &= ~LOCK_ZOOMING; } - }; - */ + mRollo.mState.save(); + } + + public boolean isZooming() { + return (mLocks & LOCK_ZOOMING) != 0; + } + + public boolean isVisible() { + return mRollo != null && mRollo.mState.visible != 0; + } @Override public boolean onTrackballEvent(MotionEvent ev) @@ -362,7 +331,7 @@ public class AllAppsView extends RSSurfaceView } mPageCount = countPages(list.size()); Log.d(TAG, "setApps mRollo=" + mRollo + " list=" + list); - mLocked = false; + mLocks &= ~LOCK_ICONS_PENDING; } private void invokeIcon(int index) { diff --git a/src/com/android/launcher2/HandleView.java b/src/com/android/launcher2/HandleView.java index 98b3a37de9..7d2269a8d2 100644 --- a/src/com/android/launcher2/HandleView.java +++ b/src/com/android/launcher2/HandleView.java @@ -49,7 +49,7 @@ public class HandleView extends ImageView { @Override public View focusSearch(int direction) { View newFocus = super.focusSearch(direction); - if (newFocus == null && mLauncher.isDrawerDown()) { + if (newFocus == null && mLauncher.isAllAppsVisible()) { final Workspace workspace = mLauncher.getWorkspace(); workspace.dispatchUnhandledMove(null, direction); return (mOrientation == ORIENTATION_HORIZONTAL && direction == FOCUS_DOWN) ? diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index ec3622c61f..7be2a1bcc7 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -177,7 +177,6 @@ public final class Launcher extends Activity private DeleteZone mDeleteZone; private HandleView mHandleView; private AllAppsView mAllAppsGrid; - private boolean mAllAppsVisible; // if it's visible at all private int mMode = MODE_WORKSPACE; private Bundle mSavedState; @@ -424,7 +423,7 @@ public final class Launcher extends Activity @Override protected void onPause() { super.onPause(); - closeAllAppsDialog(false); + closeAllApps(false); } @Override @@ -812,7 +811,7 @@ public final class Launcher extends Activity mWorkspace.moveToDefaultScreen(); } - closeAllAppsDialog(true); + closeAllApps(true); final View v = getWindow().peekDecorView(); if (v != null && v.getWindowToken() != null) { @@ -821,7 +820,7 @@ public final class Launcher extends Activity imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } else { - closeAllAppsDialog(false); + closeAllApps(false); } } } @@ -853,7 +852,8 @@ public final class Launcher extends Activity // When the drawer is opened and we are saving the state because of a // configuration change - if (mAllAppsVisible && isConfigurationChange) { + // TODO should not do this if the drawer is currently closing. + if (isAllAppsVisible() && isConfigurationChange) { outState.putBoolean(RUNTIME_STATE_ALL_APPS_FOLDER, true); } @@ -906,7 +906,7 @@ public final class Launcher extends Activity public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData, boolean globalSearch) { - closeAllAppsDialog(false); + closeAllApps(false); // Slide the search widget to the top, if it's on the current screen, // otherwise show the search dialog immediately. @@ -1282,8 +1282,8 @@ public final class Launcher extends Activity case KeyEvent.KEYCODE_BACK: if (!event.isCanceled()) { mWorkspace.dispatchKeyEvent(event); - if (mAllAppsVisible) { - closeAllAppsDialog(true); + if (isAllAppsVisible()) { + closeAllApps(true); } else { closeFolder(); } @@ -1341,10 +1341,11 @@ public final class Launcher extends Activity } else if (tag instanceof FolderInfo) { handleFolderClick((FolderInfo) tag); } else if (v == mHandleView) { - if (mAllAppsVisible) { - // TODO how can we be here? + Log.d(TAG, "onClick"); + if (isAllAppsVisible()) { + closeAllApps(true); } else { - showAllAppsDialog(); + showAllApps(true); } } } @@ -1453,10 +1454,6 @@ public final class Launcher extends Activity return mHandleView; } - boolean isDrawerDown() { // TODO rename to isAllAppsVisible() - return /* TODO !mDrawer.isMoving() && */ !mAllAppsVisible; - } - Workspace getWorkspace() { return mWorkspace; } @@ -1605,26 +1602,44 @@ public final class Launcher extends Activity } } - void showAllAppsDialog() { - mAllAppsVisible = true; - mAllAppsGrid.show(); + boolean isAllAppsVisible() { + return mAllAppsGrid.isZooming() || mAllAppsGrid.isVisible(); + } + + void showAllApps(boolean animated) { + if (mMode == MODE_ALL_APPS) { + return; + } + + mSwipeController.setRange(-1, 0); + if (animated) { + mSwipeController.animate(-1); + } else { + mSwipeController.setImmediate(-1); + } + mWorkspace.hide(); // TODO: fade these two too mDeleteZone.setVisibility(View.GONE); - mHandleView.setVisibility(View.GONE); + //mHandleView.setVisibility(View.GONE); } - void closeAllAppsDialog(boolean animated) { - if (mAllAppsVisible) { - mAllAppsGrid.hide(); - mAllAppsVisible = false; + void closeAllApps(boolean animated) { + if (mAllAppsGrid.isVisible()) { + mSwipeController.setRange(0, 1); + if (animated) { + mSwipeController.animate(1); + } else { + mSwipeController.setImmediate(1); + } mWorkspace.getChildAt(mWorkspace.getCurrentScreen()).requestFocus(); - mWorkspace.show(); // TODO: fade these two too + /* mDeleteZone.setVisibility(View.VISIBLE); mHandleView.setVisibility(View.VISIBLE); + */ } } @@ -1777,6 +1792,7 @@ public final class Launcher extends Activity switch (mMode) { case MODE_WORKSPACE: if (amount == -1) { + setWorkspaceAndAllAppsScale(-amount); mWorkspace.clearChildrenCache(); mMode = MODE_ALL_APPS; mSwipeController.setRange(0, 1); @@ -1784,6 +1800,7 @@ public final class Launcher extends Activity break; case MODE_ALL_APPS: if (amount == 1) { + setWorkspaceAndAllAppsScale(1-amount); mWorkspace.clearChildrenCache(); mMode = MODE_WORKSPACE; mSwipeController.setRange(-1, 0); @@ -1983,7 +2000,7 @@ public final class Launcher extends Activity final boolean allApps = mSavedState.getBoolean(RUNTIME_STATE_ALL_APPS_FOLDER, false); if (allApps) { - showAllAppsDialog(); + showAllApps(false); } mSavedState = null; diff --git a/src/com/android/launcher2/SwipeController.java b/src/com/android/launcher2/SwipeController.java index 7443b3bbc2..41a02f0ed8 100644 --- a/src/com/android/launcher2/SwipeController.java +++ b/src/com/android/launcher2/SwipeController.java @@ -143,6 +143,41 @@ public class SwipeController { return mTracking || mCanceled; } + /** + * Set the value, performing an animation. Make sure that you have set the + * range properly first, otherwise the value may be clamped. + */ + public void animate(float dest) { + go(dest, 0); + } + + /** + * Set the value, but don't perform an animation. Make sure that you have set the + * range properly first, otherwise the value may be clamped. + */ + public void setImmediate(float dest) { + go(dest, dest); + } + + /** + * Externally start a swipe. If dest == amount, this will end up just immediately + * setting the value, but it will perform the proper start and finish callbacks. + */ + private void go(float dest, float amount) { + mListener.onStartSwipe(); + + dest = clamp(dest); + mDirection = dest > amount ? 1 : -1; // if they're equal it doesn't matter + mVelocity = mDirection * 0.002f; // TODO: density. + mAmount = amount; + mDest = dest; + + mFlingTime = SystemClock.uptimeMillis(); + mLastTime = 0; + + scheduleAnim(); + } + private float clamp(float v) { if (v < mMinDest) { return mMinDest; @@ -165,6 +200,7 @@ public class SwipeController { mVelocityTracker.computeCurrentVelocity(1); mVelocity = mVelocityTracker.getYVelocity() / mSwipeDistance; + Log.d(TAG, "mVelocity=" + mVelocity); mDirection = mVelocity >= 0.0f ? 1 : -1; mAmount = clamp((screenY-mDownY)/mSwipeDistance); if (mAmount < 0) { diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java index 01985e94b7..2fe41133cb 100644 --- a/src/com/android/launcher2/Workspace.java +++ b/src/com/android/launcher2/Workspace.java @@ -600,7 +600,7 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag @Override protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) { - if (mLauncher.isDrawerDown()) { + if (mLauncher.isAllAppsVisible()) { final Folder openFolder = getOpenFolder(); if (openFolder != null) { return openFolder.requestFocus(direction, previouslyFocusedRect); @@ -635,7 +635,7 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag @Override public void addFocusables(ArrayList views, int direction, int focusableMode) { - if (mLauncher.isDrawerDown()) { + if (mLauncher.isAllAppsVisible()) { final Folder openFolder = getOpenFolder(); if (openFolder == null) { getChildAt(mCurrentScreen).addFocusables(views, direction); @@ -656,7 +656,7 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag @Override public boolean onInterceptTouchEvent(MotionEvent ev) { - if (mLauncher.isWorkspaceLocked() || !mLauncher.isDrawerDown()) { + if (mLauncher.isWorkspaceLocked() || !mLauncher.isAllAppsVisible()) { return false; // We don't want the events. Let them fall through to the all apps view. } @@ -766,7 +766,7 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag @Override public boolean onTouchEvent(MotionEvent ev) { - if (mLauncher.isWorkspaceLocked() || !mLauncher.isDrawerDown()) { + if (mLauncher.isWorkspaceLocked() || !mLauncher.isAllAppsVisible()) { return false; // We don't want the events. Let them fall through to the all apps view. }