diff options
author | Dianne Hackborn <hackbod@google.com> | 2012-05-15 13:57:06 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-05-15 13:57:06 -0700 |
commit | bea7afc52cc85e35b7fc200912246c62d3791198 (patch) | |
tree | 6b3b08efa7bf51ff53c4614398c4819531f6c6cf | |
parent | 0a283346aae1801e5b773673729d97336ce42c43 (diff) | |
parent | 03fcc333cf0fbbc4df1215649746d6360801efd8 (diff) | |
download | frameworks_base-bea7afc52cc85e35b7fc200912246c62d3791198.zip frameworks_base-bea7afc52cc85e35b7fc200912246c62d3791198.tar.gz frameworks_base-bea7afc52cc85e35b7fc200912246c62d3791198.tar.bz2 |
Merge "Fix issue #6284404: ArrayIndexOutOfBoundsException in..." into jb-dev
-rw-r--r-- | core/java/android/app/ActivityThread.java | 11 | ||||
-rw-r--r-- | core/java/android/app/Fragment.java | 5 | ||||
-rw-r--r-- | core/java/android/app/FragmentManager.java | 4 | ||||
-rwxr-xr-x | services/java/com/android/server/am/ActivityStack.java | 6 |
4 files changed, 21 insertions, 5 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 5085b1e..b29035d 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -2090,8 +2090,15 @@ public final class ActivityThread { r.activity.mCalled = false; mInstrumentation.callActivityOnPause(r.activity); // We need to keep around the original state, in case - // we need to be created again. - r.state = oldState; + // we need to be created again. But we only do this + // for pre-Honeycomb apps, which always save their state + // when pausing, so we can not have them save their state + // when restarting from a paused state. For HC and later, + // we want to (and can) let the state be saved as the normal + // part of stopping the activity. + if (r.isPreHoneycomb()) { + r.state = oldState; + } if (!r.activity.mCalled) { throw new SuperNotCalledException( "Activity " + r.intent.getComponent().toShortString() + diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index d3ba497..5e6b090 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -28,6 +28,7 @@ import android.os.Parcelable; import android.util.AndroidRuntimeException; import android.util.AttributeSet; import android.util.DebugUtils; +import android.util.Log; import android.util.SparseArray; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; @@ -108,7 +109,9 @@ final class FragmentState implements Parcelable { mInstance.mRetainInstance = mRetainInstance; mInstance.mDetached = mDetached; mInstance.mFragmentManager = activity.mFragments; - + if (FragmentManagerImpl.DEBUG) Log.v(FragmentManagerImpl.TAG, + "Instantiated fragment " + mInstance); + return mInstance; } diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index 7e1daa4..6058bdc 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -1074,6 +1074,7 @@ final class FragmentManagerImpl extends FragmentManager { f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1)); mActive.set(f.mIndex, f); } + if (DEBUG) Log.v(TAG, "Allocated fragment index " + f); } void makeInactive(Fragment f) { @@ -1081,7 +1082,7 @@ final class FragmentManagerImpl extends FragmentManager { return; } - if (DEBUG) Log.v(TAG, "Freeing fragment index " + f.mIndex); + if (DEBUG) Log.v(TAG, "Freeing fragment index " + f); mActive.set(f.mIndex, null); if (mAvailIndices == null) { mAvailIndices = new ArrayList<Integer>(); @@ -1493,6 +1494,7 @@ final class FragmentManagerImpl extends FragmentManager { fragments.add(f); f.mRetaining = true; f.mTargetIndex = f.mTarget != null ? f.mTarget.mIndex : -1; + if (DEBUG) Log.v(TAG, "retainNonConfig: keeping retained " + f); } } } diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index 78ddb51..e6f4d918 100755 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -2619,6 +2619,7 @@ final class ActivityStack { } boolean addingToTask = false; + boolean movedHome = false; TaskRecord reuseTask = null; if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0) @@ -2657,6 +2658,7 @@ final class ActivityStack { if (callerAtFront) { // We really do want to push this one into the // user's face, right now. + movedHome = true; moveHomeToFrontFromLaunchLocked(launchFlags); moveTaskToFrontLocked(taskTop.task, r, options); } @@ -2835,7 +2837,9 @@ final class ActivityStack { r.setTask(reuseTask, reuseTask, true); } newTask = true; - moveHomeToFrontFromLaunchLocked(launchFlags); + if (!movedHome) { + moveHomeToFrontFromLaunchLocked(launchFlags); + } } else if (sourceRecord != null) { if (!addingToTask && |