Merge "Gating OutOfBoundsException on targetSdkVersion." into qt-dev
This commit is contained in:
@@ -140,6 +140,7 @@ import android.util.Slog;
|
||||
import android.util.SparseArray;
|
||||
import android.util.SparseIntArray;
|
||||
import android.util.SuperNotCalledException;
|
||||
import android.util.UtilConfig;
|
||||
import android.util.proto.ProtoOutputStream;
|
||||
import android.view.Choreographer;
|
||||
import android.view.ContextThemeWrapper;
|
||||
@@ -6078,6 +6079,10 @@ public final class ActivityThread extends ClientTransactionHandler {
|
||||
AsyncTask.setDefaultExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||
}
|
||||
|
||||
// Let the util.*Array classes maintain "undefined" for apps targeting Pie or earlier.
|
||||
UtilConfig.setThrowExceptionForUpperArrayOutOfBounds(
|
||||
data.appInfo.targetSdkVersion >= Build.VERSION_CODES.Q);
|
||||
|
||||
Message.updateCheckRecycle(data.appInfo.targetSdkVersion);
|
||||
|
||||
// Prior to P, internal calls to decode Bitmaps used BitmapFactory,
|
||||
|
||||
@@ -449,11 +449,17 @@ public final class ArrayMap<K, V> implements Map<K, V> {
|
||||
|
||||
/**
|
||||
* Return the key at the given index in the array.
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*
|
||||
* @param index The desired index, must be between 0 and {@link #size()}-1.
|
||||
* @return Returns the key stored at the given index.
|
||||
*/
|
||||
public K keyAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
@@ -462,11 +468,17 @@ public final class ArrayMap<K, V> implements Map<K, V> {
|
||||
|
||||
/**
|
||||
* Return the value at the given index in the array.
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*
|
||||
* @param index The desired index, must be between 0 and {@link #size()}-1.
|
||||
* @return Returns the value stored at the given index.
|
||||
*/
|
||||
public V valueAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
@@ -475,12 +487,18 @@ public final class ArrayMap<K, V> implements Map<K, V> {
|
||||
|
||||
/**
|
||||
* Set the value at a given index in the array.
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*
|
||||
* @param index The desired index, must be between 0 and {@link #size()}-1.
|
||||
* @param value The new value to store at this index.
|
||||
* @return Returns the previous value at the given index.
|
||||
*/
|
||||
public V setValueAt(int index, V value) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
@@ -673,11 +691,17 @@ public final class ArrayMap<K, V> implements Map<K, V> {
|
||||
|
||||
/**
|
||||
* Remove the key/value mapping at the given index.
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*
|
||||
* @param index The desired index, must be between 0 and {@link #size()}-1.
|
||||
* @return Returns the value that was stored at this index.
|
||||
*/
|
||||
public V removeAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
|
||||
@@ -356,11 +356,17 @@ public final class ArraySet<E> implements Collection<E>, Set<E> {
|
||||
|
||||
/**
|
||||
* Return the value at the given index in the array.
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*
|
||||
* @param index The desired index, must be between 0 and {@link #size()}-1.
|
||||
* @return Returns the value stored at the given index.
|
||||
*/
|
||||
public E valueAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
@@ -527,11 +533,17 @@ public final class ArraySet<E> implements Collection<E>, Set<E> {
|
||||
|
||||
/**
|
||||
* Remove the key/value mapping at the given index.
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*
|
||||
* @param index The desired index, must be between 0 and {@link #size()}-1.
|
||||
* @return Returns the value that was stored at this index.
|
||||
*/
|
||||
public E removeAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
|
||||
@@ -142,9 +142,14 @@ public class LongSparseArray<E> implements Cloneable {
|
||||
|
||||
/**
|
||||
* Removes the mapping at the specified index.
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
public void removeAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
@@ -235,9 +240,14 @@ public class LongSparseArray<E> implements Cloneable {
|
||||
* be in ascending order, e.g., <code>keyAt(0)</code> will return the
|
||||
* smallest key and <code>keyAt(size()-1)</code> will return the largest
|
||||
* key.</p>
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
public long keyAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
@@ -258,10 +268,15 @@ public class LongSparseArray<E> implements Cloneable {
|
||||
* <code>valueAt(0)</code> will return the value associated with the
|
||||
* smallest key and <code>valueAt(size()-1)</code> will return the value
|
||||
* associated with the largest key.</p>
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public E valueAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
@@ -276,9 +291,14 @@ public class LongSparseArray<E> implements Cloneable {
|
||||
* Given an index in the range <code>0...size()-1</code>, sets a new
|
||||
* value for the <code>index</code>th key-value mapping that this
|
||||
* LongSparseArray stores.
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
public void setValueAt(int index, E value) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
|
||||
@@ -170,9 +170,14 @@ public class LongSparseLongArray implements Cloneable {
|
||||
* be in ascending order, e.g., <code>keyAt(0)</code> will return the
|
||||
* smallest key and <code>keyAt(size()-1)</code> will return the largest
|
||||
* key.</p>
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
public long keyAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
@@ -189,9 +194,14 @@ public class LongSparseLongArray implements Cloneable {
|
||||
* <code>valueAt(0)</code> will return the value associated with the
|
||||
* smallest key and <code>valueAt(size()-1)</code> will return the value
|
||||
* associated with the largest key.</p>
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
public long valueAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
|
||||
@@ -169,10 +169,12 @@ public class SparseArray<E> implements Cloneable {
|
||||
* Removes the mapping at the specified index.
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>,
|
||||
* the behavior is undefined.</p>
|
||||
* the behavior is undefined for apps targeting {@link android.os.Build.VERSION_CODES#P} and
|
||||
* earlier, and an {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
public void removeAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
@@ -281,10 +283,12 @@ public class SparseArray<E> implements Cloneable {
|
||||
* key.</p>
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>,
|
||||
* the behavior is undefined.</p>
|
||||
* the behavior is undefined for apps targeting {@link android.os.Build.VERSION_CODES#P} and
|
||||
* earlier, and an {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
public int keyAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
@@ -307,11 +311,13 @@ public class SparseArray<E> implements Cloneable {
|
||||
* associated with the largest key.</p>
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>,
|
||||
* the behavior is undefined.</p>
|
||||
* the behavior is undefined for apps targeting {@link android.os.Build.VERSION_CODES#P} and
|
||||
* earlier, and an {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public E valueAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
@@ -327,10 +333,13 @@ public class SparseArray<E> implements Cloneable {
|
||||
* value for the <code>index</code>th key-value mapping that this
|
||||
* SparseArray stores.
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined.</p>
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
public void setValueAt(int index, E value) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
|
||||
@@ -166,9 +166,14 @@ public class SparseBooleanArray implements Cloneable {
|
||||
* be in ascending order, e.g., <code>keyAt(0)</code> will return the
|
||||
* smallest key and <code>keyAt(size()-1)</code> will return the largest
|
||||
* key.</p>
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
public int keyAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
@@ -185,9 +190,14 @@ public class SparseBooleanArray implements Cloneable {
|
||||
* <code>valueAt(0)</code> will return the value associated with the
|
||||
* smallest key and <code>valueAt(size()-1)</code> will return the value
|
||||
* associated with the largest key.</p>
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
public boolean valueAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
@@ -196,9 +206,14 @@ public class SparseBooleanArray implements Cloneable {
|
||||
|
||||
/**
|
||||
* Directly set the value at a particular index.
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
public void setValueAt(int index, boolean value) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
|
||||
@@ -170,9 +170,14 @@ public class SparseIntArray implements Cloneable {
|
||||
* be in ascending order, e.g., <code>keyAt(0)</code> will return the
|
||||
* smallest key and <code>keyAt(size()-1)</code> will return the largest
|
||||
* key.</p>
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
public int keyAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
@@ -189,9 +194,14 @@ public class SparseIntArray implements Cloneable {
|
||||
* <code>valueAt(0)</code> will return the value associated with the
|
||||
* smallest key and <code>valueAt(size()-1)</code> will return the value
|
||||
* associated with the largest key.</p>
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
public int valueAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
@@ -200,9 +210,14 @@ public class SparseIntArray implements Cloneable {
|
||||
|
||||
/**
|
||||
* Directly set the value at a particular index.
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
public void setValueAt(int index, int value) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
|
||||
@@ -180,9 +180,14 @@ public class SparseLongArray implements Cloneable {
|
||||
* be in ascending order, e.g., <code>keyAt(0)</code> will return the
|
||||
* smallest key and <code>keyAt(size()-1)</code> will return the largest
|
||||
* key.</p>
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
public int keyAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
@@ -199,9 +204,14 @@ public class SparseLongArray implements Cloneable {
|
||||
* <code>valueAt(0)</code> will return the value associated with the
|
||||
* smallest key and <code>valueAt(size()-1)</code> will return the value
|
||||
* associated with the largest key.</p>
|
||||
*
|
||||
* <p>For indices outside of the range <code>0...size()-1</code>, the behavior is undefined for
|
||||
* apps targeting {@link android.os.Build.VERSION_CODES#P} and earlier, and an
|
||||
* {@link ArrayIndexOutOfBoundsException} is thrown for apps targeting
|
||||
* {@link android.os.Build.VERSION_CODES#Q} and later.</p>
|
||||
*/
|
||||
public long valueAt(int index) {
|
||||
if (index >= mSize) {
|
||||
if (index >= mSize && UtilConfig.sThrowExceptionForUpperArrayOutOfBounds) {
|
||||
// The array might be slightly bigger than mSize, in which case, indexing won't fail.
|
||||
throw new ArrayIndexOutOfBoundsException(index);
|
||||
}
|
||||
|
||||
30
core/java/android/util/UtilConfig.java
Normal file
30
core/java/android/util/UtilConfig.java
Normal file
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright (C) 2019 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package android.util;
|
||||
|
||||
/**
|
||||
* Class to configure several of the util classes.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public class UtilConfig {
|
||||
static boolean sThrowExceptionForUpperArrayOutOfBounds = true;
|
||||
|
||||
public static void setThrowExceptionForUpperArrayOutOfBounds(boolean check) {
|
||||
sThrowExceptionForUpperArrayOutOfBounds = check;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user