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

Commit 1d39426b authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Remove ClientTransaction object pool usages (2/n)." into main

parents ce9cf432 e68b5c19
Loading
Loading
Loading
Loading
+4 −11
Original line number Diff line number Diff line
@@ -2636,13 +2636,6 @@ public final class ActivityThread extends ClientTransactionHandler
                    } finally {
                        controller.onClientTransactionFinished();
                    }
                    if (isSystem()) {
                        // Client transactions inside system process are recycled on the client side
                        // instead of ClientLifecycleManager to avoid being cleared before this
                        // message is handled.
                        transaction.recycle();
                    }
                    // TODO(lifecycler): Recycle locally scheduled transactions.
                    break;
                case RELAUNCH_ACTIVITY:
                    handleRelaunchActivityLocally((IBinder) msg.obj);
@@ -3824,7 +3817,7 @@ public final class ActivityThread extends ClientTransactionHandler
                + " req=" + requestCode + " res=" + resultCode + " data=" + data);
        final ArrayList<ResultInfo> list = new ArrayList<>();
        list.add(new ResultInfo(id, requestCode, resultCode, data, activityToken));
        final ClientTransaction clientTransaction = ClientTransaction.obtain(mAppThread);
        final ClientTransaction clientTransaction = new ClientTransaction(mAppThread);
        final ActivityResultItem activityResultItem = ActivityResultItem.obtain(
                activityToken, list);
        clientTransaction.addTransactionItem(activityResultItem);
