Loading core/java/android/app/ActivityThread.java +4 −11 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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); Loading @@ -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); Loading Loading @@ -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); Loading core/java/android/app/ClientTransactionHandler.java +1 −1 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -68,7 +69,6 @@ public abstract class ClientTransactionHandler { getTransactionExecutor().execute(transaction); } finally { mIsExecutingLocalTransaction = false; transaction.recycle(); } } Loading core/java/android/app/servertransaction/ClientTransaction.java +38 −41 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading Loading @@ -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; } Loading Loading @@ -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); Loading core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading core/tests/coretests/src/android/app/servertransaction/ClientTransactionTests.java +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
core/java/android/app/ActivityThread.java +4 −11 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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); Loading @@ -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); Loading Loading @@ -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); Loading
core/java/android/app/ClientTransactionHandler.java +1 −1 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -68,7 +69,6 @@ public abstract class ClientTransactionHandler { getTransactionExecutor().execute(transaction); } finally { mIsExecutingLocalTransaction = false; transaction.recycle(); } } Loading
core/java/android/app/servertransaction/ClientTransaction.java +38 −41 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading Loading @@ -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; } Loading Loading @@ -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); Loading
core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading
core/tests/coretests/src/android/app/servertransaction/ClientTransactionTests.java +1 −1 Original line number Diff line number Diff line Loading @@ -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