summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2013-09-21 01:21:26 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-09-21 01:21:26 +0000
commit90d51b1abe64442927c7e6bdbafc99f41a55f393 (patch)
tree618c2edae0b6a95cbd5cfdb564a9df16fce6fb7a /core/java/android
parentb39ce63d2807c9d5c68d3be052dee7e9da7ec3be (diff)
parente784d1e4cfeaf3a9accd7caa33c087abd8f39040 (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.java34
-rw-r--r--core/java/android/os/Parcel.java32
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) {