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

Commit 32d85627 authored by Chris Li's avatar Chris Li
Browse files

Add back @UnsupportedAppUsage in ClientTransaction

It is unfortunate that we have to keep the @UnsupportedAppUsage non-sdk
APIs.

Bug: 323964766
Bug: 324203798
Bug: 260873529
Test: pass existing tests
Change-Id: Ic964fdc5ef315949cb7498d1ac17e714a35f07bc
parent 8bc520e8
Loading
Loading
Loading
Loading
+103 −25
Original line number Original line Diff line number Diff line
@@ -23,6 +23,7 @@ import android.annotation.Nullable;
import android.app.ClientTransactionHandler;
import android.app.ClientTransactionHandler;
import android.app.IApplicationThread;
import android.app.IApplicationThread;
import android.compat.annotation.UnsupportedAppUsage;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.RemoteException;
@@ -53,6 +54,7 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
    private List<ClientTransactionItem> mTransactionItems;
    private List<ClientTransactionItem> mTransactionItems;


    /** A list of individual callbacks to a client. */
    /** A list of individual callbacks to a client. */
    // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
    @UnsupportedAppUsage
    @UnsupportedAppUsage
    @Nullable
    @Nullable
    private List<ClientTransactionItem> mActivityCallbacks;
    private List<ClientTransactionItem> mActivityCallbacks;
@@ -61,9 +63,15 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
     * Final lifecycle state in which the client activity should be after the transaction is
     * Final lifecycle state in which the client activity should be after the transaction is
     * executed.
     * executed.
     */
     */
    // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
    @Nullable
    @Nullable
    private ActivityLifecycleItem mLifecycleStateRequest;
    private ActivityLifecycleItem mLifecycleStateRequest;


    /** Only kept for unsupportedAppUsage {@link #getActivityToken()}. Must not be used. */
    // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
    @Nullable
    private IBinder mActivityToken;

    /** Target client. */
    /** Target client. */
    private IApplicationThread mClient;
    private IApplicationThread mClient;


@@ -81,6 +89,13 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
            mTransactionItems = new ArrayList<>();
            mTransactionItems = new ArrayList<>();
        }
        }
        mTransactionItems.add(item);
        mTransactionItems.add(item);

        // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
        if (item.isActivityLifecycleItem()) {
            setLifecycleStateRequest((ActivityLifecycleItem) item);
        } else {
            addCallback(item);
        }
    }
    }


    /**
    /**
@@ -97,18 +112,21 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
     * @param activityCallback A single message that can contain a lifecycle request/callback.
     * @param activityCallback A single message that can contain a lifecycle request/callback.
     * @deprecated use {@link #addTransactionItem(ClientTransactionItem)} instead.
     * @deprecated use {@link #addTransactionItem(ClientTransactionItem)} instead.
     */
     */
    // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
    @Deprecated
    @Deprecated
    public void addCallback(@NonNull ClientTransactionItem activityCallback) {
    public void addCallback(@NonNull ClientTransactionItem activityCallback) {
        if (mActivityCallbacks == null) {
        if (mActivityCallbacks == null) {
            mActivityCallbacks = new ArrayList<>();
            mActivityCallbacks = new ArrayList<>();
        }
        }
        mActivityCallbacks.add(activityCallback);
        mActivityCallbacks.add(activityCallback);
        setActivityTokenIfNotSet(activityCallback);
    }
    }


    /**
    /**
     * Gets the list of callbacks.
     * Gets the list of callbacks.
     * @deprecated use {@link #getTransactionItems()} instead.
     * @deprecated use {@link #getTransactionItems()} instead.
     */
     */
    // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
    @Nullable
    @Nullable
    @VisibleForTesting
    @VisibleForTesting
    @UnsupportedAppUsage
    @UnsupportedAppUsage
