diff options
| author | Dianne Hackborn <hackbod@google.com> | 2013-09-21 01:21:26 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-09-21 01:21:26 +0000 |
| commit | 90d51b1abe64442927c7e6bdbafc99f41a55f393 (patch) | |
| tree | 618c2edae0b6a95cbd5cfdb564a9df16fce6fb7a /core/java/android | |
| parent | b39ce63d2807c9d5c68d3be052dee7e9da7ec3be (diff) | |
| parent | e784d1e4cfeaf3a9accd7caa33c087abd8f39040 (diff) | |
Merge "Fix issue #10807048: Groupon: The application crash when user rotates..." into klp-dev
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/os/Bundle.java | 34 | ||||
| -rw-r--r-- | core/java/android/os/Parcel.java | 32 |
2 files changed, 56 insertions, 10 deletions
diff --git a/core/java/android/os/Bundle.java b/core/java/android/os/Bundle.java index 32b1b60437ea..f47ac4e49750 100644 --- a/core/java/android/os/Bundle.java +++ b/core/java/android/os/Bundle.java @@ -33,6 +33,8 @@ public final class Bundle implements Parcelable, Cloneable { private static final String LOG_TAG = "Bundle"; public static final Bundle EMPTY; + static final int BUNDLE_MAGIC = 0x4C444E42; // 'B' 'N' 'D' 'L' + static { EMPTY = new Bundle(); EMPTY.mMap = ArrayMap.EMPTY; @@ -1643,11 +1645,11 @@ public final class Bundle implements Parcelable, Cloneable { if (mParcelledData != null) { int length = mParcelledData.dataSize(); parcel.writeInt(length); - parcel.writeInt(0x4C444E42); // 'B' 'N' 'D' 'L' + parcel.writeInt(BUNDLE_MAGIC); parcel.appendFrom(mParcelledData, 0, length); } else { parcel.writeInt(-1); // dummy, will hold length - parcel.writeInt(0x4C444E42); // 'B' 'N' 'D' 'L' + parcel.writeInt(BUNDLE_MAGIC); int oldPos = parcel.dataPosition(); parcel.writeArrayMapInternal(mMap); @@ -1679,11 +1681,10 @@ public final class Bundle implements Parcelable, Cloneable { void readFromParcelInner(Parcel parcel, int length) { int magic = parcel.readInt(); - if (magic != 0x4C444E42) { + if (magic != BUNDLE_MAGIC) { //noinspection ThrowableInstanceNeverThrown - String st = Log.getStackTraceString(new RuntimeException()); - Log.e("Bundle", "readBundle: bad magic number"); - Log.e("Bundle", "readBundle: trace = " + st); + throw new IllegalStateException("Bad magic number for Bundle: 0x" + + Integer.toHexString(magic)); } // Advance within this Parcel @@ -1694,10 +1695,23 @@ public final class Bundle implements Parcelable, Cloneable { p.setDataPosition(0); p.appendFrom(parcel, offset, length); p.setDataPosition(0); - - mParcelledData = p; - mHasFds = p.hasFileDescriptors(); - mFdsKnown = true; + + if (mMap != null) { + // It is not allowed to have a Bundle with both a map and a parcel, so if we + // already have a map then we need to immediately unparcel into it. This also + // lets us know we need to go through the slow path of unparceling, since the + // map may already contains some data so the two need to be merged. + if (mFdsKnown) { + mHasFds |= p.hasFileDescriptors(); + } + int N = p.readInt(); + p.readArrayMapSafelyInternal(mMap, N, mClassLoader); + p.recycle(); + } else { + mParcelledData = p; + mHasFds = p.hasFileDescriptors(); + mFdsKnown = true; + } } @Override diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index fec2a3ee09b5..5f3a81c9c7a6 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -178,6 +178,7 @@ import java.util.Set; */ public final class Parcel { private static final boolean DEBUG_RECYCLE = false; + private static final boolean DEBUG_ARRAY_MAP = false; private static final String TAG = "Parcel"; @SuppressWarnings({"UnusedDeclaration"}) @@ -605,7 +606,14 @@ public final class Parcel { } final int N = val.size(); writeInt(N); + if (DEBUG_ARRAY_MAP) { + RuntimeException here = new RuntimeException("here"); + here.fillInStackTrace(); + Log.d(TAG, "Writing " + N + " ArrayMap entries", here); + } for (int i=0; i<N; i++) { + if (DEBUG_ARRAY_MAP) Log.d(TAG, " Write #" + i + ": key=0x" + + (val.keyAt(i) != null ? val.keyAt(i).hashCode() : 0) + " " + val.keyAt(i)); writeValue(val.keyAt(i)); writeValue(val.valueAt(i)); } @@ -2289,14 +2297,38 @@ public final class Parcel { /* package */ void readArrayMapInternal(ArrayMap outVal, int N, ClassLoader loader) { + if (DEBUG_ARRAY_MAP) { + RuntimeException here = new RuntimeException("here"); + here.fillInStackTrace(); + Log.d(TAG, "Reading " + N + " ArrayMap entries", here); + } while (N > 0) { Object key = readValue(loader); + if (DEBUG_ARRAY_MAP) Log.d(TAG, " Read #" + (N-1) + ": key=0x" + + (key != null ? key.hashCode() : 0) + " " + key); Object value = readValue(loader); outVal.append(key, value); N--; } } + /* package */ void readArrayMapSafelyInternal(ArrayMap outVal, int N, + ClassLoader loader) { + if (DEBUG_ARRAY_MAP) { + RuntimeException here = new RuntimeException("here"); + here.fillInStackTrace(); + Log.d(TAG, "Reading safely " + N + " ArrayMap entries", here); + } + while (N > 0) { + Object key = readValue(loader); + if (DEBUG_ARRAY_MAP) Log.d(TAG, " Read safe #" + (N-1) + ": key=0x" + + (key != null ? key.hashCode() : 0) + " " + key); + Object value = readValue(loader); + outVal.put(key, value); + N--; + } + } + private void readListInternal(List outVal, int N, ClassLoader loader) { while (N > 0) { |
