1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* Licensed to the Apache Software Foundation (ASF) under one or more
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
7f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
9f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.nio;
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A buffer is a list of elements of a specific primitive type.
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A buffer can be described by the following properties:
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Capacity: the number of elements a buffer can hold. Capacity may not be
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * negative and never changes.</li>
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Position: a cursor of this buffer. Elements are read or written at the
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * position if you do not specify an index explicitly. Position may not be
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * negative and not greater than the limit.</li>
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Limit: controls the scope of accessible elements. You can only read or
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * write elements from index zero to <code>limit - 1</code>. Accessing
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * elements out of the scope will cause an exception. Limit may not be negative
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and not greater than capacity.</li>
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Mark: used to remember the current position, so that you can reset the
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * position later. Mark may not be negative and no greater than position.</li>
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>A buffer can be read-only or read-write. Trying to modify the elements
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of a read-only buffer will cause a <code>ReadOnlyBufferException</code>,
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * while changing the position, limit and mark of a read-only buffer is OK.</li>
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>A buffer can be direct or indirect. A direct buffer will try its best to
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * take advantage of native memory APIs and it may not stay in the Java heap,
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thus it is not affected by garbage collection.</li>
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Buffers are not thread-safe. If concurrent access to a buffer instance is
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * required, then the callers are responsible to take care of the
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * synchronization issues.
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class Buffer {
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <code>UNSET_MARK</code> means the mark has not been set.
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
510440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes    static final int UNSET_MARK = -1;
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
54e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * The capacity of this buffer, which never changes.
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    final int capacity;
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <code>limit - 1</code> is the last element that can be read or written.
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Limit must be no less than zero and no greater than <code>capacity</code>.
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    int limit;
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Mark is where position will be set when <code>reset()</code> is called.
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Mark is not set by default. Mark is always no less than zero and no
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * greater than <code>position</code>.
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    int mark = UNSET_MARK;
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The current position of this buffer. Position is always no less than zero
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and no greater than <code>limit</code>.
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    int position = 0;
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
787fcffb1cb6d3914ea089562a210ccec8fdda93f0Elliott Hughes     * The log base 2 of the element size of this buffer.  Each typed subclass
797fcffb1cb6d3914ea089562a210ccec8fdda93f0Elliott Hughes     * (ByteBuffer, CharBuffer, etc.) is responsible for initializing this
807fcffb1cb6d3914ea089562a210ccec8fdda93f0Elliott Hughes     * value.  The value is used by JNI code in frameworks/base/ to avoid the
817fcffb1cb6d3914ea089562a210ccec8fdda93f0Elliott Hughes     * need for costly 'instanceof' tests.
827fcffb1cb6d3914ea089562a210ccec8fdda93f0Elliott Hughes     */
830440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes    final int _elementSizeShift;
847fcffb1cb6d3914ea089562a210ccec8fdda93f0Elliott Hughes
857fcffb1cb6d3914ea089562a210ccec8fdda93f0Elliott Hughes    /**
860f335c4ed1a0cb419c8ce82183fabb241d5dd032Elliott Hughes     * For direct buffers, the effective address of the data; zero otherwise.
870f335c4ed1a0cb419c8ce82183fabb241d5dd032Elliott Hughes     * This is set in the constructor.
880440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes     * TODO: make this final at the cost of loads of extra constructors? [how many?]
89bd8ecd863aa83df50d7ce8f5950d8645ab6356afAndy McFadden     */
900440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes    int effectiveDirectAddress;
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
930440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes     * For direct buffers, the underlying MemoryBlock; null otherwise.
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
950440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes    final MemoryBlock block;
960440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes
97934767b07d94041390785d8fe66c86b2379730bcElliott Hughes    Buffer(int elementSizeShift, int capacity, MemoryBlock block) {
98934767b07d94041390785d8fe66c86b2379730bcElliott Hughes        this._elementSizeShift = elementSizeShift;
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (capacity < 0) {
1000440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes            throw new IllegalArgumentException("capacity < 0: " + capacity);
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.capacity = this.limit = capacity;
1030440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes        this.block = block;
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
107e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * Returns the array that backs this buffer (optional operation).
108e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * The returned value is the actual array, not a copy, so modifications
109e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * to the array write through to the buffer.
110e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     *
111e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * <p>Subclasses should override this method with a covariant return type
112e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * to provide the exact type of the array.
113e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     *
114e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * <p>Use {@code hasArray} to ensure this method won't throw.
115e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * (A separate call to {@code isReadOnly} is not necessary.)
116e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     *
117e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * @return the array
118e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * @throws ReadOnlyBufferException if the buffer is read-only
119e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     *         UnsupportedOperationException if the buffer does not expose an array
120e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * @since 1.6
121e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     */
122e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes    public abstract Object array();
123e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes
124e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes    /**
125e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * Returns the offset into the array returned by {@code array} of the first
126e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * element of the buffer (optional operation). The backing array (if there is one)
127e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * is not necessarily the same size as the buffer, and position 0 in the buffer is
128e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * not necessarily the 0th element in the array. Use
129e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * {@code buffer.array()[offset + buffer.arrayOffset()} to access element {@code offset}
130e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * in {@code buffer}.
131e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     *
132e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * <p>Use {@code hasArray} to ensure this method won't throw.
133e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * (A separate call to {@code isReadOnly} is not necessary.)
134e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     *
135e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * @return the offset
136e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * @throws ReadOnlyBufferException if the buffer is read-only
137e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     *         UnsupportedOperationException if the buffer does not expose an array
138e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * @since 1.6
139e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     */
140e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes    public abstract int arrayOffset();
141e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes
142e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes    /**
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the capacity of this buffer.
144f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of elements that are contained in this buffer.
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final int capacity() {
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return capacity;
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
151a1603838fe9e865575c87982e32c6343740e464cElliott Hughes    /**
152a1603838fe9e865575c87982e32c6343740e464cElliott Hughes     * Used for the scalar get/put operations.
153a1603838fe9e865575c87982e32c6343740e464cElliott Hughes     */
154a1603838fe9e865575c87982e32c6343740e464cElliott Hughes    void checkIndex(int index) {
155a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        if (index < 0 || index >= limit) {
156a1603838fe9e865575c87982e32c6343740e464cElliott Hughes            throw new IndexOutOfBoundsException("index=" + index + ", limit=" + limit);
157a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        }
158a1603838fe9e865575c87982e32c6343740e464cElliott Hughes    }
159a1603838fe9e865575c87982e32c6343740e464cElliott Hughes
160a1603838fe9e865575c87982e32c6343740e464cElliott Hughes    /**
161a1603838fe9e865575c87982e32c6343740e464cElliott Hughes     * Used for the ByteBuffer operations that get types larger than a byte.
162a1603838fe9e865575c87982e32c6343740e464cElliott Hughes     */
163a1603838fe9e865575c87982e32c6343740e464cElliott Hughes    void checkIndex(int index, int sizeOfType) {
164a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        if (index < 0 || index > limit - sizeOfType) {
165a1603838fe9e865575c87982e32c6343740e464cElliott Hughes            throw new IndexOutOfBoundsException("index=" + index + ", limit=" + limit +
166a1603838fe9e865575c87982e32c6343740e464cElliott Hughes                    ", size of type=" + sizeOfType);
167a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        }
168a1603838fe9e865575c87982e32c6343740e464cElliott Hughes    }
169a1603838fe9e865575c87982e32c6343740e464cElliott Hughes
1708fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes    int checkGetBounds(int bytesPerElement, int length, int offset, int count) {
1716944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes        int byteCount = bytesPerElement * count;
172a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        if ((offset | count) < 0 || offset > length || length - offset < count) {
173a1603838fe9e865575c87982e32c6343740e464cElliott Hughes            throw new IndexOutOfBoundsException("offset=" + offset +
174a1603838fe9e865575c87982e32c6343740e464cElliott Hughes                    ", count=" + count + ", length=" + length);
1756944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes        }
1766944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes        if (byteCount > remaining()) {
1776944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes            throw new BufferUnderflowException();
1786944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes        }
1796944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes        return byteCount;
1806944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes    }
1816944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes
1828fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes    int checkPutBounds(int bytesPerElement, int length, int offset, int count) {
1838fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes        int byteCount = bytesPerElement * count;
184a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        if ((offset | count) < 0 || offset > length || length - offset < count) {
185a1603838fe9e865575c87982e32c6343740e464cElliott Hughes            throw new IndexOutOfBoundsException("offset=" + offset +
186a1603838fe9e865575c87982e32c6343740e464cElliott Hughes                    ", count=" + count + ", length=" + length);
1878fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes        }
1888fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes        if (byteCount > remaining()) {
1898fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes            throw new BufferOverflowException();
1908fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes        }
1918fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes        if (isReadOnly()) {
1928fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes            throw new ReadOnlyBufferException();
1938fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes        }
1948fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes        return byteCount;
1958fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes    }
1968fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes
197a1603838fe9e865575c87982e32c6343740e464cElliott Hughes    void checkStartEndRemaining(int start, int end) {
198a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        if (end < start || start < 0 || end > remaining()) {
199a1603838fe9e865575c87982e32c6343740e464cElliott Hughes            throw new IndexOutOfBoundsException("start=" + start + ", end=" + end +
200a1603838fe9e865575c87982e32c6343740e464cElliott Hughes                    ", remaining()=" + remaining());
201a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        }
202a1603838fe9e865575c87982e32c6343740e464cElliott Hughes    }
203a1603838fe9e865575c87982e32c6343740e464cElliott Hughes
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Clears this buffer.
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * While the content of this buffer is not changed, the following internal
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * changes take place: the current position is reset back to the start of
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the buffer, the value of the buffer limit is made equal to the capacity
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and mark is cleared.
211eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this buffer.
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Buffer clear() {
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = 0;
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mark = UNSET_MARK;
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        limit = capacity;
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Flips this buffer.
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The limit is set to the current position, then the position is set to
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * zero, and the mark is cleared.
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The content of this buffer is not changed.
228eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this buffer.
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Buffer flip() {
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        limit = position;
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = 0;
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mark = UNSET_MARK;
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
239e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * Returns true if {@code array} and {@code arrayOffset} won't throw. This method does not
240e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * return true for buffers not backed by arrays because the other methods would throw
241e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * {@code UnsupportedOperationException}, nor does it return true for buffers backed by
242e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * read-only arrays, because the other methods would throw {@code ReadOnlyBufferException}.
243e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * @since 1.6
244e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     */
245e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes    public abstract boolean hasArray();
246e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes
247e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes    /**
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates if there are elements remaining in this buffer, that is if
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code position < limit}.
250f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if there are elements remaining in this buffer,
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} otherwise.
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final boolean hasRemaining() {
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return position < limit;
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
259e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * Returns true if this is a direct buffer.
260e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     * @since 1.6
261e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes     */
262e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes    public abstract boolean isDirect();
263e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes
264e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes    /**
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this buffer is read-only.
266f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this buffer is read-only, {@code false}
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract boolean isReadOnly();
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
272e3b6fa2bf357f2712ab2ee9e8487f157595ea0c7Elliott Hughes    final void checkWritable() {
273e3b6fa2bf357f2712ab2ee9e8487f157595ea0c7Elliott Hughes        if (isReadOnly()) {
274126ab1b546c71137a97cef68cc89267e7f7be634Elliott Hughes            throw new IllegalArgumentException("Read-only buffer");
275e3b6fa2bf357f2712ab2ee9e8487f157595ea0c7Elliott Hughes        }
276e3b6fa2bf357f2712ab2ee9e8487f157595ea0c7Elliott Hughes    }
277e3b6fa2bf357f2712ab2ee9e8487f157595ea0c7Elliott Hughes
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the limit of this buffer.
280f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the limit of this buffer.
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final int limit() {
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return limit;
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the limit of this buffer.
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the current position in the buffer is in excess of
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <code>newLimit</code> then, on returning from this call, it will have
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * been adjusted to be equivalent to <code>newLimit</code>. If the mark
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is set and is greater than the new limit, then it is cleared.
294eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newLimit
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new limit, must not be negative and not greater than
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            capacity.
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this buffer.
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception IllegalArgumentException
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if <code>newLimit</code> is invalid.
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Buffer limit(int newLimit) {
3030c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        limitImpl(newLimit);
3040c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return this;
3050c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes    }
3060c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes
3070c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes    /**
3080c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes     * Subverts the fact that limit(int) is final, for the benefit of MappedByteBufferAdapter.
3090c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes     */
3100c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes    void limitImpl(int newLimit) {
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (newLimit < 0 || newLimit > capacity) {
312a28bc96d63595a77fa918da8ccdda50e9eaae95eElliott Hughes            throw new IllegalArgumentException("Bad limit (capacity " + capacity + "): " + newLimit);
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        limit = newLimit;
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (position > newLimit) {
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            position = newLimit;
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((mark != UNSET_MARK) && (mark > newLimit)) {
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mark = UNSET_MARK;
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Marks the current position, so that the position may return to this point
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * later by calling <code>reset()</code>.
327f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this buffer.
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Buffer mark() {
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mark = position;
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the position of this buffer.
337f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of this buffer's current position.
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final int position() {
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return position;
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the position of this buffer.
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the mark is set and it is greater than the new position, then it is
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * cleared.
349eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newPosition
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new position, must be not negative and not greater than
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            limit.
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this buffer.
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception IllegalArgumentException
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if <code>newPosition</code> is invalid.
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Buffer position(int newPosition) {
3580c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        positionImpl(newPosition);
3590c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return this;
3600c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes    }
3610c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes
3620c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes    void positionImpl(int newPosition) {
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (newPosition < 0 || newPosition > limit) {
364a28bc96d63595a77fa918da8ccdda50e9eaae95eElliott Hughes            throw new IllegalArgumentException("Bad position (limit " + limit + "): " + newPosition);
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = newPosition;
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((mark != UNSET_MARK) && (mark > position)) {
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mark = UNSET_MARK;
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the number of remaining elements in this buffer, that is
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code limit - position}.
376f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of remaining elements in this buffer.
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final int remaining() {
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return limit - position;
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Resets the position of this buffer to the <code>mark</code>.
385f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this buffer.
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception InvalidMarkException
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if the mark is not set.
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Buffer reset() {
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (mark == UNSET_MARK) {
392a28bc96d63595a77fa918da8ccdda50e9eaae95eElliott Hughes            throw new InvalidMarkException("Mark not set");
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = mark;
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Rewinds this buffer.
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The position is set to zero, and the mark is cleared. The content of this
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * buffer is not changed.
403eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this buffer.
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Buffer rewind() {
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = 0;
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mark = UNSET_MARK;
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
4110c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes
4120c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes    @Override public String toString() {
4130c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        StringBuilder buf = new StringBuilder();
4140c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        buf.append(getClass().getName());
4150c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        buf.append(", status: capacity=");
4160c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        buf.append(capacity);
4170c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        buf.append(" position=");
4180c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        buf.append(position);
4190c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        buf.append(" limit=");
4200c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        buf.append(limit);
4210c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return buf.toString();
4220c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes    }
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
424