1719e6b167041ffaffc2245f692714c8de191863fCraig Mautner/* 2719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Copyright (C) 2014 The Android Open Source Project 3719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 4719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Licensed under the Apache License, Version 2.0 (the "License"); 5719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * you may not use this file except in compliance with the License. 6719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * You may obtain a copy of the License at 7719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 8719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * http://www.apache.org/licenses/LICENSE-2.0 9719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 10719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Unless required by applicable law or agreed to in writing, software 11719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * distributed under the License is distributed on an "AS IS" BASIS, 12719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * See the License for the specific language governing permissions and 14719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * limitations under the License. 15719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 16719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 17719e6b167041ffaffc2245f692714c8de191863fCraig Mautnerpackage android.os; 18719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 194501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onukiimport android.annotation.NonNull; 20c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedyimport android.annotation.Nullable; 21719e6b167041ffaffc2245f692714c8de191863fCraig Mautnerimport android.util.ArrayMap; 22719e6b167041ffaffc2245f692714c8de191863fCraig Mautnerimport android.util.Log; 231619ed4706a0bf906d967ab7987cd4c475ac3462Adam Lesinskiimport android.util.MathUtils; 242387932b74699c4d5baa493271e999e31b09d2b8Amith Yamasaniimport android.util.Slog; 25a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkeyimport android.util.SparseArray; 26a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey 274501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onukiimport com.android.internal.annotations.VisibleForTesting; 28a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkeyimport com.android.internal.util.IndentingPrintWriter; 29719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 30719e6b167041ffaffc2245f692714c8de191863fCraig Mautnerimport java.io.Serializable; 31719e6b167041ffaffc2245f692714c8de191863fCraig Mautnerimport java.util.ArrayList; 32719e6b167041ffaffc2245f692714c8de191863fCraig Mautnerimport java.util.Set; 33719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 34719e6b167041ffaffc2245f692714c8de191863fCraig Mautner/** 35d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey * A mapping from String keys to values of various types. In most cases, you 36d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey * should work directly with either the {@link Bundle} or 37d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey * {@link PersistableBundle} subclass. 38719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 390a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautnerpublic class BaseBundle { 40719e6b167041ffaffc2245f692714c8de191863fCraig Mautner private static final String TAG = "Bundle"; 41719e6b167041ffaffc2245f692714c8de191863fCraig Mautner static final boolean DEBUG = false; 42719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 436bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki // Keep them in sync with frameworks/native/libs/binder/PersistableBundle.cpp. 446bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki private static final int BUNDLE_MAGIC = 0x4C444E42; // 'B' 'N' 'D' 'L' 456bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki private static final int BUNDLE_MAGIC_NATIVE = 0x4C444E44; // 'B' 'N' 'D' 'N' 463cefe6a991ba650375e663e7095266e2273d2372Samuel Tan 47d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey /** 48d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey * Flag indicating that this Bundle is okay to "defuse." That is, it's okay 49d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey * for system processes to ignore any {@link BadParcelableException} 50d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey * encountered when unparceling it, leaving an empty bundle in its place. 51d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey * <p> 52d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey * This should <em>only</em> be set when the Bundle reaches its final 53d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey * destination, otherwise a system process may clobber contents that were 54d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey * destined for an app that could have unparceled them. 55d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey */ 56d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey static final int FLAG_DEFUSABLE = 1 << 0; 57d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey 58cb45951cad9d403fd9933d723657d6d5838f5e59Jeff Sharkey private static final boolean LOG_DEFUSABLE = false; 59cb45951cad9d403fd9933d723657d6d5838f5e59Jeff Sharkey 60d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey private static volatile boolean sShouldDefuse = false; 61d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey 62d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey /** 63d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey * Set global variable indicating that any Bundles parsed in this process 64d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey * should be "defused." That is, any {@link BadParcelableException} 65d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey * encountered will be suppressed and logged, leaving an empty Bundle 66d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey * instead of crashing. 67d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey * 68d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey * @hide 69d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey */ 70d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey public static void setShouldDefuse(boolean shouldDefuse) { 71d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey sShouldDefuse = shouldDefuse; 72d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey } 73d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey 7452764cba5968888180ceedf717d85e08ffd747ccAndreas Gampe // A parcel cannot be obtained during compile-time initialization. Put the 7552764cba5968888180ceedf717d85e08ffd747ccAndreas Gampe // empty parcel into an inner class that can be initialized separately. This 7652764cba5968888180ceedf717d85e08ffd747ccAndreas Gampe // allows to initialize BaseBundle, and classes depending on it. 77d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey /** {@hide} */ 7852764cba5968888180ceedf717d85e08ffd747ccAndreas Gampe static final class NoImagePreloadHolder { 7952764cba5968888180ceedf717d85e08ffd747ccAndreas Gampe public static final Parcel EMPTY_PARCEL = Parcel.obtain(); 80719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 81719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 82719e6b167041ffaffc2245f692714c8de191863fCraig Mautner // Invariant - exactly one of mMap / mParcelledData will be null 83719e6b167041ffaffc2245f692714c8de191863fCraig Mautner // (except inside a call to unparcel) 84719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 85719e6b167041ffaffc2245f692714c8de191863fCraig Mautner ArrayMap<String, Object> mMap = null; 86719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 87719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /* 88719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * If mParcelledData is non-null, then mMap will be null and the 89719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * data are stored as a Parcel containing a Bundle. When the data 90719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * are unparcelled, mParcelledData willbe set to null. 91719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 92719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Parcel mParcelledData = null; 93719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 94719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 956bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki * Whether {@link #mParcelledData} was generated by native coed or not. 966bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki */ 976bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki private boolean mParcelledByNative; 986bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki 996bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki /** 100719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * The ClassLoader used when unparcelling data from mParcelledData. 101719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 102719e6b167041ffaffc2245f692714c8de191863fCraig Mautner private ClassLoader mClassLoader; 103719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 104d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey /** {@hide} */ 1054501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki @VisibleForTesting 1064501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki public int mFlags; 107d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey 108719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 109719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Constructs a new, empty Bundle that uses a specific ClassLoader for 110719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * instantiating Parcelable and Serializable objects. 111719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 112719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param loader An explicit ClassLoader to use when instantiating objects 113719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * inside of the Bundle. 114719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param capacity Initial size of the ArrayMap. 115719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 116c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy BaseBundle(@Nullable ClassLoader loader, int capacity) { 117719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap = capacity > 0 ? 118719e6b167041ffaffc2245f692714c8de191863fCraig Mautner new ArrayMap<String, Object>(capacity) : new ArrayMap<String, Object>(); 119719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mClassLoader = loader == null ? getClass().getClassLoader() : loader; 120719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 121719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 122719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 123719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Constructs a new, empty Bundle. 124719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1250a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner BaseBundle() { 126719e6b167041ffaffc2245f692714c8de191863fCraig Mautner this((ClassLoader) null, 0); 127719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 128719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 129719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 130719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Constructs a Bundle whose data is stored as a Parcel. The data 131719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * will be unparcelled on first contact, using the assigned ClassLoader. 132719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 133719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param parcelledData a Parcel containing a Bundle 134719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1350a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner BaseBundle(Parcel parcelledData) { 136719e6b167041ffaffc2245f692714c8de191863fCraig Mautner readFromParcelInner(parcelledData); 137719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 138719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1390a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner BaseBundle(Parcel parcelledData, int length) { 140719e6b167041ffaffc2245f692714c8de191863fCraig Mautner readFromParcelInner(parcelledData, length); 141719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 142719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 143719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 144719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Constructs a new, empty Bundle that uses a specific ClassLoader for 145719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * instantiating Parcelable and Serializable objects. 146719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 147719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param loader An explicit ClassLoader to use when instantiating objects 148719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * inside of the Bundle. 149719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1500a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner BaseBundle(ClassLoader loader) { 151719e6b167041ffaffc2245f692714c8de191863fCraig Mautner this(loader, 0); 152719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 153719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 154719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 155719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Constructs a new, empty Bundle sized to hold the given number of 156719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * elements. The Bundle will grow as needed. 157719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 158719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param capacity the initial capacity of the Bundle 159719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1600a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner BaseBundle(int capacity) { 161719e6b167041ffaffc2245f692714c8de191863fCraig Mautner this((ClassLoader) null, capacity); 162719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 163719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 164719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 165719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Constructs a Bundle containing a copy of the mappings from the given 166719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Bundle. 167719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 168719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param b a Bundle to be copied. 169719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1700a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner BaseBundle(BaseBundle b) { 171ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn copyInternal(b, false); 172ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } 173719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 174ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn /** 175ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn * Special constructor that does not initialize the bundle. 176ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn */ 177ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn BaseBundle(boolean doInit) { 178719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 179719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 180719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 181719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * TODO: optimize this later (getting just the value part of a Bundle 182719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * with a single pair) once Bundle.forPair() above is implemented 183719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * with a special single-value Map implementation/serialization. 184719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 185719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Note: value in single-pair Bundle may be null. 186719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 187719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @hide 188719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1890a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner public String getPairValue() { 190719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 191719e6b167041ffaffc2245f692714c8de191863fCraig Mautner int size = mMap.size(); 192719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (size > 1) { 193719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Log.w(TAG, "getPairValue() used on Bundle with multiple pairs."); 194719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 195719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (size == 0) { 196719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 197719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 198719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.valueAt(0); 199719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 200719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (String) o; 201719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 202719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning("getPairValue()", o, "String", e); 203719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 204719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 205719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 206719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 207719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 208719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Changes the ClassLoader this Bundle uses when instantiating objects. 209719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 210719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param loader An explicit ClassLoader to use when instantiating objects 211719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * inside of the Bundle. 212719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 213719e6b167041ffaffc2245f692714c8de191863fCraig Mautner void setClassLoader(ClassLoader loader) { 214719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mClassLoader = loader; 215719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 216719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 217719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 218719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Return the ClassLoader currently associated with this Bundle. 219719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 220719e6b167041ffaffc2245f692714c8de191863fCraig Mautner ClassLoader getClassLoader() { 221719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return mClassLoader; 222719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 223719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 224719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 225719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * If the underlying data are stored as a Parcel, unparcel them 226719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * using the currently assigned class loader. 227719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 228694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani /* package */ void unparcel() { 229d8e877d27d8e5a87446b9e1030325edad268d9e3Dianne Hackborn synchronized (this) { 2304501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki final Parcel source = mParcelledData; 2314501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki if (source != null) { 2326bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki initializeFromParcelLocked(source, /*recycleParcel=*/ true, mParcelledByNative); 2334501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } else { 2344501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki if (DEBUG) { 2354501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki Log.d(TAG, "unparcel " 2364501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki + Integer.toHexString(System.identityHashCode(this)) 2374501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki + ": no parcelled data"); 2384501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } 239d8e877d27d8e5a87446b9e1030325edad268d9e3Dianne Hackborn } 2404501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } 2414501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } 242719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 2436bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki private void initializeFromParcelLocked(@NonNull Parcel parcelledData, boolean recycleParcel, 2446bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki boolean parcelledByNative) { 2454501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki if (LOG_DEFUSABLE && sShouldDefuse && (mFlags & FLAG_DEFUSABLE) == 0) { 2464501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki Slog.wtf(TAG, "Attempting to unparcel a Bundle while in transit; this may " 2474501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki + "clobber all data inside!", new Throwable()); 2484501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } 249d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey 2504501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki if (isEmptyParcel(parcelledData)) { 2514501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki if (DEBUG) { 2524501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki Log.d(TAG, "unparcel " 253d8e877d27d8e5a87446b9e1030325edad268d9e3Dianne Hackborn + Integer.toHexString(System.identityHashCode(this)) + ": empty"); 254719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 2554501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki if (mMap == null) { 2564501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki mMap = new ArrayMap<>(1); 257d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey } else { 2584501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki mMap.erase(); 2594501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } 2604501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki mParcelledData = null; 2616bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki mParcelledByNative = false; 2624501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki return; 2634501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } 2644501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki 2654501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki final int count = parcelledData.readInt(); 2664501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki if (DEBUG) { 2674501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki Log.d(TAG, "unparcel " + Integer.toHexString(System.identityHashCode(this)) 2684501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki + ": reading " + count + " maps"); 2694501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } 2704501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki if (count < 0) { 2714501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki return; 2724501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } 2734501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki ArrayMap<String, Object> map = mMap; 2744501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki if (map == null) { 2754501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki map = new ArrayMap<>(count); 2764501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } else { 2774501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki map.erase(); 2784501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki map.ensureCapacity(count); 2794501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } 2804501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki try { 2816bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki if (parcelledByNative) { 2826bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki // If it was parcelled by native code, then the array map keys aren't sorted 2836bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki // by their hash codes, so use the safe (slow) one. 2846bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki parcelledData.readArrayMapSafelyInternal(map, count, mClassLoader); 2856bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki } else { 2866bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki // If parcelled by Java, we know the contents are sorted properly, 2876bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki // so we can use ArrayMap.append(). 2886bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki parcelledData.readArrayMapInternal(map, count, mClassLoader); 2896bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki } 2904501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } catch (BadParcelableException e) { 2914501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki if (sShouldDefuse) { 2924501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki Log.w(TAG, "Failed to parse Bundle, but defusing quietly", e); 293d8e877d27d8e5a87446b9e1030325edad268d9e3Dianne Hackborn map.erase(); 2944501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } else { 2954501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki throw e; 296d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey } 2974501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } finally { 2984501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki mMap = map; 2994501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki if (recycleParcel) { 3004501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki recycleParcel(parcelledData); 301d8e877d27d8e5a87446b9e1030325edad268d9e3Dianne Hackborn } 3024501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki mParcelledData = null; 3036bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki mParcelledByNative = false; 3044501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } 3054501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki if (DEBUG) { 3064501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki Log.d(TAG, "unparcel " + Integer.toHexString(System.identityHashCode(this)) 307d8e877d27d8e5a87446b9e1030325edad268d9e3Dianne Hackborn + " final map: " + mMap); 308d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey } 309719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 310719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 311719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 312719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @hide 313719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 3140a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner public boolean isParcelled() { 315719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return mParcelledData != null; 316719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 317719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 31852764cba5968888180ceedf717d85e08ffd747ccAndreas Gampe /** 31952764cba5968888180ceedf717d85e08ffd747ccAndreas Gampe * @hide 32052764cba5968888180ceedf717d85e08ffd747ccAndreas Gampe */ 32152764cba5968888180ceedf717d85e08ffd747ccAndreas Gampe public boolean isEmptyParcel() { 3224501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki return isEmptyParcel(mParcelledData); 3234501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } 3244501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki 3254501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki /** 3264501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki * @hide 3274501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki */ 3284501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki private static boolean isEmptyParcel(Parcel p) { 3294501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki return p == NoImagePreloadHolder.EMPTY_PARCEL; 3304501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } 3314501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki 3324501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki private static void recycleParcel(Parcel p) { 3334501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki if (p != null && !isEmptyParcel(p)) { 3344501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki p.recycle(); 3354501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } 33652764cba5968888180ceedf717d85e08ffd747ccAndreas Gampe } 33752764cba5968888180ceedf717d85e08ffd747ccAndreas Gampe 3386f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki /** @hide */ 3396f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki ArrayMap<String, Object> getMap() { 3406f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki unparcel(); 3416f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki return mMap; 3426f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki } 343719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 344719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 345719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the number of mappings contained in this Bundle. 346719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 347719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return the number of mappings as an int. 348719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 3490a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner public int size() { 350719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 351719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return mMap.size(); 352719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 353719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 354719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 355719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns true if the mapping of this Bundle is empty, false otherwise. 356719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 3570a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner public boolean isEmpty() { 358719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 359719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return mMap.isEmpty(); 360719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 361719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 362719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 363a47223f99b6b7ade4ae909c458d975eb487062b3Dianne Hackborn * @hide this should probably be the implementation of isEmpty(). To do that we 364a47223f99b6b7ade4ae909c458d975eb487062b3Dianne Hackborn * need to ensure we always use the special empty parcel form when the bundle is 365a47223f99b6b7ade4ae909c458d975eb487062b3Dianne Hackborn * empty. (This may already be the case, but to be safe we'll do this later when 366a47223f99b6b7ade4ae909c458d975eb487062b3Dianne Hackborn * we aren't trying to stabilize.) 367a47223f99b6b7ade4ae909c458d975eb487062b3Dianne Hackborn */ 368a47223f99b6b7ade4ae909c458d975eb487062b3Dianne Hackborn public boolean maybeIsEmpty() { 369a47223f99b6b7ade4ae909c458d975eb487062b3Dianne Hackborn if (isParcelled()) { 370a47223f99b6b7ade4ae909c458d975eb487062b3Dianne Hackborn return isEmptyParcel(); 371a47223f99b6b7ade4ae909c458d975eb487062b3Dianne Hackborn } else { 372a47223f99b6b7ade4ae909c458d975eb487062b3Dianne Hackborn return isEmpty(); 373a47223f99b6b7ade4ae909c458d975eb487062b3Dianne Hackborn } 374a47223f99b6b7ade4ae909c458d975eb487062b3Dianne Hackborn } 375a47223f99b6b7ade4ae909c458d975eb487062b3Dianne Hackborn 376a47223f99b6b7ade4ae909c458d975eb487062b3Dianne Hackborn /** 377021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla * Does a loose equality check between two given {@link BaseBundle} objects. 378021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla * Returns {@code true} if both are {@code null}, or if both are equal as per 379021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla * {@link #kindofEquals(BaseBundle)} 380021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla * 381021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla * @param a A {@link BaseBundle} object 382021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla * @param b Another {@link BaseBundle} to compare with a 383021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla * @return {@code true} if both are the same, {@code false} otherwise 384021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla * 385021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla * @see #kindofEquals(BaseBundle) 386021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla * 387021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla * @hide 388021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla */ 389021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla public static boolean kindofEquals(BaseBundle a, BaseBundle b) { 390021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla return (a == b) || (a != null && a.kindofEquals(b)); 391021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla } 392021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla 393021b57ab8df0927aa1f78a2f3bb01d5e70594b1aSuprabh Shukla /** 3947da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn * @hide This kind-of does an equality comparison. Kind-of. 3957da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn */ 3967da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn public boolean kindofEquals(BaseBundle other) { 3977da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn if (other == null) { 3987da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn return false; 3997da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn } 4007da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn if (isParcelled() != other.isParcelled()) { 4017da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn // Big kind-of here! 4027da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn return false; 4037da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn } else if (isParcelled()) { 4047da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn return mParcelledData.compareData(other.mParcelledData) == 0; 4057da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn } else { 4067da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn return mMap.equals(other.mMap); 4077da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn } 4087da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn } 4097da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn 4107da13d7c3e5b48c0410ae869c5679652de97e5aaDianne Hackborn /** 411719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Removes all elements from the mapping of this Bundle. 412719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 4130a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner public void clear() { 414719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 415719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.clear(); 416719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 417719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 418ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn void copyInternal(BaseBundle from, boolean deep) { 419694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani synchronized (from) { 420694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani if (from.mParcelledData != null) { 421694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani if (from.isEmptyParcel()) { 422694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani mParcelledData = NoImagePreloadHolder.EMPTY_PARCEL; 4236bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki mParcelledByNative = false; 424694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani } else { 425694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani mParcelledData = Parcel.obtain(); 426694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani mParcelledData.appendFrom(from.mParcelledData, 0, 427694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani from.mParcelledData.dataSize()); 428694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani mParcelledData.setDataPosition(0); 4296bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki mParcelledByNative = from.mParcelledByNative; 430694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani } 431ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } else { 432694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani mParcelledData = null; 4336bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki mParcelledByNative = false; 434ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } 435ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn 436694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani if (from.mMap != null) { 437694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani if (!deep) { 438694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani mMap = new ArrayMap<>(from.mMap); 439694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani } else { 440694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani final ArrayMap<String, Object> fromMap = from.mMap; 441694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani final int N = fromMap.size(); 442694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani mMap = new ArrayMap<>(N); 443694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani for (int i = 0; i < N; i++) { 4442510b37518fd2fa227a9399b9269dd9a04ceb8d9Dianne Hackborn mMap.append(fromMap.keyAt(i), deepCopyValue(fromMap.valueAt(i))); 445694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani } 446ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } 447694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani } else { 448694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani mMap = null; 449ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } 450ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn 451694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani mClassLoader = from.mClassLoader; 452694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani } 453ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } 454ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn 4552510b37518fd2fa227a9399b9269dd9a04ceb8d9Dianne Hackborn Object deepCopyValue(Object value) { 456ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn if (value == null) { 457ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn return null; 458ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } 459ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn if (value instanceof Bundle) { 4602510b37518fd2fa227a9399b9269dd9a04ceb8d9Dianne Hackborn return ((Bundle)value).deepCopy(); 461ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } else if (value instanceof PersistableBundle) { 4622510b37518fd2fa227a9399b9269dd9a04ceb8d9Dianne Hackborn return ((PersistableBundle)value).deepCopy(); 463ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } else if (value instanceof ArrayList) { 464ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn return deepcopyArrayList((ArrayList) value); 465ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } else if (value.getClass().isArray()) { 466ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn if (value instanceof int[]) { 467ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn return ((int[])value).clone(); 468ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } else if (value instanceof long[]) { 469ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn return ((long[])value).clone(); 470ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } else if (value instanceof float[]) { 471ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn return ((float[])value).clone(); 472ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } else if (value instanceof double[]) { 473ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn return ((double[])value).clone(); 474ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } else if (value instanceof Object[]) { 475ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn return ((Object[])value).clone(); 476ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } else if (value instanceof byte[]) { 477ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn return ((byte[])value).clone(); 478ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } else if (value instanceof short[]) { 479ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn return ((short[])value).clone(); 480ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } else if (value instanceof char[]) { 481ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn return ((char[]) value).clone(); 482ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } 483ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } 484ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn return value; 485ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } 486ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn 487ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn ArrayList deepcopyArrayList(ArrayList from) { 488ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn final int N = from.size(); 489ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn ArrayList out = new ArrayList(N); 490ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn for (int i=0; i<N; i++) { 4912510b37518fd2fa227a9399b9269dd9a04ceb8d9Dianne Hackborn out.add(deepCopyValue(from.get(i))); 492ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } 493ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn return out; 494ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn } 495ba60473a6539d16bef8720d79b5559512303bddfDianne Hackborn 496719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 497719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns true if the given key is contained in the mapping 498719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * of this Bundle. 499719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 500719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String key 501719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return true if the key is part of the mapping, false otherwise 502719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 5030a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner public boolean containsKey(String key) { 504719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 505719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return mMap.containsKey(key); 506719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 507719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 508719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 509719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the entry with the given key as an object. 510719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 511719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String key 512719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return an Object, or null 513719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 514c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 5150a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner public Object get(String key) { 516719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 517719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return mMap.get(key); 518719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 519719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 520719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 521719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Removes any entry with the given key from the mapping of this Bundle. 522719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 523719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String key 524719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 5250a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner public void remove(String key) { 526719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 527719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.remove(key); 528719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 529719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 530719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 5310a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner * Inserts all mappings from the given PersistableBundle into this BaseBundle. 532719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 533719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param bundle a PersistableBundle 534719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 5350a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner public void putAll(PersistableBundle bundle) { 536719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 537719e6b167041ffaffc2245f692714c8de191863fCraig Mautner bundle.unparcel(); 538719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.putAll(bundle.mMap); 539719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 540719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 541719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 5420a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner * Inserts all mappings from the given Map into this BaseBundle. 54321d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner * 54421d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner * @param map a Map 54521d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner */ 546a83ce1dd2ad3a6b71e90ff4845afc1299fe17b9dDianne Hackborn void putAll(ArrayMap map) { 54721d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner unparcel(); 54821d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner mMap.putAll(map); 54921d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner } 55021d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner 55121d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner /** 552719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns a Set containing the Strings used as keys in this Bundle. 553719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 554719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a Set of String keys 555719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 5560a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner public Set<String> keySet() { 557719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 558719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return mMap.keySet(); 559719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 560719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 561719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 562719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a Boolean value into the mapping of this Bundle, replacing 563719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 564719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 565719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 566c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy * @param value a boolean 567719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 568c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public void putBoolean(@Nullable String key, boolean value) { 569719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 570719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 571719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 572719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 573719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 574719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a byte value into the mapping of this Bundle, replacing 575719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. 576719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 577719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 578719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a byte 579719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 580c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy void putByte(@Nullable String key, byte value) { 581719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 582719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 583719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 584719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 585719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 586719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a char value into the mapping of this Bundle, replacing 587719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. 588719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 589719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 590c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy * @param value a char 591719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 592c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy void putChar(@Nullable String key, char value) { 593719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 594719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 595719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 596719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 597719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 598719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a short value into the mapping of this Bundle, replacing 599719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. 600719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 601719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 602719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a short 603719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 604c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy void putShort(@Nullable String key, short value) { 605719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 606719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 607719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 608719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 609719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 610719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts an int value into the mapping of this Bundle, replacing 611719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. 612719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 613719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 614c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy * @param value an int 615719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 616c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public void putInt(@Nullable String key, int value) { 617719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 618719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 619719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 620719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 621719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 622719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a long value into the mapping of this Bundle, replacing 623719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. 624719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 625719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 626719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a long 627719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 628c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public void putLong(@Nullable String key, long value) { 629719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 630719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 631719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 632719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 633719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 634719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a float value into the mapping of this Bundle, replacing 635719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. 636719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 637719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 638719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a float 639719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 640c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy void putFloat(@Nullable String key, float value) { 641719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 642719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 643719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 644719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 645719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 646719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a double value into the mapping of this Bundle, replacing 647719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. 648719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 649719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 650719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a double 651719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 652c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public void putDouble(@Nullable String key, double value) { 653719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 654719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 655719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 656719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 657719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 658719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a String value into the mapping of this Bundle, replacing 659719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 660719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 661719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 662719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a String, or null 663719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 664c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public void putString(@Nullable String key, @Nullable String value) { 665719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 666719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 667719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 668719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 669719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 670719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a CharSequence value into the mapping of this Bundle, replacing 671719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 672719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 673719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 674719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a CharSequence, or null 675719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 676c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy void putCharSequence(@Nullable String key, @Nullable CharSequence value) { 677719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 678719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 679719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 680719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 681719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 682719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts an ArrayList<Integer> value into the mapping of this Bundle, replacing 683719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 684719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 685719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 686719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value an ArrayList<Integer> object, or null 687719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 688c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy void putIntegerArrayList(@Nullable String key, @Nullable ArrayList<Integer> value) { 689719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 690719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 691719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 692719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 693719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 694719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts an ArrayList<String> value into the mapping of this Bundle, replacing 695719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 696719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 697719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 698719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value an ArrayList<String> object, or null 699719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 700c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy void putStringArrayList(@Nullable String key, @Nullable ArrayList<String> value) { 701719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 702719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 703719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 704719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 705719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 706719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts an ArrayList<CharSequence> value into the mapping of this Bundle, replacing 707719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 708719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 709719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 710719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value an ArrayList<CharSequence> object, or null 711719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 712c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy void putCharSequenceArrayList(@Nullable String key, @Nullable ArrayList<CharSequence> value) { 713719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 714719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 715719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 716719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 717719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 718719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a Serializable value into the mapping of this Bundle, replacing 719719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 720719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 721719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 722719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a Serializable object, or null 723719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 724c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy void putSerializable(@Nullable String key, @Nullable Serializable value) { 725719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 726719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 727719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 728719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 729719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 730719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a boolean array value into the mapping of this Bundle, replacing 731719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 732719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 733719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 734719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a boolean array object, or null 735719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 736c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public void putBooleanArray(@Nullable String key, @Nullable boolean[] value) { 737719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 738719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 739719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 740719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 741719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 742719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a byte array value into the mapping of this Bundle, replacing 743719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 744719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 745719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 746719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a byte array object, or null 747719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 748c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy void putByteArray(@Nullable String key, @Nullable byte[] value) { 749719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 750719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 751719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 752719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 753719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 754719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a short array value into the mapping of this Bundle, replacing 755719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 756719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 757719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 758719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a short array object, or null 759719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 760c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy void putShortArray(@Nullable String key, @Nullable short[] value) { 761719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 762719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 763719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 764719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 765719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 766719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a char array value into the mapping of this Bundle, replacing 767719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 768719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 769719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 770719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a char array object, or null 771719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 772c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy void putCharArray(@Nullable String key, @Nullable char[] value) { 773719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 774719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 775719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 776719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 777719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 778719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts an int array value into the mapping of this Bundle, replacing 779719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 780719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 781719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 782719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value an int array object, or null 783719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 784c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public void putIntArray(@Nullable String key, @Nullable int[] value) { 785719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 786719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 787719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 788719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 789719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 790719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a long array value into the mapping of this Bundle, replacing 791719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 792719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 793719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 794719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a long array object, or null 795719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 796c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public void putLongArray(@Nullable String key, @Nullable long[] value) { 797719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 798719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 799719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 800719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 801719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 802719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a float array value into the mapping of this Bundle, replacing 803719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 804719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 805719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 806719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a float array object, or null 807719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 808c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy void putFloatArray(@Nullable String key, @Nullable float[] value) { 809719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 810719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 811719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 812719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 813719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 814719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a double array value into the mapping of this Bundle, replacing 815719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 816719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 817719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 818719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a double array object, or null 819719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 820c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public void putDoubleArray(@Nullable String key, @Nullable double[] value) { 821719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 822719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 823719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 824719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 825719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 826719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a String array value into the mapping of this Bundle, replacing 827719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 828719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 829719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 830719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a String array object, or null 831719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 832c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public void putStringArray(@Nullable String key, @Nullable String[] value) { 833719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 834719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 835719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 836719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 837719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 838719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Inserts a CharSequence array value into the mapping of this Bundle, replacing 839719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * any existing value for the given key. Either key or value may be null. 840719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 841719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 842719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param value a CharSequence array object, or null 843719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 844c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy void putCharSequenceArray(@Nullable String key, @Nullable CharSequence[] value) { 845719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 846719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mMap.put(key, value); 847719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 848719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 849719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 850719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or false if 851719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key. 852719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 853719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String 854719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a boolean value 855719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 85673bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner public boolean getBoolean(String key) { 857719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 858719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (DEBUG) Log.d(TAG, "Getting boolean in " 859719e6b167041ffaffc2245f692714c8de191863fCraig Mautner + Integer.toHexString(System.identityHashCode(this))); 860719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return getBoolean(key, false); 861719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 862719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 863719e6b167041ffaffc2245f692714c8de191863fCraig Mautner // Log a message if the value was non-null but not of the expected type 864719e6b167041ffaffc2245f692714c8de191863fCraig Mautner void typeWarning(String key, Object value, String className, 865719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object defaultValue, ClassCastException e) { 866719e6b167041ffaffc2245f692714c8de191863fCraig Mautner StringBuilder sb = new StringBuilder(); 867719e6b167041ffaffc2245f692714c8de191863fCraig Mautner sb.append("Key "); 868719e6b167041ffaffc2245f692714c8de191863fCraig Mautner sb.append(key); 869719e6b167041ffaffc2245f692714c8de191863fCraig Mautner sb.append(" expected "); 870719e6b167041ffaffc2245f692714c8de191863fCraig Mautner sb.append(className); 871719e6b167041ffaffc2245f692714c8de191863fCraig Mautner sb.append(" but value was a "); 872719e6b167041ffaffc2245f692714c8de191863fCraig Mautner sb.append(value.getClass().getName()); 873719e6b167041ffaffc2245f692714c8de191863fCraig Mautner sb.append(". The default value "); 874719e6b167041ffaffc2245f692714c8de191863fCraig Mautner sb.append(defaultValue); 875719e6b167041ffaffc2245f692714c8de191863fCraig Mautner sb.append(" was returned."); 876719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Log.w(TAG, sb.toString()); 877719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Log.w(TAG, "Attempt to cast generated internal exception:", e); 878719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 879719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 880719e6b167041ffaffc2245f692714c8de191863fCraig Mautner void typeWarning(String key, Object value, String className, 881719e6b167041ffaffc2245f692714c8de191863fCraig Mautner ClassCastException e) { 882719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, value, className, "<null>", e); 883719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 884719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 885719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 886719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or defaultValue if 887719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key. 888719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 889719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String 890719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param defaultValue Value to return if key does not exist 891719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a boolean value 892719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 89373bdf9761be2abdd85efc5fce165f3fa80fcfa65Craig Mautner public boolean getBoolean(String key, boolean defaultValue) { 894719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 895719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 896719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 897719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return defaultValue; 898719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 899719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 900719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (Boolean) o; 901719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 902719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "Boolean", defaultValue, e); 903719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return defaultValue; 904719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 905719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 906719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 907719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 908719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or (byte) 0 if 909719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key. 910719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 911719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String 912719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a byte value 913719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 914719e6b167041ffaffc2245f692714c8de191863fCraig Mautner byte getByte(String key) { 915719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 916719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return getByte(key, (byte) 0); 917719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 918719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 919719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 920719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or defaultValue if 921719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key. 922719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 923719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String 924719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param defaultValue Value to return if key does not exist 925719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a byte value 926719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 927719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Byte getByte(String key, byte defaultValue) { 928719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 929719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 930719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 931719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return defaultValue; 932719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 933719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 934719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (Byte) o; 935719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 936719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "Byte", defaultValue, e); 937719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return defaultValue; 938719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 939719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 940719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 941719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 942719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or (char) 0 if 943719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key. 944719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 945719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String 946719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a char value 947719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 948719e6b167041ffaffc2245f692714c8de191863fCraig Mautner char getChar(String key) { 949719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 950719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return getChar(key, (char) 0); 951719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 952719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 953719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 954719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or defaultValue if 955719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key. 956719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 957719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String 958719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param defaultValue Value to return if key does not exist 959719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a char value 960719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 961719e6b167041ffaffc2245f692714c8de191863fCraig Mautner char getChar(String key, char defaultValue) { 962719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 963719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 964719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 965719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return defaultValue; 966719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 967719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 968719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (Character) o; 969719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 970719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "Character", defaultValue, e); 971719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return defaultValue; 972719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 973719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 974719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 975719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 976719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or (short) 0 if 977719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key. 978719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 979719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String 980719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a short value 981719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 982719e6b167041ffaffc2245f692714c8de191863fCraig Mautner short getShort(String key) { 983719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 984719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return getShort(key, (short) 0); 985719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 986719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 987719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 988719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or defaultValue if 989719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key. 990719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 991719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String 992719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param defaultValue Value to return if key does not exist 993719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a short value 994719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 995719e6b167041ffaffc2245f692714c8de191863fCraig Mautner short getShort(String key, short defaultValue) { 996719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 997719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 998719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 999719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return defaultValue; 1000719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1001719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1002719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (Short) o; 1003719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1004719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "Short", defaultValue, e); 1005719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return defaultValue; 1006719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1007719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1008719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1009719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1010719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or 0 if 1011719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key. 1012719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1013719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String 1014719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return an int value 1015719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 10160a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner public int getInt(String key) { 1017719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1018719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return getInt(key, 0); 1019719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1020719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1021719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1022719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or defaultValue if 1023719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key. 1024719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1025719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String 1026719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param defaultValue Value to return if key does not exist 1027719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return an int value 1028719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 10290a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner public int getInt(String key, int defaultValue) { 1030719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1031719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1032719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1033719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return defaultValue; 1034719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1035719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1036719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (Integer) o; 1037719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1038719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "Integer", defaultValue, e); 1039719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return defaultValue; 1040719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1041719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1042719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1043719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1044719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or 0L if 1045719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key. 1046719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1047719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String 1048719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a long value 1049719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 10500a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner public long getLong(String key) { 1051719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1052719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return getLong(key, 0L); 1053719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1054719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1055719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1056719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or defaultValue if 1057719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key. 1058719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1059719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String 1060719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param defaultValue Value to return if key does not exist 1061719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a long value 1062719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 10630a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner public long getLong(String key, long defaultValue) { 1064719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1065719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1066719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1067719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return defaultValue; 1068719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1069719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1070719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (Long) o; 1071719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1072719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "Long", defaultValue, e); 1073719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return defaultValue; 1074719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1075719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1076719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1077719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1078719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or 0.0f if 1079719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key. 1080719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1081719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String 1082719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a float value 1083719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1084719e6b167041ffaffc2245f692714c8de191863fCraig Mautner float getFloat(String key) { 1085719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1086719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return getFloat(key, 0.0f); 1087719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1088719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1089719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1090719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or defaultValue if 1091719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key. 1092719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1093719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String 1094719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param defaultValue Value to return if key does not exist 1095719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a float value 1096719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1097719e6b167041ffaffc2245f692714c8de191863fCraig Mautner float getFloat(String key, float defaultValue) { 1098719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1099719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1100719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1101719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return defaultValue; 1102719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1103719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1104719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (Float) o; 1105719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1106719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "Float", defaultValue, e); 1107719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return defaultValue; 1108719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1109719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1110719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1111719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1112719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or 0.0 if 1113719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key. 1114719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1115719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String 1116719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a double value 1117719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 11180a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner public double getDouble(String key) { 1119719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1120719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return getDouble(key, 0.0); 1121719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1122719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1123719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1124719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or defaultValue if 1125719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key. 1126719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1127719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String 1128719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param defaultValue Value to return if key does not exist 1129719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a double value 1130719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 11310a8e160eb56f3b8f504b37349a79ec4edb7e5039Craig Mautner public double getDouble(String key, double defaultValue) { 1132719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1133719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1134719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1135719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return defaultValue; 1136719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1137719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1138719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (Double) o; 1139719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1140719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "Double", defaultValue, e); 1141719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return defaultValue; 1142719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1143719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1144719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1145719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1146719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or null if 1147719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key or a null 1148719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * value is explicitly associated with the key. 1149719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1150719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1151719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a String value, or null 1152719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1153c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 1154c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public String getString(@Nullable String key) { 1155719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1156719e6b167041ffaffc2245f692714c8de191863fCraig Mautner final Object o = mMap.get(key); 1157719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1158719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (String) o; 1159719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1160719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "String", e); 1161719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1162719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1163719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1164719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1165719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1166719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or defaultValue if 1167aeaf87fe452353371b36da42e5beccca3150ab08Narayan Kamath * no mapping of the desired type exists for the given key or if a null 1168aeaf87fe452353371b36da42e5beccca3150ab08Narayan Kamath * value is explicitly associated with the given key. 1169719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1170719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1171aeaf87fe452353371b36da42e5beccca3150ab08Narayan Kamath * @param defaultValue Value to return if key does not exist or if a null 1172aeaf87fe452353371b36da42e5beccca3150ab08Narayan Kamath * value is associated with the given key. 1173719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return the String value associated with the given key, or defaultValue 1174719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * if no valid String object is currently mapped to that key. 1175719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1176c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public String getString(@Nullable String key, String defaultValue) { 1177719e6b167041ffaffc2245f692714c8de191863fCraig Mautner final String s = getString(key); 1178719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (s == null) ? defaultValue : s; 1179719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1180719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1181719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1182719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or null if 1183719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key or a null 1184719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * value is explicitly associated with the key. 1185719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1186719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1187719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a CharSequence value, or null 1188719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1189c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 1190c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy CharSequence getCharSequence(@Nullable String key) { 1191719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1192719e6b167041ffaffc2245f692714c8de191863fCraig Mautner final Object o = mMap.get(key); 1193719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1194719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (CharSequence) o; 1195719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1196719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "CharSequence", e); 1197719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1198719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1199719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1200719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1201719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1202719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or defaultValue if 1203aeaf87fe452353371b36da42e5beccca3150ab08Narayan Kamath * no mapping of the desired type exists for the given key or if a null 1204aeaf87fe452353371b36da42e5beccca3150ab08Narayan Kamath * value is explicitly associated with the given key. 1205719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1206719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1207aeaf87fe452353371b36da42e5beccca3150ab08Narayan Kamath * @param defaultValue Value to return if key does not exist or if a null 1208aeaf87fe452353371b36da42e5beccca3150ab08Narayan Kamath * value is associated with the given key. 1209719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return the CharSequence value associated with the given key, or defaultValue 1210719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * if no valid CharSequence object is currently mapped to that key. 1211719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1212c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy CharSequence getCharSequence(@Nullable String key, CharSequence defaultValue) { 1213719e6b167041ffaffc2245f692714c8de191863fCraig Mautner final CharSequence cs = getCharSequence(key); 1214719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (cs == null) ? defaultValue : cs; 1215719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1216719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1217719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1218719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or null if 1219719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key or a null 1220719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * value is explicitly associated with the key. 1221719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1222719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1223719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a Serializable value, or null 1224719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1225c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 1226c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy Serializable getSerializable(@Nullable String key) { 1227719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1228719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1229719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1230719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1231719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1232719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1233719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (Serializable) o; 1234719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1235719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "Serializable", e); 1236719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1237719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1238719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1239719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1240719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1241719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or null if 1242719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key or a null 1243719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * value is explicitly associated with the key. 1244719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1245719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1246719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return an ArrayList<String> value, or null 1247719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1248c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 1249c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy ArrayList<Integer> getIntegerArrayList(@Nullable String key) { 1250719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1251719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1252719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1253719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1254719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1255719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1256719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (ArrayList<Integer>) o; 1257719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1258719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "ArrayList<Integer>", e); 1259719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1260719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1261719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1262719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1263719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1264719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or null if 1265719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key or a null 1266719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * value is explicitly associated with the key. 1267719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1268719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1269719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return an ArrayList<String> value, or null 1270719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1271c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 1272c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy ArrayList<String> getStringArrayList(@Nullable String key) { 1273719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1274719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1275719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1276719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1277719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1278719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1279719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (ArrayList<String>) o; 1280719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1281719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "ArrayList<String>", e); 1282719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1283719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1284719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1285719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1286719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1287719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or null if 1288719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key or a null 1289719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * value is explicitly associated with the key. 1290719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1291719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1292719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return an ArrayList<CharSequence> value, or null 1293719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1294c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 1295c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy ArrayList<CharSequence> getCharSequenceArrayList(@Nullable String key) { 1296719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1297719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1298719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1299719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1300719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1301719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1302719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (ArrayList<CharSequence>) o; 1303719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1304719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "ArrayList<CharSequence>", e); 1305719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1306719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1307719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1308719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1309719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1310719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or null if 1311719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key or a null 1312719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * value is explicitly associated with the key. 1313719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1314719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1315719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a boolean[] value, or null 1316719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1317c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 1318c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public boolean[] getBooleanArray(@Nullable String key) { 1319719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1320719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1321719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1322719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1323719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1324719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1325719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (boolean[]) o; 1326719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1327719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "byte[]", e); 1328719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1329719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1330719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1331719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1332719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1333719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or null if 1334719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key or a null 1335719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * value is explicitly associated with the key. 1336719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1337719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1338719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a byte[] value, or null 1339719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1340c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 1341c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy byte[] getByteArray(@Nullable String key) { 1342719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1343719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1344719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1345719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1346719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1347719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1348719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (byte[]) o; 1349719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1350719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "byte[]", e); 1351719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1352719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1353719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1354719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1355719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1356719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or null if 1357719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key or a null 1358719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * value is explicitly associated with the key. 1359719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1360719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1361719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a short[] value, or null 1362719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1363c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 1364c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy short[] getShortArray(@Nullable String key) { 1365719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1366719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1367719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1368719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1369719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1370719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1371719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (short[]) o; 1372719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1373719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "short[]", e); 1374719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1375719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1376719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1377719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1378719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1379719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or null if 1380719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key or a null 1381719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * value is explicitly associated with the key. 1382719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1383719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1384719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a char[] value, or null 1385719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1386c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 1387c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy char[] getCharArray(@Nullable String key) { 1388719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1389719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1390719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1391719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1392719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1393719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1394719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (char[]) o; 1395719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1396719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "char[]", e); 1397719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1398719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1399719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1400719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1401719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1402719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or null if 1403719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key or a null 1404719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * value is explicitly associated with the key. 1405719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1406719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1407719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return an int[] value, or null 1408719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1409c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 1410c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public int[] getIntArray(@Nullable String key) { 1411719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1412719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1413719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1414719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1415719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1416719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1417719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (int[]) o; 1418719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1419719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "int[]", e); 1420719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1421719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1422719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1423719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1424719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1425719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or null if 1426719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key or a null 1427719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * value is explicitly associated with the key. 1428719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1429719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1430719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a long[] value, or null 1431719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1432c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 1433c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public long[] getLongArray(@Nullable String key) { 1434719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1435719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1436719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1437719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1438719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1439719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1440719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (long[]) o; 1441719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1442719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "long[]", e); 1443719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1444719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1445719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1446719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1447719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1448719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or null if 1449719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key or a null 1450719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * value is explicitly associated with the key. 1451719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1452719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1453719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a float[] value, or null 1454719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1455c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 1456c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy float[] getFloatArray(@Nullable String key) { 1457719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1458719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1459719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1460719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1461719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1462719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1463719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (float[]) o; 1464719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1465719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "float[]", e); 1466719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1467719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1468719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1469719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1470719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1471719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or null if 1472719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key or a null 1473719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * value is explicitly associated with the key. 1474719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1475719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1476719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a double[] value, or null 1477719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1478c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 1479c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public double[] getDoubleArray(@Nullable String key) { 1480719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1481719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1482719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1483719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1484719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1485719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1486719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (double[]) o; 1487719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1488719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "double[]", e); 1489719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1490719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1491719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1492719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1493719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1494719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or null if 1495719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key or a null 1496719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * value is explicitly associated with the key. 1497719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1498719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1499719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a String[] value, or null 1500719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1501c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 1502c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy public String[] getStringArray(@Nullable String key) { 1503719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1504719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1505719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1506719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1507719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1508719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1509719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (String[]) o; 1510719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1511719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "String[]", e); 1512719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1513719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1514719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1515719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1516719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1517719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns the value associated with the given key, or null if 1518719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * no mapping of the desired type exists for the given key or a null 1519719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * value is explicitly associated with the key. 1520719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * 1521719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param key a String, or null 1522719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @return a CharSequence[] value, or null 1523719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1524c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy @Nullable 1525c6a65dff3d9ed3e75f9f4f5abbf24e3d10bdba8bScott Kennedy CharSequence[] getCharSequenceArray(@Nullable String key) { 1526719e6b167041ffaffc2245f692714c8de191863fCraig Mautner unparcel(); 1527719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Object o = mMap.get(key); 1528719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (o == null) { 1529719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1530719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1531719e6b167041ffaffc2245f692714c8de191863fCraig Mautner try { 1532719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return (CharSequence[]) o; 1533719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } catch (ClassCastException e) { 1534719e6b167041ffaffc2245f692714c8de191863fCraig Mautner typeWarning(key, o, "CharSequence[]", e); 1535719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1536719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1537719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1538719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1539719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1540719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Writes the Bundle contents to a Parcel, typically in order for 1541719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * it to be passed through an IBinder connection. 1542719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param parcel The parcel to copy this bundle to. 1543719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1544719e6b167041ffaffc2245f692714c8de191863fCraig Mautner void writeToParcelInner(Parcel parcel, int flags) { 15454501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki // If the parcel has a read-write helper, we can't just copy the blob, so unparcel it first. 15464501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki if (parcel.hasReadWriteHelper()) { 15474501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki unparcel(); 15484501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } 15493cefe6a991ba650375e663e7095266e2273d2372Samuel Tan // Keep implementation in sync with writeToParcel() in 15503cefe6a991ba650375e663e7095266e2273d2372Samuel Tan // frameworks/native/libs/binder/PersistableBundle.cpp. 1551694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani final ArrayMap<String, Object> map; 1552d8e877d27d8e5a87446b9e1030325edad268d9e3Dianne Hackborn synchronized (this) { 1553694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani // unparcel() can race with this method and cause the parcel to recycle 1554694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani // at the wrong time. So synchronize access the mParcelledData's content. 1555694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani if (mParcelledData != null) { 1556694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani if (mParcelledData == NoImagePreloadHolder.EMPTY_PARCEL) { 1557694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani parcel.writeInt(0); 1558694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani } else { 1559694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani int length = mParcelledData.dataSize(); 1560694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani parcel.writeInt(length); 15616bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki parcel.writeInt(mParcelledByNative ? BUNDLE_MAGIC_NATIVE : BUNDLE_MAGIC); 1562694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani parcel.appendFrom(mParcelledData, 0, length); 1563694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani } 1564719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return; 1565719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1566694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani map = mMap; 1567694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani } 1568694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani 1569694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani // Special case for empty bundles. 1570694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani if (map == null || map.size() <= 0) { 1571694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani parcel.writeInt(0); 1572694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani return; 1573719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1574694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani int lengthPos = parcel.dataPosition(); 1575694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani parcel.writeInt(-1); // dummy, will hold length 1576694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani parcel.writeInt(BUNDLE_MAGIC); 1577694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani 1578694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani int startPos = parcel.dataPosition(); 1579694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani parcel.writeArrayMapInternal(map); 1580694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani int endPos = parcel.dataPosition(); 1581694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani 1582694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani // Backpatch length 1583694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani parcel.setDataPosition(lengthPos); 1584694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani int length = endPos - startPos; 1585694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani parcel.writeInt(length); 1586694753465b577509cecba33a90fb7cb6d50f5533Amith Yamasani parcel.setDataPosition(endPos); 1587719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1588719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1589719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1590719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Reads the Parcel contents into this Bundle, typically in order for 1591719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * it to be passed through an IBinder connection. 1592719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * @param parcel The parcel to overwrite this bundle from. 1593719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1594719e6b167041ffaffc2245f692714c8de191863fCraig Mautner void readFromParcelInner(Parcel parcel) { 15953cefe6a991ba650375e663e7095266e2273d2372Samuel Tan // Keep implementation in sync with readFromParcel() in 15963cefe6a991ba650375e663e7095266e2273d2372Samuel Tan // frameworks/native/libs/binder/PersistableBundle.cpp. 1597719e6b167041ffaffc2245f692714c8de191863fCraig Mautner int length = parcel.readInt(); 1598719e6b167041ffaffc2245f692714c8de191863fCraig Mautner readFromParcelInner(parcel, length); 1599719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1600719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1601719e6b167041ffaffc2245f692714c8de191863fCraig Mautner private void readFromParcelInner(Parcel parcel, int length) { 16021619ed4706a0bf906d967ab7987cd4c475ac3462Adam Lesinski if (length < 0) { 16031619ed4706a0bf906d967ab7987cd4c475ac3462Adam Lesinski throw new RuntimeException("Bad length in parcel: " + length); 16041619ed4706a0bf906d967ab7987cd4c475ac3462Adam Lesinski 16051619ed4706a0bf906d967ab7987cd4c475ac3462Adam Lesinski } else if (length == 0) { 1606719e6b167041ffaffc2245f692714c8de191863fCraig Mautner // Empty Bundle or end of data. 160752764cba5968888180ceedf717d85e08ffd747ccAndreas Gampe mParcelledData = NoImagePreloadHolder.EMPTY_PARCEL; 16086bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki mParcelledByNative = false; 1609719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return; 1610719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 16111619ed4706a0bf906d967ab7987cd4c475ac3462Adam Lesinski 1612d136e51a99df5275eaafdde407e89e78c02b829bJeff Sharkey final int magic = parcel.readInt(); 16136bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki final boolean isJavaBundle = magic == BUNDLE_MAGIC; 16146bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki final boolean isNativeBundle = magic == BUNDLE_MAGIC_NATIVE; 16156bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki if (!isJavaBundle && !isNativeBundle) { 1616719e6b167041ffaffc2245f692714c8de191863fCraig Mautner throw new IllegalStateException("Bad magic number for Bundle: 0x" 1617719e6b167041ffaffc2245f692714c8de191863fCraig Mautner + Integer.toHexString(magic)); 1618719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1619719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 16204501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki if (parcel.hasReadWriteHelper()) { 16214501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki // If the parcel has a read-write helper, then we can't lazily-unparcel it, so just 16224501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki // unparcel right away. 16234501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki synchronized (this) { 16246bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki initializeFromParcelLocked(parcel, /*recycleParcel=*/ false, isNativeBundle); 16254501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } 16264501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki return; 16274501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki } 16284501c61d65f0590bdc4e6a8a6f3a1b0cf2165b9fMakoto Onuki 1629719e6b167041ffaffc2245f692714c8de191863fCraig Mautner // Advance within this Parcel 1630719e6b167041ffaffc2245f692714c8de191863fCraig Mautner int offset = parcel.dataPosition(); 16311619ed4706a0bf906d967ab7987cd4c475ac3462Adam Lesinski parcel.setDataPosition(MathUtils.addOrThrow(offset, length)); 1632719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1633719e6b167041ffaffc2245f692714c8de191863fCraig Mautner Parcel p = Parcel.obtain(); 1634719e6b167041ffaffc2245f692714c8de191863fCraig Mautner p.setDataPosition(0); 1635719e6b167041ffaffc2245f692714c8de191863fCraig Mautner p.appendFrom(parcel, offset, length); 1636983055231b999e450def3e3df377fb4e23420711Dianne Hackborn p.adoptClassCookies(parcel); 1637719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (DEBUG) Log.d(TAG, "Retrieving " + Integer.toHexString(System.identityHashCode(this)) 1638719e6b167041ffaffc2245f692714c8de191863fCraig Mautner + ": " + length + " bundle bytes starting at " + offset); 1639719e6b167041ffaffc2245f692714c8de191863fCraig Mautner p.setDataPosition(0); 1640719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1641719e6b167041ffaffc2245f692714c8de191863fCraig Mautner mParcelledData = p; 16426bdd4aca964d5d9a18fb66d926330f4296643ab4Makoto Onuki mParcelledByNative = isNativeBundle; 1643719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1644a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey 1645a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey /** {@hide} */ 1646a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey public static void dumpStats(IndentingPrintWriter pw, String key, Object value) { 1647a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey final Parcel tmp = Parcel.obtain(); 1648a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey tmp.writeValue(value); 1649a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey final int size = tmp.dataPosition(); 1650a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey tmp.recycle(); 1651a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey 1652a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey // We only really care about logging large values 1653a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey if (size > 1024) { 1654a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey pw.println(key + " [size=" + size + "]"); 1655a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey if (value instanceof BaseBundle) { 1656a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey dumpStats(pw, (BaseBundle) value); 1657a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey } else if (value instanceof SparseArray) { 1658a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey dumpStats(pw, (SparseArray) value); 1659a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey } 1660a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey } 1661a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey } 1662a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey 1663a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey /** {@hide} */ 1664a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey public static void dumpStats(IndentingPrintWriter pw, SparseArray array) { 1665a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey pw.increaseIndent(); 1666a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey if (array == null) { 1667a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey pw.println("[null]"); 1668a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey return; 1669a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey } 1670a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey for (int i = 0; i < array.size(); i++) { 1671a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey dumpStats(pw, "0x" + Integer.toHexString(array.keyAt(i)), array.valueAt(i)); 1672a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey } 1673a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey pw.decreaseIndent(); 1674a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey } 1675a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey 1676a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey /** {@hide} */ 1677a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey public static void dumpStats(IndentingPrintWriter pw, BaseBundle bundle) { 1678a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey pw.increaseIndent(); 1679a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey if (bundle == null) { 1680a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey pw.println("[null]"); 1681a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey return; 1682a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey } 1683a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey final ArrayMap<String, Object> map = bundle.getMap(); 1684a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey for (int i = 0; i < map.size(); i++) { 1685a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey dumpStats(pw, map.keyAt(i), map.valueAt(i)); 1686a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey } 1687a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey pw.decreaseIndent(); 1688a6bfeae2950c5a000ec1bd1d60e5e90b3133aba4Jeff Sharkey } 1689719e6b167041ffaffc2245f692714c8de191863fCraig Mautner} 1690