1a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania/*
2a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * Copyright (C) 2009 The Android Open Source Project
3a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania *
4a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * Licensed under the Apache License, Version 2.0 (the "License");
5a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * you may not use this file except in compliance with the License.
6a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * You may obtain a copy of the License at
7a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania *
8a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania *      http://www.apache.org/licenses/LICENSE-2.0
9a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania *
10a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * Unless required by applicable law or agreed to in writing, software
11a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * distributed under the License is distributed on an "AS IS" BASIS,
12a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * See the License for the specific language governing permissions and
14a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * limitations under the License.
15a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania */
16a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
17a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Cataniapackage com.android.mediaframeworktest.unit;
18a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Cataniaimport android.media.Metadata;
19a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Cataniaimport android.os.Parcel;
20a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Cataniaimport android.test.AndroidTestCase;
21a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Cataniaimport android.test.suitebuilder.annotation.SmallTest;
22a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Cataniaimport android.util.Log;
23a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
24cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Cataniaimport java.util.Calendar;
25cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Cataniaimport java.util.Date;
26cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
27a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania/*
28a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * Check the Java layer that parses serialized metadata in Parcel
29a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * works as expected.
30a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania *
31a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania */
32a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
33a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Cataniapublic class MediaPlayerMetadataParserTest extends AndroidTestCase {
34a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    private static final String TAG = "MediaPlayerMetadataTest";
35a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    private static final int kMarker = 0x4d455441;  // 'M' 'E' 'T' 'A'
36a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    private static final int kHeaderSize = 8;
37a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
38a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    private Metadata mMetadata = null;
39a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    private Parcel mParcel = null;
40a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
41a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    @Override
42a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    protected void setUp() throws Exception {
43a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        super.setUp();
44a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mMetadata = new Metadata();
45a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel = Parcel.obtain();
46a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
47a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        resetParcel();
48a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    }
49a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
50a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // Check parsing of the parcel fails. Make sure the parser rewind
51a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // the parcel properly.
52a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    private void assertParseFail() throws Exception {
53a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.setDataPosition(0);
54a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertFalse(mMetadata.parse(mParcel));
55a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertEquals(0, mParcel.dataPosition());
56a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    }
57a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
58c39173be3237be9f39d2b57bb38249126e183c53niko    // Check parsing of the parcel is successful.
59a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    private void assertParse() throws Exception {
60a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.setDataPosition(0);
61a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertTrue(mMetadata.parse(mParcel));
62a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    }
63a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
64a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // Write the number of bytes from the start of the parcel to the
65a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // current position at the beginning of the parcel (offset 0).
66a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    private void adjustSize() {
67a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        adjustSize(0);
68a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    }
69a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
70a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // Write the number of bytes from the offset to the current
71a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // position at position pointed by offset.
72a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    private void adjustSize(int offset) {
73a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        final int pos = mParcel.dataPosition();
74a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
75a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.setDataPosition(offset);
76a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.writeInt(pos - offset);
77a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.setDataPosition(pos);
78a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    }
79a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
80a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // Rewind the parcel and insert the header.
81a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    private void resetParcel() {
82a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.setDataPosition(0);
83a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        // Most tests will use a properly formed parcel with a size
84a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        // and the meta marker so we add them by default.
85a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.writeInt(-1);  // Placeholder for the size
86a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.writeInt(kMarker);
87a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    }
88a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
89a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // ----------------------------------------------------------------------
90a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // START OF THE TESTS
91a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
92a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
93a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // There should be at least 8 bytes in the parcel, 4 for the size
94a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // and 4 for the 'M' 'E' 'T' 'A' marker.
95a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    @SmallTest
96a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    public void testMissingSizeAndMarker() throws Exception {
97a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        for (int i = 0; i < kHeaderSize; ++i) {
98a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania            mParcel.setDataPosition(0);
99a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania            mParcel.setDataSize(i);
100a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
101a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania            assertEquals(i, mParcel.dataAvail());
102a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania            assertParseFail();
103a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        }
104a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    }
105a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
106a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // There should be at least 'size' bytes in the parcel.
107a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    @SmallTest
108a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    public void testMissingData() throws Exception {
109a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        final int size = 20;
110a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
111a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.writeInt(size);
112a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.setDataSize(size - 1);
113a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertParseFail();
114a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    }
115a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
116a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // Empty parcel is fine
117a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    @SmallTest
118a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    public void testEmptyIsOk() throws Exception {
119a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        adjustSize();
120a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertParse();
121a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    }
122a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
123cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // ----------------------------------------------------------------------
124a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // RECORDS
125cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // ----------------------------------------------------------------------
126a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
127a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // A record header should be at least 12 bytes long
128a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    @SmallTest
129a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    public void testRecordMissingId() throws Exception {
130a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.writeInt(13); // record length
131a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        // misses metadata id and metadata type.
132a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        adjustSize();
133a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertParseFail();
134a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    }
135a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
136a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    @SmallTest
137a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    public void testRecordMissingType() throws Exception {
138a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.writeInt(13); // record length lies
139a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.writeInt(Metadata.TITLE);
140a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        // misses metadata type
141a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        adjustSize();
142a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertParseFail();
143a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    }
144a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
145a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    @SmallTest
146a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    public void testRecordWithZeroPayload() throws Exception {
147a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.writeInt(0);
148a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        adjustSize();
149a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertParseFail();
150a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    }
151a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
152a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // A record cannot be empty.
153a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    @SmallTest
154a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    public void testRecordMissingPayload() throws Exception {
155a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.writeInt(12);
156a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.writeInt(Metadata.TITLE);
157a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.writeInt(Metadata.STRING_VAL);
158a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        // misses payload
159a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        adjustSize();
160a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertParseFail();
161a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    }
162a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
163a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // Check records can be found.
164a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    @SmallTest
165a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    public void testRecordsFound() throws Exception {
166a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        writeStringRecord(Metadata.TITLE, "a title");
167a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        writeStringRecord(Metadata.GENRE, "comedy");
168a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        writeStringRecord(Metadata.firstCustomId(), "custom");
169a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        adjustSize();
170a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertParse();
171a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertTrue(mMetadata.has(Metadata.TITLE));
172a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertTrue(mMetadata.has(Metadata.GENRE));
173a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertTrue(mMetadata.has(Metadata.firstCustomId()));
174a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertFalse(mMetadata.has(Metadata.DRM_CRIPPLED));
175a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertEquals(3, mMetadata.keySet().size());
176a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    }
177a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
178a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // Detects bad metadata type
179a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    @SmallTest
180a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    public void testBadMetadataType() throws Exception {
181a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        final int start = mParcel.dataPosition();
182a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.writeInt(-1);  // Placeholder for the length
183a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.writeInt(Metadata.TITLE);
184a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.writeInt(0);  // Invalid type.
185a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        mParcel.writeString("dummy");
186a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        adjustSize(start);
187a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
188a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        adjustSize();
189a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertParseFail();
190a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    }
191a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
192a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // Check a Metadata instance can be reused, i.e the parse method
193a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    // wipes out the existing states/keys.
194a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    @SmallTest
195a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    public void testParseClearState() throws Exception {
196a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        writeStringRecord(Metadata.TITLE, "a title");
197a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        writeStringRecord(Metadata.GENRE, "comedy");
198a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        writeStringRecord(Metadata.firstCustomId(), "custom");
199a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        adjustSize();
200a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertParse();
201a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
202a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        resetParcel();
203a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        writeStringRecord(Metadata.MIME_TYPE, "audio/mpg");
204a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        adjustSize();
205a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertParse();
206a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
207a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        // Only the mime type metadata should be present.
208a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertEquals(1, mMetadata.keySet().size());
209a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertTrue(mMetadata.has(Metadata.MIME_TYPE));
210a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania
211a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertFalse(mMetadata.has(Metadata.TITLE));
212a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertFalse(mMetadata.has(Metadata.GENRE));
213a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania        assertFalse(mMetadata.has(Metadata.firstCustomId()));
214a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania    }
215cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
216cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // ----------------------------------------------------------------------
217cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // GETTERS
218cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // ----------------------------------------------------------------------
219cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
220cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // getString
221cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    @SmallTest
222cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    public void testGetString() throws Exception {
223cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        writeStringRecord(Metadata.TITLE, "a title");
224cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        writeStringRecord(Metadata.GENRE, "comedy");
225cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize();
226cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertParse();
227cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
228cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertEquals("a title", mMetadata.getString(Metadata.TITLE));
229cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertEquals("comedy", mMetadata.getString(Metadata.GENRE));
230cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
231cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
232cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // get an empty string.
233cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    @SmallTest
234cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    public void testGetEmptyString() throws Exception {
235cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        writeStringRecord(Metadata.TITLE, "");
236cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize();
237cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertParse();
238cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
239cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertEquals("", mMetadata.getString(Metadata.TITLE));
240cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
241cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
242cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // get a string when a NULL value was in the parcel
243cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    @SmallTest
244cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    public void testGetNullString() throws Exception {
245cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        writeStringRecord(Metadata.TITLE, null);
246cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize();
247cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertParse();
248cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
249cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertEquals(null, mMetadata.getString(Metadata.TITLE));
250cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
251cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
252cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // get a string when an integer is actually present
253cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    @SmallTest
254cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    public void testWrongType() throws Exception {
255cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        writeIntRecord(Metadata.DURATION, 5);
256cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize();
257cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertParse();
258cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
259cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        try {
260cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania            mMetadata.getString(Metadata.DURATION);
261cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        } catch (IllegalStateException ise) {
262cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania            return;
263cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        }
264cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        fail("Exception was not thrown");
265cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
266cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
267cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // getInt
268cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    @SmallTest
269cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    public void testGetInt() throws Exception {
270cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        writeIntRecord(Metadata.CD_TRACK_NUM, 1);
271cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize();
272cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertParse();
273cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
274cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertEquals(1, mMetadata.getInt(Metadata.CD_TRACK_NUM));
275cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
276cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
277cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // getBoolean
278cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    @SmallTest
279cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    public void testGetBoolean() throws Exception {
2801e1b13e62e38d6efc7cef4b496b3119bd45ee2c2Gloria Wang        writeBooleanRecord(Metadata.PAUSE_AVAILABLE, true);
2811e1b13e62e38d6efc7cef4b496b3119bd45ee2c2Gloria Wang        writeBooleanRecord(Metadata.SEEK_AVAILABLE, true);
2821e1b13e62e38d6efc7cef4b496b3119bd45ee2c2Gloria Wang        writeBooleanRecord(Metadata.SEEK_BACKWARD_AVAILABLE, true);
2831e1b13e62e38d6efc7cef4b496b3119bd45ee2c2Gloria Wang        writeBooleanRecord(Metadata.SEEK_FORWARD_AVAILABLE, true);
284cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize();
285cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertParse();
286cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
2871e1b13e62e38d6efc7cef4b496b3119bd45ee2c2Gloria Wang        assertEquals(true, mMetadata.getBoolean(Metadata.PAUSE_AVAILABLE));
2881e1b13e62e38d6efc7cef4b496b3119bd45ee2c2Gloria Wang        assertEquals(true, mMetadata.getBoolean(Metadata.SEEK_AVAILABLE));
2891e1b13e62e38d6efc7cef4b496b3119bd45ee2c2Gloria Wang        assertEquals(true, mMetadata.getBoolean(Metadata.SEEK_BACKWARD_AVAILABLE));
2901e1b13e62e38d6efc7cef4b496b3119bd45ee2c2Gloria Wang        assertEquals(true, mMetadata.getBoolean(Metadata.SEEK_FORWARD_AVAILABLE));
291cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
292cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
293cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // getLong
294cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    @SmallTest
295cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    public void testGetLong() throws Exception {
296cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        writeLongRecord(Metadata.DURATION, 1L);
297cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize();
298cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertParse();
299cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
300cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertEquals(1L, mMetadata.getLong(Metadata.DURATION));
301cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
302cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
303cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // getDouble
304cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    @SmallTest
305cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    public void testGetDouble() throws Exception {
306cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        writeDoubleRecord(Metadata.VIDEO_FRAME_RATE, 29.97);
307cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize();
308cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertParse();
309cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
310cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertEquals(29.97, mMetadata.getDouble(Metadata.VIDEO_FRAME_RATE));
311cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
312cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
313cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // getByteArray
314cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    @SmallTest
315cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    public void testGetByteArray() throws Exception {
316cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        byte data[] = new byte[]{1,2,3,4,5};
317cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
318cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        writeByteArrayRecord(Metadata.ALBUM_ART, data);
319cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize();
320cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertParse();
321cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
322cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        byte res[] = mMetadata.getByteArray(Metadata.ALBUM_ART);
323cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        for (int i = 0; i < data.length; ++i) {
324cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania            assertEquals(data[i], res[i]);
325cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        }
326cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
327cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
328cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // getDate
329cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    @SmallTest
330cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    public void testGetDate() throws Exception {
331cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        writeDateRecord(Metadata.DATE, 0, "PST");
332cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize();
333cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertParse();
334cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
335cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        assertEquals(new Date(0), mMetadata.getDate(Metadata.DATE));
336cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
337cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
338cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // ----------------------------------------------------------------------
339cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // HELPERS TO APPEND RECORDS
340cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // ----------------------------------------------------------------------
341cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
342cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // Insert a string record at the current position.
343cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    private void writeStringRecord(int metadataId, String val) {
344cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        final int start = mParcel.dataPosition();
345cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(-1);  // Placeholder for the length
346cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(metadataId);
347cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(Metadata.STRING_VAL);
348cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeString(val);
349cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize(start);
350cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
351cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
352cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // Insert an int record at the current position.
353cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    private void writeIntRecord(int metadataId, int val) {
354cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        final int start = mParcel.dataPosition();
355cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(-1);  // Placeholder for the length
356cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(metadataId);
357cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(Metadata.INTEGER_VAL);
358cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(val);
359cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize(start);
360cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
361cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
362cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // Insert a boolean record at the current position.
363cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    private void writeBooleanRecord(int metadataId, boolean val) {
364cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        final int start = mParcel.dataPosition();
365cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(-1);  // Placeholder for the length
366cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(metadataId);
367cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(Metadata.BOOLEAN_VAL);
368cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(val ? 1 : 0);
369cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize(start);
370cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
371cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
372cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // Insert a Long record at the current position.
373cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    private void writeLongRecord(int metadataId, long val) {
374cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        final int start = mParcel.dataPosition();
375cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(-1);  // Placeholder for the length
376cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(metadataId);
377cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(Metadata.LONG_VAL);
378cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeLong(val);
379cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize(start);
380cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
381cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
382cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // Insert a Double record at the current position.
383cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    private void writeDoubleRecord(int metadataId, double val) {
384cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        final int start = mParcel.dataPosition();
385cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(-1);  // Placeholder for the length
386cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(metadataId);
387cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(Metadata.DOUBLE_VAL);
388cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeDouble(val);
389cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize(start);
390cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
391cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
392cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // Insert a ByteArray record at the current position.
393cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    private void writeByteArrayRecord(int metadataId, byte[] val) {
394cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        final int start = mParcel.dataPosition();
395cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(-1);  // Placeholder for the length
396cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(metadataId);
397cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(Metadata.BYTE_ARRAY_VAL);
398cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeByteArray(val);
399cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize(start);
400cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
401cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania
402cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    // Insert a Date record at the current position.
403cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    private void writeDateRecord(int metadataId, long time, String tz) {
404cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        final int start = mParcel.dataPosition();
405cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(-1);  // Placeholder for the length
406cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(metadataId);
407cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeInt(Metadata.DATE_VAL);
408cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeLong(time);
409cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        mParcel.writeString(tz);
410cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania        adjustSize(start);
411cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania    }
412a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania}
413