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;