diff options
author | Romain Guy <romainguy@android.com> | 2010-03-10 19:45:00 -0800 |
---|---|---|
committer | Romain Guy <romainguy@android.com> | 2010-03-10 19:45:00 -0800 |
commit | 13c2e7b788203f397085bef563bc5597e4c98028 (patch) | |
tree | ee6d0995dd498b604f0a9af44f5a266f661311e1 /src | |
parent | 63cc18042cacb5d03650bed079440a1ff2b09417 (diff) | |
download | packages_apps_trebuchet-13c2e7b788203f397085bef563bc5597e4c98028.zip packages_apps_trebuchet-13c2e7b788203f397085bef563bc5597e4c98028.tar.gz packages_apps_trebuchet-13c2e7b788203f397085bef563bc5597e4c98028.tar.bz2 |
Prevent ANR in Home when changing orientation.
Bug #2504556
This solves the issue by keeping the GL context, the RS context and
the RS scene around, across orientation changes.
Change-Id: I8e3dc6e6bf039087046d49d2826c8800c5bef582
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/launcher2/AllApps2D.java | 3 | ||||
-rw-r--r-- | src/com/android/launcher2/AllApps3D.java | 136 | ||||
-rw-r--r-- | src/com/android/launcher2/AllAppsView.java | 2 | ||||
-rw-r--r-- | src/com/android/launcher2/Launcher.java | 3 |
4 files changed, 101 insertions, 43 deletions
diff --git a/src/com/android/launcher2/AllApps2D.java b/src/com/android/launcher2/AllApps2D.java index 0bb4ee9..f02e8c6 100644 --- a/src/com/android/launcher2/AllApps2D.java +++ b/src/com/android/launcher2/AllApps2D.java @@ -300,6 +300,9 @@ public class AllApps2D public void dumpState() { ApplicationInfo.dumpApplicationInfoList(TAG, "mAllAppsList", mAllAppsList); } + + public void surrender() { + } } diff --git a/src/com/android/launcher2/AllApps3D.java b/src/com/android/launcher2/AllApps3D.java index c329b6c..e59fa6c 100644 --- a/src/com/android/launcher2/AllApps3D.java +++ b/src/com/android/launcher2/AllApps3D.java @@ -84,10 +84,11 @@ public class AllApps3D extends RSSurfaceView private int mMaxFlingVelocity; private Defines mDefines = new Defines(); - private RenderScriptGL mRS; - private RolloRS mRollo; private ArrayList<ApplicationInfo> mAllAppsList; + private static RenderScriptGL mRS; + private static RolloRS mRollo; + /** * True when we are using arrow keys or trackball to drive navigation */ @@ -125,7 +126,8 @@ public class AllApps3D extends RSSurfaceView private int mColumnsPerPage; private int mRowsPerPage; - + private boolean mSurrendered; + @SuppressWarnings({"UnusedDeclaration"}) static class Defines { public static final int ALLOC_PARAMS = 0; @@ -163,14 +165,24 @@ public class AllApps3D extends RSSurfaceView setZOrderOnTop(true); getHolder().setFormat(PixelFormat.TRANSLUCENT); - mRS = createRenderScript(true); - + if (mRS == null) { + mRS = createRenderScript(true); + } else { + createRenderScript(mRS); + } + final DisplayMetrics metrics = getResources().getDisplayMetrics(); final boolean isPortrait = metrics.widthPixels < metrics.heightPixels; mColumnsPerPage = isPortrait ? Defines.COLUMNS_PER_PAGE_PORTRAIT : Defines.COLUMNS_PER_PAGE_LANDSCAPE; mRowsPerPage = isPortrait ? Defines.ROWS_PER_PAGE_PORTRAIT : Defines.ROWS_PER_PAGE_LANDSCAPE; + + if (mRollo != null) { + mRollo.mAllApps = this; + mRollo.mRes = getResources(); + mRollo.mInitialize = true; + } } @SuppressWarnings({"UnusedDeclaration"}) @@ -178,14 +190,22 @@ public class AllApps3D extends RSSurfaceView this(context, attrs); } + public void surrender() { + mRS.contextSetSurface(0, 0, null); + mRS.mMessageCallback = null; + mSurrendered = true; + } + /** * Note that this implementation prohibits this view from ever being reattached. */ @Override protected void onDetachedFromWindow() { - destroyRenderScript(); mRS.mMessageCallback = null; - mRS = null; + if (!mSurrendered) { + destroyRenderScript(); + mRS = null; + } } /** @@ -207,7 +227,9 @@ public class AllApps3D extends RSSurfaceView public void surfaceDestroyed(SurfaceHolder holder) { super.surfaceDestroyed(holder); // Without this, we leak mMessageCallback which leaks the context. - mRS.mMessageCallback = null; + if (!mSurrendered) { + mRS.mMessageCallback = null; + } // We may lose any callbacks that are pending, so make sure that we re-sync that // on the next surfaceChanged. mZoomDirty = true; @@ -219,11 +241,13 @@ public class AllApps3D extends RSSurfaceView //long startTime = SystemClock.uptimeMillis(); super.surfaceChanged(holder, format, w, h); + + if (mSurrendered) return; mHaveSurface = true; if (mRollo == null) { - mRollo = new RolloRS(); + mRollo = new RolloRS(this); mRollo.init(getResources(), w, h); if (mAllAppsList != null) { mRollo.setApps(mAllAppsList); @@ -232,7 +256,12 @@ public class AllApps3D extends RSSurfaceView gainFocus(); mShouldGainFocus = false; } + } else if (mRollo.mInitialize) { + mRollo.initGl(); + mRollo.initTouchState(w, h); + mRollo.mInitialize = false; } + mRollo.dirtyCheck(); mRollo.resize(w, h); @@ -263,6 +292,9 @@ public class AllApps3D extends RSSurfaceView @Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus); + + if (mSurrendered) return; + if (mArrowNavigation) { if (!hasWindowFocus) { // Clear selection when we lose window focus @@ -300,7 +332,7 @@ public class AllApps3D extends RSSurfaceView protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); - if (!isVisible()) { + if (!isVisible() || mSurrendered) { return; } @@ -705,9 +737,24 @@ public class AllApps3D extends RSSurfaceView // We've been removed from the window. Don't bother with all this. return; } - + + boolean reload = false; + if (mAllAppsList == null) { + reload = true; + } else if (list.size() != mAllAppsList.size()) { + reload = true; + } else { + final int count = list.size(); + for (int i = 0; i < count; i++) { + if (list.get(i) != mAllAppsList.get(i)) { + reload = true; + break; + } + } + } + mAllAppsList = list; - if (mRollo != null) { + if (mRollo != null && reload) { mRollo.setApps(list); } mLocks &= ~LOCK_ICONS_PENDING; @@ -810,8 +857,7 @@ public class AllApps3D extends RSSurfaceView } } - public class RolloRS { - + public static class RolloRS { // Allocations ====== private int mWidth; private int mHeight; @@ -856,7 +902,10 @@ public class AllApps3D extends RSSurfaceView Params mParams; State mState; - + + AllApps3D mAllApps; + boolean mInitialize; + class BaseAlloc { Allocation mAlloc; Type mType; @@ -867,8 +916,8 @@ public class AllApps3D extends RSSurfaceView } private boolean checkClickOK() { - return (Math.abs(mVelocity) < 0.4f) && - (Math.abs(mPosX - Math.round(mPosX)) < 0.4f); + return (Math.abs(mAllApps.mVelocity) < 0.4f) && + (Math.abs(mAllApps.mPosX - Math.round(mAllApps.mPosX)) < 0.4f); } class Params extends BaseAlloc { @@ -906,7 +955,8 @@ public class AllApps3D extends RSSurfaceView } } - public RolloRS() { + public RolloRS(AllApps3D allApps) { + mAllApps = allApps; } public void init(Resources res, int width, int height) { @@ -918,7 +968,7 @@ public class AllApps3D extends RSSurfaceView initProgramStore(); initGl(); initData(); - initTouchState(); + initTouchState(width, height); initRs(); } @@ -1075,15 +1125,15 @@ public class AllApps3D extends RSSurfaceView } private void initGl() { - mTouchXBorders = new int[mColumnsPerPage +1]; - mTouchYBorders = new int[mRowsPerPage +1]; + mTouchXBorders = new int[mAllApps.mColumnsPerPage + 1]; + mTouchYBorders = new int[mAllApps.mRowsPerPage + 1]; } private void initData() { mParams = new Params(); mState = new State(); - final Utilities.BubbleText bubble = new Utilities.BubbleText(getContext()); + final Utilities.BubbleText bubble = new Utilities.BubbleText(mAllApps.getContext()); mParams.bubbleWidth = bubble.getBubbleWidth(); mParams.bubbleHeight = bubble.getMaxBubbleHeight(); @@ -1120,7 +1170,7 @@ public class AllApps3D extends RSSurfaceView ScriptC.Builder sb = new ScriptC.Builder(mRS); sb.setScript(mRes, R.raw.allapps); sb.setRoot(true); - sb.addDefines(mDefines); + sb.addDefines(mAllApps.mDefines); sb.setType(mParams.mType, "params", Defines.ALLOC_PARAMS); sb.setType(mState.mType, "state", Defines.ALLOC_STATE); sb.setType(mUniformAlloc.getType(), "vpConstants", Defines.ALLOC_VP_CONSTANTS); @@ -1141,8 +1191,8 @@ public class AllApps3D extends RSSurfaceView } void dirtyCheck() { - if (mZoomDirty) { - setZoom(mNextZoom, mAnimateNextZoom); + if (mAllApps.mZoomDirty) { + setZoom(mAllApps.mNextZoom, mAllApps.mAnimateNextZoom); } } @@ -1296,24 +1346,25 @@ public class AllApps3D extends RSSurfaceView } } - void initTouchState() { - boolean isPortrait = getWidth() < getHeight(); + void initTouchState(int width, int height) { + boolean isPortrait = width < height; + // TODO: Put this in a config file/define int cellHeight = 145;//iconsSize / Defines.ROWS_PER_PAGE_PORTRAIT; if (!isPortrait) cellHeight -= 12; - int centerY = (int) (getHeight() * (isPortrait ? 0.5f : 0.47f)); + int centerY = (int) (mAllApps.getHeight() * (isPortrait ? 0.5f : 0.47f)); if (!isPortrait) centerY += cellHeight / 2; - int half = (int) Math.floor((mRowsPerPage + 1) / 2); + int half = (int) Math.floor((mAllApps.mRowsPerPage + 1) / 2); int end = mTouchYBorders.length - (half + 1); for (int i = -half; i <= end; i++) { mTouchYBorders[i + half] = centerY + i * cellHeight; } - + int x = 0; // TODO: Put this in a config file/define int columnWidth = 120; - for (int i = 0; i < mColumnsPerPage + 1; i++) { + for (int i = 0; i < mAllApps.mColumnsPerPage + 1; i++) { mTouchXBorders[i] = x; x += columnWidth; } @@ -1339,14 +1390,14 @@ public class AllApps3D extends RSSurfaceView int col = -1; int row = -1; - final int columnsCount = mColumnsPerPage; + final int columnsCount = mAllApps.mColumnsPerPage; for (int i=0; i< columnsCount; i++) { if (x >= mTouchXBorders[i] && x < mTouchXBorders[i+1]) { col = i; break; } } - final int rowsCount = mRowsPerPage; + final int rowsCount = mAllApps.mRowsPerPage; for (int i=0; i< rowsCount; i++) { if (y >= mTouchYBorders[i] && y < mTouchYBorders[i+1]) { row = i; @@ -1385,20 +1436,21 @@ public class AllApps3D extends RSSurfaceView * @param pressed one of SELECTED_PRESSED or SELECTED_FOCUSED */ void selectIcon(int index, int pressed) { - if (mAllAppsList == null || index < 0 || index >= mAllAppsList.size()) { + final ArrayList<ApplicationInfo> appsList = mAllApps.mAllAppsList; + if (appsList == null || index < 0 || index >= appsList.size()) { mState.selectedIconIndex = -1; - if (mLastSelection == SELECTION_ICONS) { - mLastSelection = SELECTION_NONE; + if (mAllApps.mLastSelection == SELECTION_ICONS) { + mAllApps.mLastSelection = SELECTION_NONE; } } else { if (pressed == SELECTED_FOCUSED) { - mLastSelection = SELECTION_ICONS; + mAllApps.mLastSelection = SELECTION_ICONS; } int prev = mState.selectedIconIndex; mState.selectedIconIndex = index; - ApplicationInfo info = mAllAppsList.get(index); + ApplicationInfo info = appsList.get(index); Bitmap selectionBitmap = mSelectionBitmap; Utilities.drawSelectedAllAppsBitmap(mSelectionCanvas, @@ -1413,7 +1465,7 @@ public class AllApps3D extends RSSurfaceView if (prev != index) { if (info.title != null && info.title.length() > 0) { //setContentDescription(info.title); - sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); + mAllApps.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); } } } @@ -1427,16 +1479,16 @@ public class AllApps3D extends RSSurfaceView } void setHomeSelected(int mode) { - final int prev = mLastSelection; + final int prev = mAllApps.mLastSelection; switch (mode) { case SELECTED_NONE: mState.homeButtonId = mHomeButtonNormal.getID(); break; case SELECTED_FOCUSED: - mLastSelection = SELECTION_HOME; + mAllApps.mLastSelection = SELECTION_HOME; mState.homeButtonId = mHomeButtonFocused.getID(); if (prev != SELECTION_HOME) { - sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); + mAllApps.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); } break; case SELECTED_PRESSED: diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java index a936f8b..ed39a32 100644 --- a/src/com/android/launcher2/AllAppsView.java +++ b/src/com/android/launcher2/AllAppsView.java @@ -42,4 +42,6 @@ public interface AllAppsView { public void updateApps(ArrayList<ApplicationInfo> list); public void dumpState(); + + public void surrender(); } diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index df2dd66..f7cb749 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -424,11 +424,12 @@ public final class Launcher extends Activity public Object onRetainNonConfigurationInstance() { // Flag the loader to stop early before switching mModel.stopLoader(); + mAllAppsGrid.surrender(); if (PROFILE_ROTATE) { android.os.Debug.startMethodTracing("/sdcard/launcher-rotate"); } - return null; + return Boolean.TRUE; } // We can't hide the IME if it was forced open. So don't bother |