@@ -117,10 +135,25 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
        return mActivityCallbacks;
        return mActivityCallbacks;
    }
    }


    /**
     * @deprecated a transaction can contain {@link ClientTransactionItem} of different activities,
     * this must not be used. For any unsupported app usages, please be aware that this is set to
     * the activity of the first item in {@link #getTransactionItems()}.
     */
    // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
    @VisibleForTesting
    @Nullable
    @UnsupportedAppUsage
    @Deprecated
    public IBinder getActivityToken() {
        return mActivityToken;
    }

    /**
    /**
     * Gets the target state lifecycle request.
     * Gets the target state lifecycle request.
     * @deprecated use {@link #getTransactionItems()} instead.
     * @deprecated use {@link #getTransactionItems()} instead.
     */
     */
    // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
    @VisibleForTesting(visibility = PACKAGE)
    @VisibleForTesting(visibility = PACKAGE)
    @UnsupportedAppUsage
    @UnsupportedAppUsage
    @Deprecated
    @Deprecated
@@ -134,9 +167,21 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
     * @param stateRequest A lifecycle request initialized with right parameters.
     * @param stateRequest A lifecycle request initialized with right parameters.
     * @deprecated use {@link #addTransactionItem(ClientTransactionItem)} instead.
     * @deprecated use {@link #addTransactionItem(ClientTransactionItem)} instead.
     */
     */
    // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
    @Deprecated
    @Deprecated
    public void setLifecycleStateRequest(@NonNull ActivityLifecycleItem stateRequest) {
    public void setLifecycleStateRequest(@NonNull ActivityLifecycleItem stateRequest) {
        if (mLifecycleStateRequest != null) {
            return;
        }
        mLifecycleStateRequest = stateRequest;
        mLifecycleStateRequest = stateRequest;
        setActivityTokenIfNotSet(stateRequest);
    }

    // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
    private void setActivityTokenIfNotSet(@Nullable ClientTransactionItem item) {
        if (mActivityToken == null && item != null) {
            mActivityToken = item.getActivityToken();
        }
    }
    }


    /**
    /**
@@ -203,7 +248,11 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
                mTransactionItems.get(i).recycle();
                mTransactionItems.get(i).recycle();
            }
            }
            mTransactionItems = null;
            mTransactionItems = null;
        }
            mActivityCallbacks = null;
            mLifecycleStateRequest = null;
        } else {
            // Only needed when mTransactionItems is null, otherwise these will have the same
            // reference as mTransactionItems to support UnsupportedAppUsage.
            if (mActivityCallbacks != null) {
            if (mActivityCallbacks != null) {
                int size = mActivityCallbacks.size();
                int size = mActivityCallbacks.size();
                for (int i = 0; i < size; i++) {
                for (int i = 0; i < size; i++) {
@@ -215,7 +264,9 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
                mLifecycleStateRequest.recycle();
                mLifecycleStateRequest.recycle();
                mLifecycleStateRequest = null;
                mLifecycleStateRequest = null;
            }
            }
        }
        mClient = null;
        mClient = null;
        mActivityToken = null;
        ObjectPool.recycle(this);
        ObjectPool.recycle(this);
    }
    }


@@ -229,8 +280,10 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
        dest.writeBoolean(writeTransactionItems);
        dest.writeBoolean(writeTransactionItems);
        if (writeTransactionItems) {
        if (writeTransactionItems) {
            dest.writeParcelableList(mTransactionItems, flags);
            dest.writeParcelableList(mTransactionItems, flags);
        }
        } else {

            // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
            // Only write mLifecycleStateRequest and mActivityCallbacks when mTransactionItems is
            // null
            dest.writeParcelable(mLifecycleStateRequest, flags);
            dest.writeParcelable(mLifecycleStateRequest, flags);
            final boolean writeActivityCallbacks = mActivityCallbacks != null;
            final boolean writeActivityCallbacks = mActivityCallbacks != null;
            dest.writeBoolean(writeActivityCallbacks);
            dest.writeBoolean(writeActivityCallbacks);
@@ -238,6 +291,7 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
                dest.writeParcelableList(mActivityCallbacks, flags);
                dest.writeParcelableList(mActivityCallbacks, flags);
            }
            }
        }
        }
    }


    /** Read from Parcel. */
    /** Read from Parcel. */
    private ClientTransaction(@NonNull Parcel in) {
    private ClientTransaction(@NonNull Parcel in) {
@@ -246,15 +300,37 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
            mTransactionItems = new ArrayList<>();
            mTransactionItems = new ArrayList<>();
            in.readParcelableList(mTransactionItems, getClass().getClassLoader(),
            in.readParcelableList(mTransactionItems, getClass().getClassLoader(),
                    ClientTransactionItem.class);
                    ClientTransactionItem.class);
        }


            // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
            // Populate mLifecycleStateRequest and mActivityCallbacks from mTransactionItems so
            // that they have the same reference when there is UnsupportedAppUsage to those fields.
            final int size = mTransactionItems.size();
            for (int i = 0; i < size; i++) {
                final ClientTransactionItem item = mTransactionItems.get(i);
                if (item.isActivityLifecycleItem()) {
                    setLifecycleStateRequest((ActivityLifecycleItem) item);
                } else {
                    addCallback(item);
                }
            }
        } else {
            // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
            // Only read mLifecycleStateRequest and mActivityCallbacks when mTransactionItems is
            // null
            mLifecycleStateRequest = in.readParcelable(getClass().getClassLoader(),
            mLifecycleStateRequest = in.readParcelable(getClass().getClassLoader(),
                    ActivityLifecycleItem.class);
                    ActivityLifecycleItem.class);
            setActivityTokenIfNotSet(mLifecycleStateRequest);
            final boolean readActivityCallbacks = in.readBoolean();
            final boolean readActivityCallbacks = in.readBoolean();
            if (readActivityCallbacks) {
            if (readActivityCallbacks) {
                mActivityCallbacks = new ArrayList<>();
                mActivityCallbacks = new ArrayList<>();
                in.readParcelableList(mActivityCallbacks, getClass().getClassLoader(),
                in.readParcelableList(mActivityCallbacks, getClass().getClassLoader(),
                        ClientTransactionItem.class);
                        ClientTransactionItem.class);
                final int size = mActivityCallbacks.size();
                for (int i = 0; mActivityToken == null && i < size; i++) {
                    final ClientTransactionItem item = mActivityCallbacks.get(i);
                    setActivityTokenIfNotSet(item);
                }
            }
        }
        }
    }
    }


