diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/launcher2/AllAppsView.java | 80 | ||||
-rw-r--r-- | src/com/android/launcher2/Launcher.java | 60 | ||||
-rw-r--r-- | src/com/android/launcher2/Workspace.java | 49 |
3 files changed, 132 insertions, 57 deletions
diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java index 722213d..a7a1e64 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) { + public void zoom(float zoom, boolean animate) { + cancelLongPress(); + if (mRollo == null || !mRollo.mHasSurface) { + mZoomDirty = true; + mNextZoom = zoom; + mNextAnimate = animate; return; + } else { + mRollo.setZoom(zoom, 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; + public boolean isVisible() { + if (mZoomDirty) { + return mNextZoom > 0.001f; } else { - mRollo.mState.zoomTarget = 0; + if (mRollo == null) { + return false; + } else { + return mRollo.mMessageProc.mZoom > 0.001f; + } } - mRollo.mState.save(); } - public boolean isVisible() { - if (mRollo == null) { - return false; + 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 6a0978b..ce3d5a7 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(true); + 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); - } - } 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 aa11e93..3b038cb 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<getChildCount(); i++) { @@ -790,6 +809,34 @@ public class Workspace extends ViewGroup implements DropTarget, DragSource, Drag return mTouchState != TOUCH_STATE_REST; } + /** + * If one of our descendant views decides that it could be focused now, only + * pass that along if it's on the current screen. + * + * This happens when live folders requery, and if they're off screen, they + * end up calling requestFocus, which pulls it on screen. + */ + @Override + public void focusableViewAvailable(View focused) { + View current = getChildAt(mCurrentScreen); + View v = focused; + while (true) { + if (v == current) { + super.focusableViewAvailable(focused); + return; + } + if (v == this) { + return; + } + ViewParent parent = v.getParent(); + if (parent instanceof View) { + v = (View)v.getParent(); + } else { + return; + } + } + } + void enableChildrenCache(int fromScreen, int toScreen) { if (fromScreen > toScreen) { fromScreen = toScreen; |