ShadowParcel.java revision 8f9c1466f3d1d10bc50a57f13f19aded7c63c388
1package com.xtremelabs.robolectric.shadows;
2
3import android.os.Parcel;
4import android.os.Parcelable;
5import android.os.Bundle;
6import com.xtremelabs.robolectric.Robolectric;
7import com.xtremelabs.robolectric.internal.Implementation;
8import com.xtremelabs.robolectric.internal.Implements;
9import com.xtremelabs.robolectric.internal.RealObject;
10
11import java.util.ArrayList;
12import java.util.List;
13
14@Implements(Parcel.class)
15@SuppressWarnings("unchecked")
16public class ShadowParcel {
17    private final ArrayList parcelData = new ArrayList();
18    private int index = 0;
19
20    @RealObject
21    private Parcel realParcel;
22
23    @Implementation
24    public static Parcel obtain() {
25        return Robolectric.newInstanceOf(Parcel.class);
26    }
27
28    @Implementation
29    public void writeString(String str) {
30        parcelData.add(str);
31    }
32
33    @Implementation
34    public void writeInt(int i) {
35        parcelData.add(i);
36    }
37
38    @Implementation
39    public void writeLong(long i) {
40        parcelData.add(i);
41    }
42
43    @Implementation
44    public void writeFloat(float f) {
45        parcelData.add(f);
46    }
47
48    @Implementation
49    public void writeDouble(double f) {
50        parcelData.add(f);
51    }
52
53    public void writeBoolean(boolean b) {
54        parcelData.add(b);
55    }
56
57    public void writeChar(char b) {
58        parcelData.add(b);
59    }
60
61    @Implementation
62    @SuppressWarnings("unchecked")
63    public void writeByte(byte b) {
64        parcelData.add(b);
65    }
66
67    @Implementation
68    public String readString() {
69        return index < parcelData.size() ? (String) parcelData.get(index++) : null;
70    }
71
72    @Implementation
73    public int readInt() {
74        return index < parcelData.size() ? (Integer) parcelData.get(index++) : 0;
75    }
76
77    @Implementation
78    public float readFloat() {
79        return index < parcelData.size() ? (Float) parcelData.get(index++) : 0;
80    }
81
82    @Implementation
83    public double readDouble() {
84        return index < parcelData.size() ? (Double) parcelData.get(index++) : 0;
85    }
86
87    @Implementation
88    public byte readByte() {
89        return index < parcelData.size() ? (Byte) parcelData.get(index++) : 0;
90    }
91
92    public boolean readBoolean() {
93        return index < parcelData.size() ? (Boolean) parcelData.get(index++) : false;
94    }
95
96    public char readChar() {
97        return index < parcelData.size() ? (Character) parcelData.get(index++) : 0;
98    }
99
100    @Implementation
101    public long readLong() {
102        return index < parcelData.size() ? (Long) parcelData.get(index++) : 0;
103    }
104
105    @Implementation
106    public Bundle readBundle() {
107        return index < parcelData.size() ? (Bundle) parcelData.get(index++) : null;
108    }
109
110    @Implementation
111    public Bundle readBundle(ClassLoader loader) {
112        return readBundle();
113    }
114
115    @Implementation
116    public void writeBundle(Bundle bundle) {
117        parcelData.add(bundle);
118    }
119
120    @Implementation
121    public void writeParcelable(Parcelable p, int flags) {
122        parcelData.add(p);
123    }
124
125    @Implementation
126    public Parcelable readParcelable(ClassLoader cl) {
127        return index < parcelData.size() ? (Parcelable) parcelData.get(index++) : null;
128    }
129
130    @Implementation
131    public void readBooleanArray(boolean[] val) {
132        int n = readInt();
133        if (val.length != n) throw new RuntimeException("bad array lengths");
134        for (int i = 0; i < val.length; i++) {
135            val[i] = readBoolean();
136        }
137    }
138
139    @Implementation
140    public void writeBooleanArray(boolean[] val) {
141        if (val == null) {
142            writeInt(-1);
143            return;
144        }
145        writeInt(val.length);
146        for (boolean b : val) writeBoolean(b);
147    }
148
149    @Implementation
150    public boolean[] createBooleanArray() {
151        int n = readInt();
152        if (n < 0) {
153            return null;
154        }
155        boolean[] val = new boolean[n];
156        for (int i = 0; i < val.length; i++) {
157            val[i] = readBoolean();
158        }
159        return val;
160    }
161
162    @Implementation
163    public void readCharArray(char[] val) {
164        int n = readInt();
165        if (val.length != n) throw new RuntimeException("bad array lengths");
166        for (int i = 0; i < val.length; i++) {
167            val[i] = readChar();
168        }
169    }
170
171    @Implementation
172    public void writeCharArray(char[] val) {
173        if (val == null) {
174            writeInt(-1);
175            return;
176        }
177        writeInt(val.length);
178        for (char b : val) writeChar(b);
179    }
180
181    @Implementation
182    public char[] createCharArray() {
183        int n = readInt();
184        if (n < 0) {
185            return null;
186        }
187        char[] val = new char[n];
188        for (int i = 0; i < val.length; i++) {
189            val[i] = readChar();
190        }
191        return val;
192    }
193
194    @Implementation
195    public void readFloatArray(float[] val) {
196        int n = readInt();
197        if (val.length != n) throw new RuntimeException("bad array lengths");
198        for (int i = 0; i < val.length; i++) {
199            val[i] = readFloat();
200        }
201    }
202
203    @Implementation
204    public void writeFloatArray(float[] val) {
205        if (val == null) {
206            writeInt(-1);
207            return;
208        }
209        writeInt(val.length);
210        for (float f : val) writeFloat(f);
211    }
212
213    @Implementation
214    public float[] createFloatArray() {
215        int n = readInt();
216        if (n < 0) {
217            return null;
218        }
219        float[] val = new float[n];
220        for (int i = 0; i < val.length; i++) {
221            val[i] = readFloat();
222        }
223        return val;
224    }
225
226    @Implementation
227    public void writeDoubleArray(double[] val) {
228        if (val == null) {
229            writeInt(-1);
230            return;
231        }
232        writeInt(val.length);
233        for (double f : val) writeDouble(f);
234    }
235
236    @Implementation
237    public void readDoubleArray(double[] val) {
238        int n = readInt();
239        if (val.length != n) throw new RuntimeException("bad array lengths");
240        for (int i = 0; i < val.length; i++) {
241            val[i] = readDouble();
242        }
243    }
244
245    @Implementation
246    public double[] createDoubleArray() {
247        int n = readInt();
248        if (n < 0) {
249            return null;
250        }
251        double[] val = new double[n];
252        for (int i = 0; i < val.length; i++) {
253            val[i] = readDouble();
254        }
255        return val;
256    }
257
258    @Implementation
259    public void writeIntArray(int[] val) {
260        if (val == null) {
261            writeInt(-1);
262            return;
263        }
264        writeInt(val.length);
265        for (int f : val) writeInt(f);
266    }
267
268    @Implementation
269    public void readIntArray(int[] val) {
270        int n = readInt();
271        if (val.length != n) throw new RuntimeException("bad array lengths");
272        for (int i = 0; i < val.length; i++) {
273            val[i] = readInt();
274        }
275    }
276
277    @Implementation
278    public int[] createIntArray() {
279        int n = readInt();
280        if (n < 0) {
281            return null;
282        }
283        int[] val = new int[n];
284        for (int i = 0; i < val.length; i++) {
285            val[i] = readInt();
286        }
287        return val;
288    }
289
290    @Implementation
291    public void writeByteArray(byte[] val) {
292        if (val == null) {
293            writeInt(-1);
294            return;
295        }
296        writeInt(val.length);
297        for (byte f : val) writeByte(f);
298    }
299
300    @Implementation
301    public void readByteArray(byte[] val) {
302        int n = readInt();
303        if (val.length != n) throw new RuntimeException("bad array lengths");
304        for (int i = 0; i < val.length; i++) {
305            val[i] = readByte();
306        }
307    }
308
309    @Implementation
310    public byte[] createByteArray() {
311        int n = readInt();
312        if (n < 0) {
313            return null;
314        }
315        byte[] val = new byte[n];
316        for (int i = 0; i < val.length; i++) {
317            val[i] = readByte();
318        }
319        return val;
320    }
321
322    @Implementation
323    public void writeLongArray(long[] val) {
324        if (val == null) {
325            writeInt(-1);
326            return;
327        }
328        writeInt(val.length);
329        for (long f : val) writeLong(f);
330    }
331
332    @Implementation
333    public void readLongArray(long[] val) {
334        int n = readInt();
335        if (val.length != n) throw new RuntimeException("bad array lengths");
336        for (int i = 0; i < val.length; i++) {
337            val[i] = readLong();
338        }
339    }
340
341    @Implementation
342    public long[] createLongArray() {
343        int n = readInt();
344        if (n < 0) {
345            return null;
346        }
347        long[] val = new long[n];
348        for (int i = 0; i < val.length; i++) {
349            val[i] = readLong();
350        }
351        return val;
352    }
353
354    @Implementation
355    public void writeStringArray(String[] val) {
356        if (val == null) {
357            writeInt(-1);
358            return;
359        }
360        writeInt(val.length);
361        for (String f : val) writeString(f);
362    }
363
364    @Implementation
365    public String[] createStringArray() {
366        String[] array = null;
367
368        int length = readInt();
369        if (length >= 0) {
370            array = new String[length];
371            for (int i = 0; i < length; i++) {
372                array[i] = readString();
373            }
374        }
375        return array;
376    }
377
378    @Implementation
379    public void readStringArray(String[] dest) {
380        int n = readInt();
381        if (dest.length != n) throw new RuntimeException("bad array lengths");
382        for (int i = 0; i < dest.length; i++) {
383            dest[i] = readString();
384        }
385    }
386
387    @Implementation
388    public void writeStringList(List<String> strings) {
389        if (strings == null) {
390            writeInt(-1);
391            return;
392        }
393        int count = strings.size();
394        int i=0;
395        writeInt(count);
396        while (i < count) {
397            writeString(strings.get(i));
398            i++;
399        }
400    }
401
402    @Implementation
403    public void readStringList(List<String> list) {
404        int listSizeBeforeChange = list.size();
405        int addCount = readInt();
406        int i = 0;
407        for (; i < listSizeBeforeChange && i < addCount; i++) {
408            list.set(i, readString());
409        }
410        for (; i<addCount; i++) {
411            list.add(readString());
412        }
413        for (; i<listSizeBeforeChange; i++) {
414            list.remove(addCount);
415        }
416    }
417
418    @Implementation
419    public ArrayList<String> createStringArrayList() {
420        int n = readInt();
421        if (n < 0) {
422            return null;
423        }
424
425        ArrayList<String> l = new ArrayList<String>(n);
426        while (n > 0) {
427            l.add(readString());
428            n--;
429        }
430        return l;
431    }
432
433    @Implementation
434    public ArrayList createTypedArrayList(Parcelable.Creator c) {
435        int n = readInt();
436        if (n < 0) {
437            return null;
438        }
439
440        ArrayList l = new ArrayList(n);
441
442        while (n > 0) {
443            if (readInt() != 0) {
444                l.add(c.createFromParcel(realParcel));
445            } else {
446                l.add(null);
447            }
448            n--;
449        }
450        return l;
451    }
452
453    @Implementation
454    public void writeTypedList(List val) {
455        if (val == null) {
456            writeInt(-1);
457            return;
458        }
459
460        int n = val.size();
461        int i = 0;
462        writeInt(n);
463        while (i < n) {
464            Object item = val.get(i);
465            if (item != null) {
466                writeInt(1);
467                ((Parcelable) item).writeToParcel(realParcel, 0);
468            } else {
469                writeInt(0);
470            }
471            i++;
472        }
473    }
474
475    public int getIndex() {
476        return index;
477    }
478
479    public List getParcelData() {
480        return parcelData;
481    }
482}
483