@@ -285,7 +361,8 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
        return Objects.equals(mTransactionItems, other.mTransactionItems)
        return Objects.equals(mTransactionItems, other.mTransactionItems)
                && Objects.equals(mActivityCallbacks, other.mActivityCallbacks)
                && Objects.equals(mActivityCallbacks, other.mActivityCallbacks)
                && Objects.equals(mLifecycleStateRequest, other.mLifecycleStateRequest)
                && Objects.equals(mLifecycleStateRequest, other.mLifecycleStateRequest)
                && mClient == other.mClient;
                && mClient == other.mClient
                && Objects.equals(mActivityToken, other.mActivityToken);
    }
    }


    @Override
    @Override
@@ -295,6 +372,7 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
        result = 31 * result + Objects.hashCode(mActivityCallbacks);
        result = 31 * result + Objects.hashCode(mActivityCallbacks);
        result = 31 * result + Objects.hashCode(mLifecycleStateRequest);
        result = 31 * result + Objects.hashCode(mLifecycleStateRequest);
        result = 31 * result + Objects.hashCode(mClient);
        result = 31 * result + Objects.hashCode(mClient);
        result = 31 * result + Objects.hashCode(mActivityToken);
        return result;
        return result;
    }
    }


+3 −4
Original line number Original line Diff line number Diff line
@@ -288,10 +288,6 @@ public class TransactionParcelTests {
        transaction.addTransactionItem(callback2);
        transaction.addTransactionItem(callback2);
        transaction.addTransactionItem(lifecycleRequest);
        transaction.addTransactionItem(lifecycleRequest);


        transaction.addCallback(callback1);
        transaction.addCallback(callback2);
        transaction.setLifecycleStateRequest(lifecycleRequest);

        writeAndPrepareForReading(transaction);
        writeAndPrepareForReading(transaction);


        // Read from parcel and assert
        // Read from parcel and assert
@@ -299,6 +295,7 @@ public class TransactionParcelTests {


        assertEquals(transaction.hashCode(), result.hashCode());
        assertEquals(transaction.hashCode(), result.hashCode());
        assertEquals(transaction, result);
        assertEquals(transaction, result);
        assertEquals(mActivityToken, result.getActivityToken());
    }
    }


    @Test
    @Test