@@ -4620,7 +4613,7 @@ public final class ActivityThread extends ClientTransactionHandler
    }

    private void schedulePauseWithUserLeavingHint(ActivityClientRecord r) {
        final ClientTransaction transaction = ClientTransaction.obtain(mAppThread);
        final ClientTransaction transaction = new ClientTransaction(mAppThread);
        final PauseActivityItem pauseActivityItem = PauseActivityItem.obtain(r.token,
                r.activity.isFinishing(), /* userLeaving */ true,
                /* dontReport */ false, /* autoEnteringPip */ false);
@@ -4629,7 +4622,7 @@ public final class ActivityThread extends ClientTransactionHandler
    }

    private void scheduleResume(ActivityClientRecord r) {
        final ClientTransaction transaction = ClientTransaction.obtain(mAppThread);
        final ClientTransaction transaction = new ClientTransaction(mAppThread);
        final ResumeActivityItem resumeActivityItem = ResumeActivityItem.obtain(r.token,
                /* isForward */ false, /* shouldSendCompatFakeFocus */ false);
        transaction.addTransactionItem(resumeActivityItem);
@@ -6254,7 +6247,7 @@ public final class ActivityThread extends ClientTransactionHandler
        final ActivityLifecycleItem lifecycleRequest =
                TransactionExecutorHelper.getLifecycleRequestForCurrentState(r);
        // Schedule the transaction.
        final ClientTransaction transaction = ClientTransaction.obtain(mAppThread);
        final ClientTransaction transaction = new ClientTransaction(mAppThread);
        transaction.addTransactionItem(activityRelaunchItem);
        transaction.addTransactionItem(lifecycleRequest);
        executeTransaction(transaction);
+1 −1
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import java.util.Map;
/**
 * Defines operations that a {@link android.app.servertransaction.ClientTransaction} or its items
 * can perform on client.
 *
 * @hide
 */
public abstract class ClientTransactionHandler {
@@ -68,7 +69,6 @@ public abstract class ClientTransactionHandler {
            getTransactionExecutor().execute(transaction);
        } finally {
            mIsExecutingLocalTransaction = false;
            transaction.recycle();
        }
    }

+38 −41
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package android.app.servertransaction;

import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;

import static java.util.Objects.requireNonNull;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ClientTransactionHandler;
@@ -30,7 +32,6 @@ import android.os.Parcelable;
import android.os.RemoteException;

import com.android.internal.annotations.VisibleForTesting;
import com.android.window.flags.Flags;

import java.io.PrintWriter;
import java.util.ArrayList;
@@ -46,7 +47,7 @@ import java.util.Objects;
 * @see ActivityLifecycleItem
 * @hide
 */
public class ClientTransaction implements Parcelable, ObjectPoolItem {
public class ClientTransaction implements Parcelable {

    /**
     * List of transaction items that should be executed in order. Including both
@@ -76,10 +77,39 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
    @Nullable
    private IBinder mActivityToken;

    /** Target client. */
    private IApplicationThread mClient;
    /**
     * The target client.
     * <p>
     * This field is null only if the object is:
     * - Read from a Parcel on the client side.
     * - Constructed for testing purposes.
     * <p>
     * When created directly on the server, this field represents the server's connection to the
     * target client's application thread. It is omitted during parceling and not sent to the
     * client. On the client side, this field becomes unnecessary.
     */
    @Nullable
    private final IApplicationThread mClient;

    @VisibleForTesting
    public ClientTransaction() {
        mClient = null;
    }

    /** Get the target client of the transaction. */
    public ClientTransaction(@NonNull IApplicationThread client) {
        mClient = requireNonNull(client);
    }

    /**
     * Gets the target client associated with this transaction.
     * <p>
     * This method is intended for server-side use only. Calling it from the client side
     * will always return {@code null}.
     *
     * @return the {@link IApplicationThread} representing the target client, or {@code null} if
     * called from the client side.
     * @see #mClient
     */
    public IApplicationThread getClient() {
        return mClient;
    }
@@ -211,51 +241,18 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
        mClient.scheduleTransaction(this);
    }


    // ObjectPoolItem implementation

    private ClientTransaction() {}

    /** Obtains an instance initialized with provided params. */
    @NonNull
    public static ClientTransaction obtain(@Nullable IApplicationThread client) {
        ClientTransaction instance = ObjectPool.obtain(ClientTransaction.class);
        if (instance == null) {
            instance = new ClientTransaction();
        }
        instance.mClient = client;

        return instance;
    }

    @Override
    public void recycle() {
        if (Flags.disableObjectPool()) {
            return;
        }
        int size = mTransactionItems.size();
        for (int i = 0; i < size; i++) {
            mTransactionItems.get(i).recycle();
        }
        mTransactionItems.clear();
        mActivityCallbacks = null;
        mLifecycleStateRequest = null;
        mClient = null;
        mActivityToken = null;
        ObjectPool.recycle(this);
    }

    // Parcelable implementation

    /** Write to Parcel. */
    /** Writes to Parcel. */
    @SuppressWarnings("AndroidFrameworkEfficientParcelable") // Item class is not final.
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeParcelableList(mTransactionItems, flags);
    }

    /** Read from Parcel. */
    /** Reads from Parcel. */
    private ClientTransaction(@NonNull Parcel in) {
        mClient = null;  // This field is unnecessary on the client side.
        in.readParcelableList(mTransactionItems, getClass().getClassLoader(),
                ClientTransactionItem.class);

+2 −2
Original line number Diff line number Diff line
@@ -78,10 +78,10 @@ import android.window.ActivityWindowInfo;
import android.window.WindowContextInfo;
import android.window.WindowTokenClientController;

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import androidx.test.runner.AndroidJUnit4;

import com.android.internal.content.ReferrerIntent;

@@ -1047,7 +1047,7 @@ public class ActivityThreadTest {

    @NonNull
    private static ClientTransaction newTransaction(@NonNull ActivityThread activityThread) {
        return ClientTransaction.obtain(activityThread.getApplicationThread());
        return new ClientTransaction(activityThread.getApplicationThread());
    }

    // Test activity
+1 −1
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@ public class ClientTransactionTests {
        final ClientTransactionHandler clientTransactionHandler =
                mock(ClientTransactionHandler.class);

        final ClientTransaction transaction = ClientTransaction.obtain(null /* client */);
        final ClientTransaction transaction = new ClientTransaction();
        transaction.addTransactionItem(callback1);
        transaction.addTransactionItem(callback2);
        transaction.addTransactionItem(stateRequest);
Loading