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