@@ -319,6 +316,7 @@ public class TransactionParcelTests {


        assertEquals(transaction.hashCode(), result.hashCode());
        assertEquals(transaction.hashCode(), result.hashCode());
        assertEquals(transaction, result);
        assertEquals(transaction, result);
        assertEquals(mActivityToken, result.getActivityToken());
    }
    }


    @Test
    @Test
@@ -337,6 +335,7 @@ public class TransactionParcelTests {


        assertEquals(transaction.hashCode(), result.hashCode());
        assertEquals(transaction.hashCode(), result.hashCode());
        assertEquals(transaction, result);
        assertEquals(transaction, result);
        assertEquals(mActivityToken, result.getActivityToken());
    }
    }


    /** Write to {@link #mParcel} and reset its position to prepare for reading from the start. */
    /** Write to {@link #mParcel} and reset its position to prepare for reading from the start. */
+11 −5
Original line number Original line Diff line number Diff line
@@ -143,7 +143,9 @@ public class ClientLifecycleManagerTests extends SystemServiceTestsBase {
                mLifecycleManager.mPendingTransactions.get(mNonBinderClient);
                mLifecycleManager.mPendingTransactions.get(mNonBinderClient);
        assertEquals(1, transaction.getTransactionItems().size());
        assertEquals(1, transaction.getTransactionItems().size());
        assertEquals(mTransactionItem, transaction.getTransactionItems().get(0));
        assertEquals(mTransactionItem, transaction.getTransactionItems().get(0));
        assertNull(transaction.getCallbacks());
        // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
        assertEquals(1, transaction.getCallbacks().size());
        assertEquals(mTransactionItem, transaction.getCallbacks().get(0));
        assertNull(transaction.getLifecycleStateRequest());
        assertNull(transaction.getLifecycleStateRequest());
        verify(mLifecycleManager, never()).scheduleTransaction(any());
        verify(mLifecycleManager, never()).scheduleTransaction(any());


@@ -156,8 +158,10 @@ public class ClientLifecycleManagerTests extends SystemServiceTestsBase {
        assertEquals(2, transaction.getTransactionItems().size());
        assertEquals(2, transaction.getTransactionItems().size());
        assertEquals(mTransactionItem, transaction.getTransactionItems().get(0));
        assertEquals(mTransactionItem, transaction.getTransactionItems().get(0));
        assertEquals(mLifecycleItem, transaction.getTransactionItems().get(1));
        assertEquals(mLifecycleItem, transaction.getTransactionItems().get(1));
        assertNull(transaction.getCallbacks());
        // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
        assertNull(transaction.getLifecycleStateRequest());
        assertEquals(1, transaction.getCallbacks().size());
        assertEquals(mTransactionItem, transaction.getCallbacks().get(0));
        assertEquals(mLifecycleItem, transaction.getLifecycleStateRequest());
        verify(mLifecycleManager, never()).scheduleTransaction(any());
        verify(mLifecycleManager, never()).scheduleTransaction(any());
    }
    }


@@ -202,8 +206,10 @@ public class ClientLifecycleManagerTests extends SystemServiceTestsBase {
        assertEquals(2, transaction.getTransactionItems().size());
        assertEquals(2, transaction.getTransactionItems().size());
        assertEquals(mTransactionItem, transaction.getTransactionItems().get(0));
        assertEquals(mTransactionItem, transaction.getTransactionItems().get(0));
        assertEquals(mLifecycleItem, transaction.getTransactionItems().get(1));
        assertEquals(mLifecycleItem, transaction.getTransactionItems().get(1));
        assertNull(transaction.getCallbacks());
        // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
        assertNull(transaction.getLifecycleStateRequest());
        assertEquals(1, transaction.getCallbacks().size());
        assertEquals(mTransactionItem, transaction.getCallbacks().get(0));
        assertEquals(mLifecycleItem, transaction.getLifecycleStateRequest());
        verify(mLifecycleManager, never()).scheduleTransaction(any());
        verify(mLifecycleManager, never()).scheduleTransaction(any());
    }
    }