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

Commit ac4089a9 authored by Xin Guan's avatar Xin Guan Committed by Android (Google) Code Review
Browse files

Merge "Handle parceled usage events more friendly." into main

parents a8bb7bf3 4eee04e8
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -48,13 +48,16 @@ public final class ParcelableUsageEventList implements Parcelable {

    private List<Event> mList;

    public ParcelableUsageEventList(List<Event> list) {
    public ParcelableUsageEventList(@NonNull List<Event> list) {
        if (list == null) {
            throw new IllegalArgumentException("Empty list");
        }
        mList = list;
    }

    private ParcelableUsageEventList(Parcel in) {
        final int N = in.readInt();
        mList = new ArrayList<>();
        mList = new ArrayList<>(N);
        if (DEBUG) Log.d(TAG, "Retrieving " + N + " items");
        if (N <= 0) {
            return;
+17 −3
Original line number Diff line number Diff line
@@ -24,9 +24,11 @@ import android.content.res.Configuration;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@@ -35,6 +37,7 @@ import java.util.List;
 * from which to read {@link android.app.usage.UsageEvents.Event} objects.
 */
public final class UsageEvents implements Parcelable {
    private static final String TAG = "UsageEvents";

    /** @hide */
    public static final String INSTANT_APP_PACKAGE_NAME = "android.instant_app";
@@ -786,10 +789,20 @@ public final class UsageEvents implements Parcelable {
    }

    private void readUsageEventsFromParcelWithParceledList(Parcel in) {
        mEventCount = in.readInt();
        mIndex = in.readInt();
        mEventsToWrite = in.readParcelable(UsageEvents.class.getClassLoader(),
            ParcelableUsageEventList.class).getList();
        mEventCount = mEventsToWrite.size();
        ParcelableUsageEventList slice = in.readParcelable(getClass().getClassLoader(),
                ParcelableUsageEventList.class);
        if (slice != null) {
            mEventsToWrite = slice.getList();
        } else {
            mEventsToWrite = new ArrayList<>();
        }

        if (mEventCount != mEventsToWrite.size()) {
            Log.w(TAG, "Partial usage event list received: " + mEventCount + " != "
                    + mEventsToWrite.size());
        }
    }

    private void readUsageEventsFromParcelWithBlob(Parcel in) {
@@ -1065,6 +1078,7 @@ public final class UsageEvents implements Parcelable {
    }

    private void writeUsageEventsToParcelWithParceledList(Parcel dest, int flags) {
        dest.writeInt(mEventCount);
        dest.writeInt(mIndex);
        dest.writeParcelable(new ParcelableUsageEventList(mEventsToWrite), flags);
    }
+24 −5
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static android.view.Surface.ROTATION_90;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
@@ -43,10 +44,28 @@ import java.util.Random;
@LargeTest
public class ParcelableUsageEventListTest {
    private static final int SMALL_TEST_EVENT_COUNT = 100;
    private static final int LARGE_TEST_EVENT_COUNT = 10000;
    private static final int LARGE_TEST_EVENT_COUNT = 30000;

    private Random mRandom = new Random();

    @Test
    public void testNullList() throws Exception {
        Parcel parcel = Parcel.obtain();
        try {
            parcel.writeParcelable(new ParcelableUsageEventList(null), 0);
            fail("Expected IllegalArgumentException with null list.");
        } catch (IllegalArgumentException expected) {
            // Expected.
        } finally {
            parcel.recycle();
        }
    }

    @Test
    public void testEmptyList() throws Exception {
        testParcelableUsageEventList(0);
    }

    @Test
    public void testSmallList() throws Exception {
        testParcelableUsageEventList(SMALL_TEST_EVENT_COUNT);
@@ -58,15 +77,15 @@ public class ParcelableUsageEventListTest {
    }

    private void testParcelableUsageEventList(int eventCount) throws Exception {
        List<Event> smallList = new ArrayList<>();
        List<Event> eventList = new ArrayList<>();
        for (int i = 0; i < eventCount; i++) {
            smallList.add(generateUsageEvent());
            eventList.add(generateUsageEvent());
        }

        ParcelableUsageEventList slice;
        Parcel parcel = Parcel.obtain();
        try {
            parcel.writeParcelable(new ParcelableUsageEventList(smallList), 0);
            parcel.writeParcelable(new ParcelableUsageEventList(eventList), 0);
            parcel.setDataPosition(0);
            slice = parcel.readParcelable(getClass().getClassLoader(),
                    ParcelableUsageEventList.class);
@@ -79,7 +98,7 @@ public class ParcelableUsageEventListTest {
        assertEquals(eventCount, slice.getList().size());

        for (int i = 0; i < eventCount; i++) {
            compareUsageEvent(smallList.get(i), slice.getList().get(i));
            compareUsageEvent(eventList.get(i), slice.getList().get(i));
        }
    }

+7 −0
Original line number Diff line number Diff line
@@ -1953,6 +1953,13 @@ public class UsageStatsService extends SystemService implements
            }
        }

        // Flags status.
        pw.println("Flags:");
        pw.println("    " + Flags.FLAG_USER_INTERACTION_TYPE_API
                + ": " + Flags.userInteractionTypeApi());
        pw.println("    " + Flags.FLAG_USE_PARCELED_LIST
                + ": " + Flags.useParceledList());

        final int[] userIds;
        synchronized (mLock) {
            final int userCount = mUserState.size();