1dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber/*
2dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Copyright (C) 2016 The Android Open Source Project
3dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *
4dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * you may not use this file except in compliance with the License.
6dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * You may obtain a copy of the License at
7dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *
8dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *
10dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Unless required by applicable law or agreed to in writing, software
11dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * See the License for the specific language governing permissions and
14dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * limitations under the License.
15dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber */
16dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
17dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberpackage android.os;
18dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
19e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Morelandimport android.annotation.IntDef;
20e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Morelandimport android.annotation.SystemApi;
21ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
22dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberimport libcore.util.NativeAllocationRegistry;
23dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
24e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Morelandimport java.lang.annotation.Retention;
25e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Morelandimport java.lang.annotation.RetentionPolicy;
26e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Morelandimport java.util.ArrayList;
27e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Morelandimport java.util.Arrays;
28e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland
29dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber/** @hide */
30e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland@SystemApi
31dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberpublic class HwParcel {
32dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    private static final String TAG = "HwParcel";
33dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
34e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    @IntDef(prefix = { "STATUS_" }, value = {
35e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland        STATUS_SUCCESS,
36e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    })
37e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    @Retention(RetentionPolicy.SOURCE)
38e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    public @interface Status {}
39e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland
40e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
41e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Success return error for a transaction. Written to parcels
42e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * using writeStatus.
43e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
44dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public static final int STATUS_SUCCESS      = 0;
45dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
46dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    private static final NativeAllocationRegistry sNativeRegistry;
47dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
48dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    private HwParcel(boolean allocate) {
49dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        native_setup(allocate);
50dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
51dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        sNativeRegistry.registerNativeAllocation(
52dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                this,
53dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                mNativeContext);
54dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
55dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
56e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
57e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Creates an initialized and empty parcel.
58e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
59dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public HwParcel() {
60dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        native_setup(true /* allocate */);
61dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
62dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        sNativeRegistry.registerNativeAllocation(
63dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                this,
64dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                mNativeContext);
65dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
66dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
67e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
68e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes an interface token into the parcel used to verify that
69e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * a transaction has made it to the write type of interface.
70e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     *
71e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param interfaceName fully qualified name of interface message
72e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     *     is being sent to.
73e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
74dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final void writeInterfaceToken(String interfaceName);
75e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
76e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes a boolean value to the end of the parcel.
77e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val to write
78e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
7986635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    public native final void writeBool(boolean val);
80e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
81e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes a byte value to the end of the parcel.
82e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val to write
83e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
84dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final void writeInt8(byte val);
85e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
86e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes a short value to the end of the parcel.
87e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val to write
88e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
89dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final void writeInt16(short val);
90e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
91e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes a int value to the end of the parcel.
92e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val to write
93e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
94dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final void writeInt32(int val);
95e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
96e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes a long value to the end of the parcel.
97e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val to write
98e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
99dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final void writeInt64(long val);
100e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
101e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes a float value to the end of the parcel.
102e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val to write
103e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
104dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final void writeFloat(float val);
105e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
106e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes a double value to the end of the parcel.
107e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val to write
108e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
109dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final void writeDouble(double val);
110e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
111e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes a String value to the end of the parcel.
112e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     *
113e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Note, this will be converted to UTF-8 when it is written.
114e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     *
115e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val to write
116e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
117dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final void writeString(String val);
118dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
119e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
120e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes an array of boolean values to the end of the parcel.
121e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val to write
122e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
123ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    private native final void writeBoolVector(boolean[] val);
124e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
125e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes an array of byte values to the end of the parcel.
126e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val to write
127e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
128ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    private native final void writeInt8Vector(byte[] val);
129e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
130e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes an array of short values to the end of the parcel.
131e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val to write
132e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
133ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    private native final void writeInt16Vector(short[] val);
134e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
135e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes an array of int values to the end of the parcel.
136e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val to write
137e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
138ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    private native final void writeInt32Vector(int[] val);
139e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
140e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes an array of long values to the end of the parcel.
141e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val to write
142e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
143ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    private native final void writeInt64Vector(long[] val);
144e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
145e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes an array of float values to the end of the parcel.
146e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val to write
147e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
148ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    private native final void writeFloatVector(float[] val);
149e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
150e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes an array of double values to the end of the parcel.
151e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val to write
152e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
153ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    private native final void writeDoubleVector(double[] val);
154e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
155e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Writes an array of String values to the end of the parcel.
156e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     *
157e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Note, these will be converted to UTF-8 as they are written.
158e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     *
159e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val to write
160e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
161ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    private native final void writeStringVector(String[] val);
162ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
163e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
164e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Helper method to write a list of Booleans to val.
165e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val list to write
166e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
167ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    public final void writeBoolVector(ArrayList<Boolean> val) {
168ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        final int n = val.size();
169ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        boolean[] array = new boolean[n];
170ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        for (int i = 0; i < n; ++i) {
171ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber            array[i] = val.get(i);
172ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        }
173ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
174ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        writeBoolVector(array);
175ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    }
176ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
177e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
178e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Helper method to write a list of Booleans to the end of the parcel.
179e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val list to write
180e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
181ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    public final void writeInt8Vector(ArrayList<Byte> val) {
182ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        final int n = val.size();
183ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        byte[] array = new byte[n];
184ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        for (int i = 0; i < n; ++i) {
185ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber            array[i] = val.get(i);
186ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        }
187ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
188ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        writeInt8Vector(array);
189ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    }
190ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
191e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
192e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Helper method to write a list of Shorts to the end of the parcel.
193e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val list to write
194e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
195ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    public final void writeInt16Vector(ArrayList<Short> val) {
196ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        final int n = val.size();
197ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        short[] array = new short[n];
198ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        for (int i = 0; i < n; ++i) {
199ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber            array[i] = val.get(i);
200ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        }
201ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
202ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        writeInt16Vector(array);
203ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    }
204ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
205e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
206e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Helper method to write a list of Integers to the end of the parcel.
207e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val list to write
208e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
209ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    public final void writeInt32Vector(ArrayList<Integer> val) {
210ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        final int n = val.size();
211ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        int[] array = new int[n];
212ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        for (int i = 0; i < n; ++i) {
213ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber            array[i] = val.get(i);
214ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        }
215ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
216ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        writeInt32Vector(array);
217ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    }
218ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
219e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
220e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Helper method to write a list of Longs to the end of the parcel.
221e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val list to write
222e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
223ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    public final void writeInt64Vector(ArrayList<Long> val) {
224ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        final int n = val.size();
225ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        long[] array = new long[n];
226ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        for (int i = 0; i < n; ++i) {
227ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber            array[i] = val.get(i);
228ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        }
229ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
230ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        writeInt64Vector(array);
231ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    }
232ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
233e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
234e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Helper method to write a list of Floats to the end of the parcel.
235e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val list to write
236e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
237ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    public final void writeFloatVector(ArrayList<Float> val) {
238ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        final int n = val.size();
239ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        float[] array = new float[n];
240ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        for (int i = 0; i < n; ++i) {
241ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber            array[i] = val.get(i);
242ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        }
243ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
244ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        writeFloatVector(array);
245ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    }
246ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
247e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
248e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Helper method to write a list of Doubles to the end of the parcel.
249e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val list to write
250e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
251ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    public final void writeDoubleVector(ArrayList<Double> val) {
252ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        final int n = val.size();
253ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        double[] array = new double[n];
254ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        for (int i = 0; i < n; ++i) {
255ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber            array[i] = val.get(i);
256ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        }
257ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
258ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        writeDoubleVector(array);
259ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    }
260ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
261e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
262e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Helper method to write a list of Strings to the end of the parcel.
263e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param val list to write
264e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
265ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    public final void writeStringVector(ArrayList<String> val) {
266ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        writeStringVector(val.toArray(new String[val.size()]));
267ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    }
268dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
269e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
270e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Write a hwbinder object to the end of the parcel.
271e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param binder value to write
272e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
273dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final void writeStrongBinder(IHwBinder binder);
274dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
275e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
276e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Checks to make sure that the interface name matches the name written by the parcel
277e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * sender by writeInterfaceToken
278e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     *
279e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws SecurityException interface doesn't match
280e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
281dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final void enforceInterface(String interfaceName);
282e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland
283e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
284e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads a boolean value from the current location in the parcel.
285e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return value parsed from the parcel
286e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
287e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
28886635bb45ee1ddeb3059a8a925659964c7858cc3Andreas Huber    public native final boolean readBool();
289e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
290e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads a byte value from the current location in the parcel.
291e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return value parsed from the parcel
292e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
293e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
294dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final byte readInt8();
295e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
296e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads a short value from the current location in the parcel.
297e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return value parsed from the parcel
298e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
299e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
300dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final short readInt16();
301e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
302e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads a int value from the current location in the parcel.
303e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return value parsed from the parcel
304e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
305e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
306dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final int readInt32();
307e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
308e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads a long value from the current location in the parcel.
309e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return value parsed from the parcel
310e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
311e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
312dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final long readInt64();
313e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
314e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads a float value from the current location in the parcel.
315e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return value parsed from the parcel
316e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
317e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
318dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final float readFloat();
319e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
320e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads a double value from the current location in the parcel.
321e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return value parsed from the parcel
322e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
323e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
324dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final double readDouble();
325e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
326e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads a String value from the current location in the parcel.
327e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return value parsed from the parcel
328e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
329e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
330dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final String readString();
331dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
332e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
333e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads an array of boolean values from the parcel.
334e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return array of parsed values
335e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
336e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
337ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    private native final boolean[] readBoolVectorAsArray();
338e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
339e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads an array of byte values from the parcel.
340e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return array of parsed values
341e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
342e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
343ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    private native final byte[] readInt8VectorAsArray();
344e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
345e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads an array of short values from the parcel.
346e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return array of parsed values
347e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
348e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
349ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    private native final short[] readInt16VectorAsArray();
350e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
351e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads an array of int values from the parcel.
352e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return array of parsed values
353e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
354e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
355ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    private native final int[] readInt32VectorAsArray();
356e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
357e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads an array of long values from the parcel.
358e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return array of parsed values
359e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
360e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
361ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    private native final long[] readInt64VectorAsArray();
362e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
363e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads an array of float values from the parcel.
364e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return array of parsed values
365e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
366e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
367ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    private native final float[] readFloatVectorAsArray();
368e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
369e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads an array of double values from the parcel.
370e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return array of parsed values
371e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
372e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
373ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    private native final double[] readDoubleVectorAsArray();
374e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
375e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads an array of String values from the parcel.
376e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return array of parsed values
377e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
378e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
379ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    private native final String[] readStringVectorAsArray();
380ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
381e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
382e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Convenience method to read a Boolean vector as an ArrayList.
383e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return array of parsed values.
384e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
385e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
386ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    public final ArrayList<Boolean> readBoolVector() {
387ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        Boolean[] array = HwBlob.wrapArray(readBoolVectorAsArray());
388ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
389ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        return new ArrayList<Boolean>(Arrays.asList(array));
390ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    }
391ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
392e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
393e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Convenience method to read a Byte vector as an ArrayList.
394e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return array of parsed values.
395e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
396e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
397ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    public final ArrayList<Byte> readInt8Vector() {
398ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        Byte[] array = HwBlob.wrapArray(readInt8VectorAsArray());
399ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
400ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        return new ArrayList<Byte>(Arrays.asList(array));
401ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    }
402ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
403e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
404e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Convenience method to read a Short vector as an ArrayList.
405e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return array of parsed values.
406e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
407e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
408ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    public final ArrayList<Short> readInt16Vector() {
409ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        Short[] array = HwBlob.wrapArray(readInt16VectorAsArray());
410ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
411ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        return new ArrayList<Short>(Arrays.asList(array));
412ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    }
413ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
414e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
415e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Convenience method to read a Integer vector as an ArrayList.
416e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return array of parsed values.
417e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
418e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
419ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    public final ArrayList<Integer> readInt32Vector() {
420ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        Integer[] array = HwBlob.wrapArray(readInt32VectorAsArray());
421ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
422ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        return new ArrayList<Integer>(Arrays.asList(array));
423ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    }
424ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
425e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
426e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Convenience method to read a Long vector as an ArrayList.
427e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return array of parsed values.
428e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
429e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
430ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    public final ArrayList<Long> readInt64Vector() {
431ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        Long[] array = HwBlob.wrapArray(readInt64VectorAsArray());
432ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
433ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        return new ArrayList<Long>(Arrays.asList(array));
434ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    }
435ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
436e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
437e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Convenience method to read a Float vector as an ArrayList.
438e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return array of parsed values.
439e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
440e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
441ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    public final ArrayList<Float> readFloatVector() {
442ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        Float[] array = HwBlob.wrapArray(readFloatVectorAsArray());
443ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
444ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        return new ArrayList<Float>(Arrays.asList(array));
445ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    }
446ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
447e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
448e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Convenience method to read a Double vector as an ArrayList.
449e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return array of parsed values.
450e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
451e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
452ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    public final ArrayList<Double> readDoubleVector() {
453ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        Double[] array = HwBlob.wrapArray(readDoubleVectorAsArray());
454ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
455ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        return new ArrayList<Double>(Arrays.asList(array));
456ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    }
457ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber
458e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
459e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Convenience method to read a String vector as an ArrayList.
460e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return array of parsed values.
461e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
462e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
463ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    public final ArrayList<String> readStringVector() {
464ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber        return new ArrayList<String>(Arrays.asList(readStringVectorAsArray()));
465ef1a565bd4e96646e6848a6a40a53ee4dfe33293Andreas Huber    }
466dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
467e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
468e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Reads a strong binder value from the parcel.
469e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return binder object read from parcel or null if no binder can be read
470e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
471e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
472dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final IHwBinder readStrongBinder();
473dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
474e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
475e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Read opaque segment of data as a blob.
476e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return blob of size expectedSize
477e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if the parcel has no more data
478e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
479932b5048655ad746e265be1fd590194f7e930f61Martijn Coenen    public native final HwBlob readBuffer(long expectedSize);
4809266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
481e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
482e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Read a buffer written using scatter gather.
483e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     *
484e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param expectedSize size that buffer should be
485e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param parentHandle handle from which to read the embedded buffer
486e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param offset offset into parent
487e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param nullable whether or not to allow for a null return
488e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @return blob of data with size expectedSize
489e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws NoSuchElementException if an embedded buffer is not available to read
490e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if expectedSize < 0
491e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws NullPointerException if the transaction specified the blob to be null
492e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     *    but nullable is false
493e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
4949266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    public native final HwBlob readEmbeddedBuffer(
495932b5048655ad746e265be1fd590194f7e930f61Martijn Coenen            long expectedSize, long parentHandle, long offset,
496932b5048655ad746e265be1fd590194f7e930f61Martijn Coenen            boolean nullable);
4979266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber
498e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
499e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Write a buffer into the transaction.
500e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param blob blob to write into the parcel.
501e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
5029266f9928d5b3431982cd04f4d6946b70f40766aAndreas Huber    public native final void writeBuffer(HwBlob blob);
503e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
504e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Write a status value into the blob.
505e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @param status value to write
506e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
507dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final void writeStatus(int status);
508e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
509e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws IllegalArgumentException if a success vaue cannot be read
510e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * @throws RemoteException if success value indicates a transaction error
511e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
512dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final void verifySuccess();
513e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
514e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Should be called to reduce memory pressure when this object no longer needs
515e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * to be written to.
516e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
517dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final void releaseTemporaryStorage();
518e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
519e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Should be called when object is no longer needed to reduce possible memory
520e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * pressure if the Java GC does not get to this object in time.
521e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
5223d726d16b6c198087dc527d9e5f51f18351a0fa9Martijn Coenen    public native final void release();
523dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
524e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland    /**
525e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     * Sends the parcel to the specified destination.
526e8e63aae6f705cbe316a1d9a7780f9f534bc3948Steven Moreland     */
527dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public native final void send();
528dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
529dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    // Returns address of the "freeFunction".
530dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    private static native final long native_init();
531dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
532dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    private native final void native_setup(boolean allocate);
533dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
534dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    static {
535dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        long freeFunction = native_init();
536dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
537dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        sNativeRegistry = new NativeAllocationRegistry(
538dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                HwParcel.class.getClassLoader(),
539dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                freeFunction,
540dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                128 /* size */);
541dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
542dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
543dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    private long mNativeContext;
544dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
545dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
546