From 3a8820bdbad90642cf5cda4b00a8c92ecb699159 Mon Sep 17 00:00:00 2001 From: Joe Onorato Date: Tue, 10 Nov 2009 15:06:42 -0800 Subject: [PATCH] Fix bug 2250457 - Open folder on home screen changes changes the behaviour of the home button Now, home always goes to the center worksapce screen and back from an app goes to all apps if it was open. Getting that animations smooth took a little bit of work. --- res/raw/rollo3.c | 6 ++ src/com/android/launcher2/AllAppsView.java | 82 ++++++++++++++++------ src/com/android/launcher2/Launcher.java | 60 +++++++--------- src/com/android/launcher2/Workspace.java | 49 ++++++++++++- 4 files changed, 139 insertions(+), 58 deletions(-) diff --git a/res/raw/rollo3.c b/res/raw/rollo3.c index cbcdb22ea6..b2b6cf1974 100644 --- a/res/raw/rollo3.c +++ b/res/raw/rollo3.c @@ -126,6 +126,12 @@ void moveTo() { // debugF("======= moveTo", state->targetPos); } +void setZoom() { + g_Zoom = state->zoomTarget; + g_DrawLastFrame = 1; + updateReadback(); +} + void fling() { g_LastTouchDown = 0; g_PosVelocity = -state->flingVelocity * 4; diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java index 722213d424..a7a1e6421b 100644 --- a/src/com/android/launcher2/AllAppsView.java +++ b/src/com/android/launcher2/AllAppsView.java @@ -112,6 +112,9 @@ public class AllAppsView extends RSSurfaceView private boolean mShouldGainFocus; + private boolean mZoomDirty = false; + private float mNextZoom; + private boolean mNextAnimate; static class Defines { public static final int ALLOC_PARAMS = 0; @@ -185,7 +188,6 @@ public class AllAppsView extends RSSurfaceView super.surfaceChanged(holder, format, w, h); if (mRS == null) { - mRS = createRenderScript(true); mRollo = new RolloRS(); mRollo.mHasSurface = true; @@ -198,6 +200,7 @@ public class AllAppsView extends RSSurfaceView gainFocus(); mShouldGainFocus = false; } + mRollo.dirtyCheck(); } else { mRollo.mHasSurface = true; mRollo.dirtyCheck(); @@ -572,32 +575,44 @@ public class AllAppsView extends RSSurfaceView } /** - * Zoom to the specifed amount. + * Zoom to the specifed level. * - * @param amount [0..1] 0 is hidden, 1 is open + * @param zoom [0..1] 0 is hidden, 1 is open */ - public void zoom(float amount) { - if (mRollo == null) { - return; - } - + public void zoom(float zoom, boolean animate) { cancelLongPress(); - mRollo.clearSelectedIcon(); - mRollo.setHomeSelected(SELECTED_NONE); - if (amount > 0.001f) { - // set in readback, so we're correct even before the next frame - mRollo.mState.zoomTarget = amount; + if (mRollo == null || !mRollo.mHasSurface) { + mZoomDirty = true; + mNextZoom = zoom; + mNextAnimate = animate; + return; } else { - mRollo.mState.zoomTarget = 0; + mRollo.setZoom(zoom, animate); } - mRollo.mState.save(); } public boolean isVisible() { - if (mRollo == null) { - return false; + if (mZoomDirty) { + return mNextZoom > 0.001f; + } else { + if (mRollo == null) { + return false; + } else { + return mRollo.mMessageProc.mZoom > 0.001f; + } + } + } + + public boolean isOpaque() { + if (mZoomDirty) { + return mNextZoom > 0.999f; + } else { + if (mRollo == null) { + return false; + } else { + return mRollo.mMessageProc.mZoom > 0.999f; + } } - return mRollo.mMessageProc.mZoom > 0.001f; } /* @@ -729,7 +744,7 @@ public class AllAppsView extends RSSurfaceView private Script.Invokable mInvokeMoveTo; private Script.Invokable mInvokeFling; private Script.Invokable mInvokeResetWAR; - + private Script.Invokable mInvokeSetZoom; private ProgramStore mPSIcons; private ProgramStore mPSText; @@ -1003,6 +1018,7 @@ public class AllAppsView extends RSSurfaceView mInvokeFling = sb.addInvokable("fling"); mInvokeMoveTo = sb.addInvokable("moveTo"); mInvokeResetWAR = sb.addInvokable("resetHWWar"); + mInvokeSetZoom = sb.addInvokable("setZoom"); mScript = sb.create(); mScript.setClearColor(0.0f, 0.0f, 0.0f, 0.0f); mScript.bindAllocation(mParams.mAlloc, Defines.ALLOC_PARAMS); @@ -1022,10 +1038,16 @@ public class AllAppsView extends RSSurfaceView } void dirtyCheck() { - if (mAppsDirty && mHasSurface) { - uploadApps(mAllAppsList); - saveAppsList(); - mAppsDirty = false; + if (mHasSurface) { + if (mAppsDirty) { + uploadApps(mAllAppsList); + saveAppsList(); + mAppsDirty = false; + } + if (mZoomDirty) { + setZoom(mNextZoom, mNextAnimate); + mZoomDirty = false; + } } } @@ -1053,6 +1075,20 @@ public class AllAppsView extends RSSurfaceView saveAppsList(); } + private void setZoom(float zoom, boolean animate) { + mRollo.clearSelectedIcon(); + mRollo.setHomeSelected(SELECTED_NONE); + if (zoom > 0.001f) { + mRollo.mState.zoomTarget = zoom; + } else { + mRollo.mState.zoomTarget = 0; + } + mRollo.mState.save(); + if (!animate) { + mRollo.mInvokeSetZoom.execute(); + } + } + private void frameBitmapAllocMips(Allocation alloc, int w, int h) { int black[] = new int[w > h ? w : h]; Allocation.Adapter2D a = alloc.createAdapter2D(); diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index 6a0978b8cc..ce3d5a71a2 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -192,7 +192,6 @@ public final class Launcher extends Activity private boolean mRestoring; private boolean mWaitingForResult; - private boolean mExitingBecauseOfLaunch; private Bundle mSavedInstanceState; @@ -446,10 +445,6 @@ public final class Launcher extends Activity @Override protected void onPause() { super.onPause(); - if (mExitingBecauseOfLaunch) { - mExitingBecauseOfLaunch = false; - closeAllApps(false); - } dismissPreview(mPreviousView); dismissPreview(mNextView); } @@ -511,6 +506,11 @@ public final class Launcher extends Activity return; } + final boolean allApps = savedState.getBoolean(RUNTIME_STATE_ALL_APPS_FOLDER, false); + if (allApps) { + showAllApps(false); + } + final int currentScreen = savedState.getInt(RUNTIME_STATE_CURRENT_SCREEN, -1); if (currentScreen > -1) { mWorkspace.setCurrentScreen(currentScreen); @@ -856,23 +856,17 @@ public final class Launcher extends Activity // for example onResume being called when the user pressed the 'back' button. mIsNewIntent = true; - if ((intent.getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != - Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) { + if (!mWorkspace.isDefaultScreenShowing()) { + mWorkspace.moveToDefaultScreen(); + } - if (!mWorkspace.isDefaultScreenShowing()) { - mWorkspace.moveToDefaultScreen(); - } + closeAllApps(false); - closeAllApps(true); - - final View v = getWindow().peekDecorView(); - if (v != null && v.getWindowToken() != null) { - InputMethodManager imm = (InputMethodManager)getSystemService( - INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(v.getWindowToken(), 0); - } - } else { - closeAllApps(false); + final View v = getWindow().peekDecorView(); + if (v != null && v.getWindowToken() != null) { + InputMethodManager imm = (InputMethodManager)getSystemService( + INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } } @@ -902,10 +896,8 @@ public final class Launcher extends Activity final boolean isConfigurationChange = getChangingConfigurations() != 0; - // When the drawer is opened and we are saving the state because of a - // configuration change // TODO should not do this if the drawer is currently closing. - if (isAllAppsVisible() && isConfigurationChange) { + if (isAllAppsVisible()) { outState.putBoolean(RUNTIME_STATE_ALL_APPS_FOLDER, true); } @@ -1408,7 +1400,6 @@ public final class Launcher extends Activity // Open shortcut final Intent intent = ((ApplicationInfo) tag).intent; startActivitySafely(intent); - mExitingBecauseOfLaunch = true; } else if (tag instanceof FolderInfo) { handleFolderClick((FolderInfo) tag); } else if (v == mHandleView) { @@ -1416,7 +1407,7 @@ public final class Launcher extends Activity if (isAllAppsVisible()) { closeAllApps(true); } else { - showAllApps(); + showAllApps(true); } } } @@ -1819,10 +1810,16 @@ public final class Launcher extends Activity return mAllAppsGrid.isVisible(); } - void showAllApps() { - mAllAppsGrid.zoom(1.0f); + boolean isAllAppsOpaque() { + return mAllAppsGrid.isOpaque(); + } + + void showAllApps(boolean animated) { + mAllAppsGrid.zoom(1.0f, animated); //mWorkspace.hide(); + mWorkspace.startFading(false); + mAllAppsGrid.setFocusable(true); mAllAppsGrid.requestFocus(); @@ -1833,10 +1830,10 @@ public final class Launcher extends Activity void closeAllApps(boolean animated) { if (mAllAppsGrid.isVisible()) { - mAllAppsGrid.zoom(0.0f); + mAllAppsGrid.zoom(0.0f, animated); mAllAppsGrid.setFocusable(false); mWorkspace.getChildAt(mWorkspace.getCurrentScreen()).requestFocus(); - + mWorkspace.startFading(true); // TODO: fade these two too /* @@ -2138,11 +2135,6 @@ public final class Launcher extends Activity } } - final boolean allApps = mSavedState.getBoolean(RUNTIME_STATE_ALL_APPS_FOLDER, false); - if (allApps) { - showAllApps(); - } - mSavedState = null; } diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java index aa11e93aa3..3b038cb7ad 100644 --- a/src/com/android/launcher2/Workspace.java +++ b/src/com/android/launcher2/Workspace.java @@ -48,7 +48,7 @@ import java.util.ArrayList; * A workspace is meant to be used with a fixed width only. */ public class Workspace extends ViewGroup implements DropTarget, DragSource, DragScroller { - //private static final String TAG = "Launcher.Workspace"; + private static final String TAG = "Launcher.Workspace"; private static final int INVALID_SCREEN = -1; /** @@ -111,6 +111,8 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag private Drawable mPreviousIndicator; private Drawable mNextIndicator; + private boolean mFading = true; + /** * Used to inflate the Workspace from XML. * @@ -474,8 +476,25 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag } } + public void startFading(boolean dest) { + mFading = dest; + invalidate(); + } + @Override protected void dispatchDraw(Canvas canvas) { + final boolean allAppsOpaque = mLauncher.isAllAppsOpaque(); + if (mFading == allAppsOpaque) { + invalidate(); + } else { + mFading = !allAppsOpaque; + } + if (allAppsOpaque) { + // If the launcher is up, draw black. + canvas.drawARGB(0xff, 0, 0, 0); + return; + } + if (Launcher.lastStartTime != 0) { int itemCount = 0; for (int i=0; i toScreen) { fromScreen = toScreen;