Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f3a5c881 authored by Hao Ke's avatar Hao Ke Committed by Automerger Merge Worker
Browse files

Merge "Adding typed Parcel read APIs 2" am: 79c9ea52 am: 931724fb

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1854703

Change-Id: I2d53484e5391b5b9836c308040c42f3ac66de06b
parents 38e4df34 931724fb
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -31433,7 +31433,9 @@ package android.os {
    method @NonNull public static android.os.Parcel obtain();
    method @NonNull public static android.os.Parcel obtain();
    method @NonNull public static android.os.Parcel obtain(@NonNull android.os.IBinder);
    method @NonNull public static android.os.Parcel obtain(@NonNull android.os.IBinder);
    method @Nullable public Object[] readArray(@Nullable ClassLoader);
    method @Nullable public Object[] readArray(@Nullable ClassLoader);
    method @Nullable public <T> T[] readArray(@Nullable ClassLoader, @NonNull Class<T>);
    method @Nullable public java.util.ArrayList readArrayList(@Nullable ClassLoader);
    method @Nullable public java.util.ArrayList readArrayList(@Nullable ClassLoader);
    method @Nullable public <T> java.util.ArrayList<T> readArrayList(@Nullable ClassLoader, @NonNull Class<? extends T>);
    method public void readBinderArray(@NonNull android.os.IBinder[]);
    method public void readBinderArray(@NonNull android.os.IBinder[]);
    method public void readBinderList(@NonNull java.util.List<android.os.IBinder>);
    method public void readBinderList(@NonNull java.util.List<android.os.IBinder>);
    method public boolean readBoolean();
    method public boolean readBoolean();
@@ -31461,6 +31463,7 @@ package android.os {
    method @Nullable public <T extends android.os.Parcelable> T readParcelable(@Nullable ClassLoader);
    method @Nullable public <T extends android.os.Parcelable> T readParcelable(@Nullable ClassLoader);
    method @Nullable public <T extends android.os.Parcelable> T readParcelable(@Nullable ClassLoader, @NonNull Class<T>);
    method @Nullable public <T extends android.os.Parcelable> T readParcelable(@Nullable ClassLoader, @NonNull Class<T>);
    method @Nullable public android.os.Parcelable[] readParcelableArray(@Nullable ClassLoader);
    method @Nullable public android.os.Parcelable[] readParcelableArray(@Nullable ClassLoader);
    method @Nullable public <T> T[] readParcelableArray(@Nullable ClassLoader, @NonNull Class<T>);
    method @Nullable public android.os.Parcelable.Creator<?> readParcelableCreator(@Nullable ClassLoader);
    method @Nullable public android.os.Parcelable.Creator<?> readParcelableCreator(@Nullable ClassLoader);
    method @Nullable public <T> android.os.Parcelable.Creator<T> readParcelableCreator(@Nullable ClassLoader, @NonNull Class<T>);
    method @Nullable public <T> android.os.Parcelable.Creator<T> readParcelableCreator(@Nullable ClassLoader, @NonNull Class<T>);
    method @NonNull public <T extends android.os.Parcelable> java.util.List<T> readParcelableList(@NonNull java.util.List<T>, @Nullable ClassLoader);
    method @NonNull public <T extends android.os.Parcelable> java.util.List<T> readParcelableList(@NonNull java.util.List<T>, @Nullable ClassLoader);
@@ -31470,6 +31473,7 @@ package android.os {
    method @NonNull public android.util.Size readSize();
    method @NonNull public android.util.Size readSize();
    method @NonNull public android.util.SizeF readSizeF();
    method @NonNull public android.util.SizeF readSizeF();
    method @Nullable public <T> android.util.SparseArray<T> readSparseArray(@Nullable ClassLoader);
    method @Nullable public <T> android.util.SparseArray<T> readSparseArray(@Nullable ClassLoader);
    method @Nullable public <T> android.util.SparseArray<T> readSparseArray(@Nullable ClassLoader, @NonNull Class<? extends T>);
    method @Nullable public android.util.SparseBooleanArray readSparseBooleanArray();
    method @Nullable public android.util.SparseBooleanArray readSparseBooleanArray();
    method @Nullable public String readString();
    method @Nullable public String readString();
    method public void readStringArray(@NonNull String[]);
    method public void readStringArray(@NonNull String[]);
+142 −41
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@ import static java.util.Objects.requireNonNull;


import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.annotation.TestApi;
import android.annotation.TestApi;
import android.app.AppOpsManager;
import android.app.AppOpsManager;
import android.compat.annotation.UnsupportedAppUsage;
import android.compat.annotation.UnsupportedAppUsage;
@@ -3094,14 +3095,24 @@ public final class Parcel {
     * Parcelables.
     * Parcelables.
     */
     */
    @Nullable
    @Nullable
    public final ArrayList readArrayList(@Nullable ClassLoader loader) {
    public ArrayList readArrayList(@Nullable ClassLoader loader) {
        int N = readInt();
        return readArrayListInternal(loader, /* clazz */ null);
        if (N < 0) {
            return null;
    }
    }
        ArrayList l = new ArrayList(N);

        readListInternal(l, N, loader, /* clazz */ null);
    /**
        return l;
     * Same as {@link #readArrayList(ClassLoader)} but accepts {@code clazz} parameter as
     * the type required for each item.
     *
     * @throws BadParcelableException Throws BadParcelableException if the item to be deserialized
     * is not an instance of that class or any of its children classes or there was an error
     * trying to instantiate an element.
     */
    @SuppressLint({"ConcreteCollection", "NullableCollection"})
    @Nullable
    public <T> ArrayList<T> readArrayList(@Nullable ClassLoader loader,
            @NonNull Class<? extends T> clazz) {
        Objects.requireNonNull(clazz);
        return readArrayListInternal(loader, clazz);
    }
    }


    /**
    /**
@@ -3111,14 +3122,23 @@ public final class Parcel {
     * Parcelables.
     * Parcelables.
     */
     */
    @Nullable
    @Nullable
    public final Object[] readArray(@Nullable ClassLoader loader) {
    public Object[] readArray(@Nullable ClassLoader loader) {
        int N = readInt();
        return readArrayInternal(loader, /* clazz */ null);
        if (N < 0) {
            return null;
    }
    }
        Object[] l = new Object[N];

        readArrayInternal(l, N, loader);
    /**
        return l;
     * Same as {@link #readArray(ClassLoader)} but accepts {@code clazz} parameter as
     * the type required for each item.
     *
     * @throws BadParcelableException Throws BadParcelableException if the item to be deserialized
     * is not an instance of that class or any of its children classes or there was an error
     * trying to instantiate an element.
     */
    @SuppressLint({"ArrayReturn", "NullableCollection"})
    @Nullable
    public <T> T[] readArray(@Nullable ClassLoader loader, @NonNull Class<T> clazz) {
        Objects.requireNonNull(clazz);
        return readArrayInternal(loader, clazz);
    }
    }


    /**
    /**
@@ -3128,14 +3148,23 @@ public final class Parcel {
     * Parcelables.
     * Parcelables.
     */
     */
    @Nullable
    @Nullable
    public final <T> SparseArray<T> readSparseArray(@Nullable ClassLoader loader) {
    public <T> SparseArray<T> readSparseArray(@Nullable ClassLoader loader) {
        int N = readInt();
        return readSparseArrayInternal(loader, /* clazz */ null);
        if (N < 0) {
            return null;
    }
    }
        SparseArray sa = new SparseArray(N);

        readSparseArrayInternal(sa, N, loader);
    /**
        return sa;
     * Same as {@link #readSparseArray(ClassLoader)} but accepts {@code clazz} parameter as
     * the type required for each item.
     *
     * @throws BadParcelableException Throws BadParcelableException if the item to be deserialized
     * is not an instance of that class or any of its children classes or there was an error
     * trying to instantiate an element.
     */
    @Nullable
    public <T> SparseArray<T> readSparseArray(@Nullable ClassLoader loader,
            @NonNull Class<? extends T> clazz) {
        Objects.requireNonNull(clazz);
        return readSparseArrayInternal(loader, clazz);
    }
    }


    /**
    /**
@@ -3851,7 +3880,7 @@ public final class Parcel {
                    "Parcel " + this + ": Unmarshalling unknown type code " + type
                    "Parcel " + this + ": Unmarshalling unknown type code " + type
                            + " at offset " + off);
                            + " at offset " + off);
        }
        }
        if (clazz != null && !clazz.isInstance(object)) {
        if (object != null && clazz != null && !clazz.isInstance(object)) {
            throw new BadParcelableException("Unparcelled object " + object
            throw new BadParcelableException("Unparcelled object " + object
                    + " is not an instance of required class " + clazz.getName()
                    + " is not an instance of required class " + clazz.getName()
                    + " provided in the parameter");
                    + " provided in the parameter");
@@ -3910,7 +3939,6 @@ public final class Parcel {
    }
    }


    /**
    /**
     *
     * @param clazz The type of the parcelable expected or {@code null} for performing no checks.
     * @param clazz The type of the parcelable expected or {@code null} for performing no checks.
     */
     */
    @SuppressWarnings("unchecked")
    @SuppressWarnings("unchecked")
@@ -3969,7 +3997,7 @@ public final class Parcel {
     * as the required type.
     * as the required type.
     *
     *
     * @throws BadParcelableException Throws BadParcelableException if the item to be deserialized
     * @throws BadParcelableException Throws BadParcelableException if the item to be deserialized
     * is not an instance of that class or any of its children class or there there was an error
     * is not an instance of that class or any of its children classes or there there was an error
     * trying to read the {@link Parcelable.Creator}.
     * trying to read the {@link Parcelable.Creator}.
     */
     */
    @Nullable
    @Nullable
@@ -4092,17 +4120,25 @@ public final class Parcel {
        return p;
        return p;
    }
    }


    /** @hide */
    /**
     * Same as {@link #readParcelableArray(ClassLoader)}  but accepts {@code clazz} parameter as
     * the type required for each item.
     *
     * @throws BadParcelableException Throws BadParcelableException if the item to be deserialized
     * is not an instance of that class or any of its children classes or there was an error
     * trying to instantiate an element.
     */
    @SuppressLint({"ArrayReturn", "NullableCollection"})
    @SuppressWarnings("unchecked")
    @Nullable
    @Nullable
    public final <T extends Parcelable> T[] readParcelableArray(@Nullable ClassLoader loader,
    public <T> T[] readParcelableArray(@Nullable ClassLoader loader, @NonNull Class<T> clazz) {
            @NonNull Class<T> clazz) {
        int n = readInt();
        int N = readInt();
        if (n < 0) {
        if (N < 0) {
            return null;
            return null;
        }
        }
        T[] p = (T[]) Array.newInstance(clazz, N);
        T[] p = (T[]) Array.newInstance(clazz, n);
        for (int i = 0; i < N; i++) {
        for (int i = 0; i < n; i++) {
            p[i] = readParcelable(loader);
            p[i] = readParcelableInternal(loader, clazz);
        }
        }
        return p;
        return p;
    }
    }
@@ -4320,9 +4356,12 @@ public final class Parcel {
        return result;
        return result;
    }
    }


    private void readListInternal(@NonNull List outVal, int n,
    /**
            @Nullable ClassLoader loader) {
     * The method is replaced by {@link #readListInternal(List, int, ClassLoader, Class)}, however
        readListInternal(outVal, n, loader, null);
     * we are keeping this unused method here to allow unsupported app usages.
     */
    private void readListInternal(@NonNull List outVal, int n, @Nullable ClassLoader loader) {
        readListInternal(outVal, n, loader,  /* clazz */ null);
    }
    }


    /**
    /**
@@ -4338,26 +4377,88 @@ public final class Parcel {
        }
        }
    }
    }


    /**
     * @param clazz The type of the object expected or {@code null} for performing no checks.
     */
    @SuppressLint({"ConcreteCollection", "NullableCollection"})
    @Nullable
    private <T> ArrayList<T> readArrayListInternal(@Nullable ClassLoader loader,
            @Nullable Class<? extends T> clazz) {
        int n = readInt();
        if (n < 0) {
            return null;
        }
        ArrayList<T> l = new ArrayList<>(n);
        readListInternal(l, n, loader, clazz);
        return l;
    }

    /**
     * The method is replaced by {@link #readArrayInternal(ClassLoader, Class)}, however
     * we are keeping this unused method here to allow unsupported app usages.
     */
    private void readArrayInternal(@NonNull Object[] outVal, int N,
    private void readArrayInternal(@NonNull Object[] outVal, int N,
            @Nullable ClassLoader loader) {
            @Nullable ClassLoader loader) {
        for (int i = 0; i < N; i++) {
        for (int i = 0; i < N; i++) {
            Object value = readValue(loader);
            Object value = readValue(loader, /* clazz */ null);
            //Log.d(TAG, "Unmarshalling value=" + value);
            outVal[i] = value;
            outVal[i] = value;
        }
        }
    }
    }


    /**
     * @param clazz The type of the object expected or {@code null} for performing no checks.
     */
    @SuppressWarnings("unchecked")
    @Nullable
    private <T> T[] readArrayInternal(@Nullable ClassLoader loader, @Nullable Class<T> clazz) {
        int n = readInt();
        if (n < 0) {
            return null;
        }
        T[] outVal = (T[]) ((clazz == null) ? new Object[n] : Array.newInstance(clazz, n));

        for (int i = 0; i < n; i++) {
            T value = readValue(loader, clazz);
            outVal[i] = value;
        }
        return outVal;
    }

    /**
     * The method is replaced by {@link #readSparseArray(ClassLoader, Class)}, however
     * we are keeping this unused method here to allow unsupported app usages.
     */
    private void readSparseArrayInternal(@NonNull SparseArray outVal, int N,
    private void readSparseArrayInternal(@NonNull SparseArray outVal, int N,
            @Nullable ClassLoader loader) {
            @Nullable ClassLoader loader) {
        while (N > 0) {
        while (N > 0) {
            int key = readInt();
            int key = readInt();
            Object value = readValue(loader);
            Object value = readValue(loader);
            //Log.i(TAG, "Unmarshalling key=" + key + " value=" + value);
            outVal.append(key, value);
            outVal.append(key, value);
            N--;
            N--;
        }
        }
    }
    }


    /**
     * @param clazz The type of the object expected or {@code null} for performing no checks.
     */
    @Nullable
    private <T> SparseArray<T> readSparseArrayInternal(@Nullable ClassLoader loader,
            @Nullable Class<? extends T> clazz) {
        int n = readInt();
        if (n < 0) {
            return null;
        }
        SparseArray<T> outVal = new SparseArray<>(n);

        while (n > 0) {
            int key = readInt();
            T value = readValue(loader, clazz);
            outVal.append(key, value);
            n--;
        }
        return outVal;
    }



    private void readSparseBooleanArrayInternal(@NonNull SparseBooleanArray outVal, int N) {
    private void readSparseBooleanArrayInternal(@NonNull SparseBooleanArray outVal, int N) {
        while (N > 0) {
        while (N > 0) {