diff options
11 files changed, 140 insertions, 189 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 926e297a1098..e6a2c07b6ff2 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -237,7 +237,6 @@ import com.android.internal.util.Preconditions; import com.android.internal.util.function.pooled.PooledLambda; import com.android.org.conscrypt.TrustedCertificateStore; import com.android.server.am.MemInfoDumpProto; -import com.android.window.flags.Flags; import dalvik.annotation.optimization.NeverCompile; import dalvik.system.AppSpecializationHooks; @@ -3762,11 +3761,7 @@ public final class ActivityThread extends ClientTransactionHandler final ClientTransaction clientTransaction = ClientTransaction.obtain(mAppThread); final ActivityResultItem activityResultItem = ActivityResultItem.obtain( activityToken, list); - if (Flags.bundleClientTransactionFlag()) { - clientTransaction.addTransactionItem(activityResultItem); - } else { - clientTransaction.addCallback(activityResultItem); - } + clientTransaction.addTransactionItem(activityResultItem); try { mAppThread.scheduleTransaction(clientTransaction); } catch (RemoteException e) { @@ -4553,11 +4548,7 @@ public final class ActivityThread extends ClientTransactionHandler final PauseActivityItem pauseActivityItem = PauseActivityItem.obtain(r.token, r.activity.isFinishing(), /* userLeaving */ true, r.activity.mConfigChangeFlags, /* dontReport */ false, /* autoEnteringPip */ false); - if (Flags.bundleClientTransactionFlag()) { - transaction.addTransactionItem(pauseActivityItem); - } else { - transaction.setLifecycleStateRequest(pauseActivityItem); - } + transaction.addTransactionItem(pauseActivityItem); executeTransaction(transaction); } @@ -4565,11 +4556,7 @@ public final class ActivityThread extends ClientTransactionHandler final ClientTransaction transaction = ClientTransaction.obtain(mAppThread); final ResumeActivityItem resumeActivityItem = ResumeActivityItem.obtain(r.token, /* isForward */ false, /* shouldSendCompatFakeFocus */ false); - if (Flags.bundleClientTransactionFlag()) { - transaction.addTransactionItem(resumeActivityItem); - } else { - transaction.setLifecycleStateRequest(resumeActivityItem); - } + transaction.addTransactionItem(resumeActivityItem); executeTransaction(transaction); } @@ -6189,13 +6176,8 @@ public final class ActivityThread extends ClientTransactionHandler TransactionExecutorHelper.getLifecycleRequestForCurrentState(r); // Schedule the transaction. final ClientTransaction transaction = ClientTransaction.obtain(mAppThread); - if (Flags.bundleClientTransactionFlag()) { - transaction.addTransactionItem(activityRelaunchItem); - transaction.addTransactionItem(lifecycleRequest); - } else { - transaction.addCallback(activityRelaunchItem); - transaction.setLifecycleStateRequest(lifecycleRequest); - } + transaction.addTransactionItem(activityRelaunchItem); + transaction.addTransactionItem(lifecycleRequest); executeTransaction(transaction); } diff --git a/core/java/android/app/servertransaction/ClientTransaction.java b/core/java/android/app/servertransaction/ClientTransaction.java index 612d433adcd6..79696e047904 100644 --- a/core/java/android/app/servertransaction/ClientTransaction.java +++ b/core/java/android/app/servertransaction/ClientTransaction.java @@ -29,6 +29,7 @@ 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; @@ -85,12 +86,15 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { * @param item A single message that can contain a client activity/window request/callback. */ public void addTransactionItem(@NonNull ClientTransactionItem item) { - if (mTransactionItems == null) { - mTransactionItems = new ArrayList<>(); + if (Flags.bundleClientTransactionFlag()) { + if (mTransactionItems == null) { + mTransactionItems = new ArrayList<>(); + } + mTransactionItems.add(item); } - mTransactionItems.add(item); // TODO(b/324203798): cleanup after remove UnsupportedAppUsage + // Populate even if mTransactionItems is set to support the UnsupportedAppUsage. if (item.isActivityLifecycleItem()) { setLifecycleStateRequest((ActivityLifecycleItem) item); } else { @@ -114,7 +118,7 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @Deprecated - public void addCallback(@NonNull ClientTransactionItem activityCallback) { + private void addCallback(@NonNull ClientTransactionItem activityCallback) { if (mActivityCallbacks == null) { mActivityCallbacks = new ArrayList<>(); } @@ -169,7 +173,7 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @Deprecated - public void setLifecycleStateRequest(@NonNull ActivityLifecycleItem stateRequest) { + private void setLifecycleStateRequest(@NonNull ActivityLifecycleItem stateRequest) { if (mLifecycleStateRequest != null) { return; } diff --git a/core/java/android/app/servertransaction/ClientTransactionListenerController.java b/core/java/android/app/servertransaction/ClientTransactionListenerController.java index 9f97f6ff7c39..1a8136e06c28 100644 --- a/core/java/android/app/servertransaction/ClientTransactionListenerController.java +++ b/core/java/android/app/servertransaction/ClientTransactionListenerController.java @@ -23,7 +23,6 @@ import static java.util.Objects.requireNonNull; import android.annotation.NonNull; import android.app.ActivityThread; import android.hardware.display.DisplayManagerGlobal; -import android.os.Process; import com.android.internal.annotations.VisibleForTesting; @@ -67,7 +66,7 @@ public class ClientTransactionListenerController { * window configuration. */ public void onDisplayChanged(int displayId) { - if (!isBundleClientTransactionFlagEnabled()) { + if (!bundleClientTransactionFlag()) { return; } if (ActivityThread.isSystem()) { @@ -76,10 +75,4 @@ public class ClientTransactionListenerController { } mDisplayManager.handleDisplayChangeFromWindowManager(displayId); } - - /** Whether {@link #bundleClientTransactionFlag} feature flag is enabled. */ - public boolean isBundleClientTransactionFlagEnabled() { - // Can't read flag from isolated process. - return !Process.isIsolated() && bundleClientTransactionFlag(); - } } diff --git a/core/java/android/app/servertransaction/TransactionExecutor.java b/core/java/android/app/servertransaction/TransactionExecutor.java index 406e00a84710..fa73c99be2b8 100644 --- a/core/java/android/app/servertransaction/TransactionExecutor.java +++ b/core/java/android/app/servertransaction/TransactionExecutor.java @@ -40,7 +40,6 @@ import android.app.ClientTransactionHandler; import android.content.Context; import android.content.res.Configuration; import android.os.IBinder; -import android.os.Process; import android.os.Trace; import android.util.ArrayMap; import android.util.ArraySet; @@ -218,8 +217,6 @@ public class TransactionExecutor { final boolean shouldTrackConfigUpdatedContext = // No configuration change for local transaction. !mTransactionHandler.isExecutingLocalTransaction() - // Can't read flag from isolated process. - && !Process.isIsolated() && bundleClientTransactionFlag(); final Context configUpdatedContext = shouldTrackConfigUpdatedContext ? item.getContextToUpdate(mTransactionHandler) diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java index 48ef7e6f11a8..ebf4cca9ebc2 100644 --- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java @@ -43,7 +43,6 @@ import android.app.PictureInPictureParams; import android.app.PictureInPictureUiState; import android.app.ResourcesManager; import android.app.servertransaction.ActivityConfigurationChangeItem; -import android.app.servertransaction.ActivityLifecycleItem; import android.app.servertransaction.ActivityRelaunchItem; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransactionItem; @@ -75,7 +74,6 @@ import androidx.test.rule.ActivityTestRule; import androidx.test.runner.AndroidJUnit4; import com.android.internal.content.ReferrerIntent; -import com.android.window.flags.Flags; import org.junit.After; import org.junit.Before; @@ -230,7 +228,7 @@ public class ActivityThreadTest { try { // Send process level config change. ClientTransaction transaction = newTransaction(activityThread); - addClientTransactionItem(transaction, ConfigurationChangeItem.obtain( + transaction.addTransactionItem(ConfigurationChangeItem.obtain( newConfig, DEVICE_ID_INVALID)); appThread.scheduleTransaction(transaction); InstrumentationRegistry.getInstrumentation().waitForIdleSync(); @@ -247,7 +245,7 @@ public class ActivityThreadTest { newConfig.seq++; newConfig.smallestScreenWidthDp++; transaction = newTransaction(activityThread); - addClientTransactionItem(transaction, ActivityConfigurationChangeItem.obtain( + transaction.addTransactionItem(ActivityConfigurationChangeItem.obtain( activity.getActivityToken(), newConfig)); appThread.scheduleTransaction(transaction); InstrumentationRegistry.getInstrumentation().waitForIdleSync(); @@ -448,16 +446,16 @@ public class ActivityThreadTest { activity.mTestLatch = new CountDownLatch(1); ClientTransaction transaction = newTransaction(activityThread); - addClientTransactionItem(transaction, ConfigurationChangeItem.obtain( + transaction.addTransactionItem(ConfigurationChangeItem.obtain( processConfigLandscape, DEVICE_ID_INVALID)); appThread.scheduleTransaction(transaction); transaction = newTransaction(activityThread); - addClientTransactionItem(transaction, ActivityConfigurationChangeItem.obtain( + transaction.addTransactionItem(ActivityConfigurationChangeItem.obtain( activity.getActivityToken(), activityConfigLandscape)); - addClientTransactionItem(transaction, ConfigurationChangeItem.obtain( + transaction.addTransactionItem(ConfigurationChangeItem.obtain( processConfigPortrait, DEVICE_ID_INVALID)); - addClientTransactionItem(transaction, ActivityConfigurationChangeItem.obtain( + transaction.addTransactionItem(ActivityConfigurationChangeItem.obtain( activity.getActivityToken(), activityConfigPortrait)); appThread.scheduleTransaction(transaction); @@ -847,8 +845,8 @@ public class ActivityThreadTest { false /* shouldSendCompatFakeFocus*/); final ClientTransaction transaction = newTransaction(activity); - addClientTransactionItem(transaction, callbackItem); - addClientTransactionItem(transaction, resumeStateRequest); + transaction.addTransactionItem(callbackItem); + transaction.addTransactionItem(resumeStateRequest); return transaction; } @@ -860,7 +858,7 @@ public class ActivityThreadTest { false /* shouldSendCompatFakeFocus */); final ClientTransaction transaction = newTransaction(activity); - addClientTransactionItem(transaction, resumeStateRequest); + transaction.addTransactionItem(resumeStateRequest); return transaction; } @@ -871,7 +869,7 @@ public class ActivityThreadTest { activity.getActivityToken(), 0 /* configChanges */); final ClientTransaction transaction = newTransaction(activity); - addClientTransactionItem(transaction, stopStateRequest); + transaction.addTransactionItem(stopStateRequest); return transaction; } @@ -883,7 +881,7 @@ public class ActivityThreadTest { activity.getActivityToken(), config); final ClientTransaction transaction = newTransaction(activity); - addClientTransactionItem(transaction, item); + transaction.addTransactionItem(item); return transaction; } @@ -895,7 +893,7 @@ public class ActivityThreadTest { resume); final ClientTransaction transaction = newTransaction(activity); - addClientTransactionItem(transaction, item); + transaction.addTransactionItem(item); return transaction; } @@ -910,17 +908,6 @@ public class ActivityThreadTest { return ClientTransaction.obtain(activityThread.getApplicationThread()); } - private static void addClientTransactionItem(@NonNull ClientTransaction transaction, - @NonNull ClientTransactionItem item) { - if (Flags.bundleClientTransactionFlag()) { - transaction.addTransactionItem(item); - } else if (item.isActivityLifecycleItem()) { - transaction.setLifecycleStateRequest((ActivityLifecycleItem) item); - } else { - transaction.addCallback(item); - } - } - // Test activity public static class TestActivity extends Activity { static final String PIP_REQUESTED_OVERRIDE_ENTER = "pip_requested_override_enter"; diff --git a/core/tests/coretests/src/android/app/servertransaction/ClientTransactionListenerControllerTest.java b/core/tests/coretests/src/android/app/servertransaction/ClientTransactionListenerControllerTest.java index 95d50499b92f..213fd7bd494d 100644 --- a/core/tests/coretests/src/android/app/servertransaction/ClientTransactionListenerControllerTest.java +++ b/core/tests/coretests/src/android/app/servertransaction/ClientTransactionListenerControllerTest.java @@ -16,10 +16,13 @@ package android.app.servertransaction; +import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT; + import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; +import static com.android.window.flags.Flags.FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG; + import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import android.hardware.display.DisplayManager; @@ -28,12 +31,14 @@ import android.hardware.display.IDisplayManager; import android.os.Handler; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; +import android.platform.test.flag.junit.SetFlagsRule; import android.view.DisplayInfo; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -49,6 +54,10 @@ import org.mockito.MockitoAnnotations; @SmallTest @Presubmit public class ClientTransactionListenerControllerTest { + + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(DEVICE_DEFAULT); + @Mock private IDisplayManager mIDisplayManager; @Mock @@ -60,12 +69,12 @@ public class ClientTransactionListenerControllerTest { @Before public void setup() { + mSetFlagsRule.enableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG); + MockitoAnnotations.initMocks(this); mDisplayManager = new DisplayManagerGlobal(mIDisplayManager); mHandler = getInstrumentation().getContext().getMainThreadHandler(); - mController = spy(ClientTransactionListenerController.createInstanceForTesting( - mDisplayManager)); - doReturn(true).when(mController).isBundleClientTransactionFlagEnabled(); + mController = ClientTransactionListenerController.createInstanceForTesting(mDisplayManager); } @Test diff --git a/core/tests/coretests/src/android/app/servertransaction/ClientTransactionTests.java b/core/tests/coretests/src/android/app/servertransaction/ClientTransactionTests.java index d10cf1691408..527241613a7a 100644 --- a/core/tests/coretests/src/android/app/servertransaction/ClientTransactionTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/ClientTransactionTests.java @@ -16,16 +16,22 @@ package android.app.servertransaction; +import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT; + +import static com.android.window.flags.Flags.FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG; + +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.app.ClientTransactionHandler; import android.platform.test.annotations.Presubmit; +import android.platform.test.flag.junit.SetFlagsRule; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -43,31 +49,28 @@ import org.junit.runner.RunWith; @Presubmit public class ClientTransactionTests { + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(DEVICE_DEFAULT); + @Test public void testPreExecute() { - final ClientTransactionItem callback1 = mock(ClientTransactionItem.class); - final ClientTransactionItem callback2 = mock(ClientTransactionItem.class); - final ActivityLifecycleItem stateRequest = mock(ActivityLifecycleItem.class); - final ClientTransactionHandler clientTransactionHandler = - mock(ClientTransactionHandler.class); + mSetFlagsRule.disableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG); - final ClientTransaction transaction = ClientTransaction.obtain(null /* client */); - transaction.addCallback(callback1); - transaction.addCallback(callback2); - transaction.setLifecycleStateRequest(stateRequest); + testPreExecuteInner(); + } - transaction.preExecute(clientTransactionHandler); + @Test + public void testPreExecute_bundleClientTransaction() { + mSetFlagsRule.enableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG); - verify(callback1, times(1)).preExecute(clientTransactionHandler); - verify(callback2, times(1)).preExecute(clientTransactionHandler); - verify(stateRequest, times(1)).preExecute(clientTransactionHandler); + testPreExecuteInner(); } - @Test - public void testPreExecuteTransactionItems() { + private void testPreExecuteInner() { final ClientTransactionItem callback1 = mock(ClientTransactionItem.class); final ClientTransactionItem callback2 = mock(ClientTransactionItem.class); final ActivityLifecycleItem stateRequest = mock(ActivityLifecycleItem.class); + doReturn(true).when(stateRequest).isActivityLifecycleItem(); final ClientTransactionHandler clientTransactionHandler = mock(ClientTransactionHandler.class); @@ -78,8 +81,8 @@ public class ClientTransactionTests { transaction.preExecute(clientTransactionHandler); - verify(callback1, times(1)).preExecute(clientTransactionHandler); - verify(callback2, times(1)).preExecute(clientTransactionHandler); - verify(stateRequest, times(1)).preExecute(clientTransactionHandler); + verify(callback1).preExecute(clientTransactionHandler); + verify(callback2).preExecute(clientTransactionHandler); + verify(stateRequest).preExecute(clientTransactionHandler); } } diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java index 2315a58eb487..adb6f2a23847 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java @@ -25,6 +25,9 @@ import static android.app.servertransaction.ActivityLifecycleItem.ON_START; import static android.app.servertransaction.ActivityLifecycleItem.ON_STOP; import static android.app.servertransaction.ActivityLifecycleItem.PRE_ON_CREATE; import static android.app.servertransaction.ActivityLifecycleItem.UNDEFINED; +import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT; + +import static com.android.window.flags.Flags.FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; @@ -51,12 +54,14 @@ import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; import android.platform.test.annotations.Presubmit; +import android.platform.test.flag.junit.SetFlagsRule; import android.util.ArrayMap; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InOrder; @@ -83,6 +88,9 @@ import java.util.stream.Collectors; @Presubmit public class TransactionExecutorTests { + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(DEVICE_DEFAULT); + @Mock private ClientTransactionHandler mTransactionHandler; @Mock @@ -240,29 +248,19 @@ public class TransactionExecutorTests { @Test public void testTransactionResolution() { - ClientTransactionItem callback1 = mock(ClientTransactionItem.class); - when(callback1.getPostExecutionState()).thenReturn(UNDEFINED); - ClientTransactionItem callback2 = mock(ClientTransactionItem.class); - when(callback2.getPostExecutionState()).thenReturn(UNDEFINED); + mSetFlagsRule.disableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG); - ClientTransaction transaction = ClientTransaction.obtain(null /* client */); - transaction.addCallback(callback1); - transaction.addCallback(callback2); - transaction.setLifecycleStateRequest(mActivityLifecycleItem); + testTransactionResolutionInner(); + } - transaction.preExecute(mTransactionHandler); - mExecutor.execute(transaction); + @Test + public void testTransactionResolution_bundleClientTransaction() { + mSetFlagsRule.enableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG); - InOrder inOrder = inOrder(mTransactionHandler, callback1, callback2, - mActivityLifecycleItem); - inOrder.verify(callback1).execute(eq(mTransactionHandler), any()); - inOrder.verify(callback2).execute(eq(mTransactionHandler), any()); - inOrder.verify(mActivityLifecycleItem).execute(eq(mTransactionHandler), eq(mClientRecord), - any()); + testTransactionResolutionInner(); } - @Test - public void testExecuteTransactionItems_transactionResolution() { + private void testTransactionResolutionInner() { ClientTransactionItem callback1 = mock(ClientTransactionItem.class); when(callback1.getPostExecutionState()).thenReturn(UNDEFINED); ClientTransactionItem callback2 = mock(ClientTransactionItem.class); @@ -286,38 +284,19 @@ public class TransactionExecutorTests { @Test public void testDoNotLaunchDestroyedActivity() { - final Map<IBinder, DestroyActivityItem> activitiesToBeDestroyed = new ArrayMap<>(); - when(mTransactionHandler.getActivitiesToBeDestroyed()).thenReturn(activitiesToBeDestroyed); - // Assume launch transaction is still in queue, so there is no client record. - when(mTransactionHandler.getActivityClient(any())).thenReturn(null); - - // An incoming destroy transaction enters binder thread (preExecute). - final IBinder token = mock(IBinder.class); - final ClientTransaction destroyTransaction = ClientTransaction.obtain(null /* client */); - destroyTransaction.setLifecycleStateRequest( - DestroyActivityItem.obtain(token, false /* finished */, 0 /* configChanges */)); - destroyTransaction.preExecute(mTransactionHandler); - // The activity should be added to to-be-destroyed container. - assertEquals(1, activitiesToBeDestroyed.size()); + mSetFlagsRule.disableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG); - // A previous queued launch transaction runs on main thread (execute). - final ClientTransaction launchTransaction = ClientTransaction.obtain(null /* client */); - final LaunchActivityItem launchItem = - spy(new LaunchActivityItemBuilder(token, new Intent(), new ActivityInfo()).build()); - launchTransaction.addCallback(launchItem); - mExecutor.execute(launchTransaction); + testDoNotLaunchDestroyedActivityInner(); + } - // The launch transaction should not be executed because its token is in the - // to-be-destroyed container. - verify(launchItem, never()).execute(any(), any()); + @Test + public void testDoNotLaunchDestroyedActivity_bundleClientTransaction() { + mSetFlagsRule.enableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG); - // After the destroy transaction has been executed, the token should be removed. - mExecutor.execute(destroyTransaction); - assertTrue(activitiesToBeDestroyed.isEmpty()); + testDoNotLaunchDestroyedActivityInner(); } - @Test - public void testExecuteTransactionItems_doNotLaunchDestroyedActivity() { + private void testDoNotLaunchDestroyedActivityInner() { final Map<IBinder, DestroyActivityItem> activitiesToBeDestroyed = new ArrayMap<>(); when(mTransactionHandler.getActivitiesToBeDestroyed()).thenReturn(activitiesToBeDestroyed); // Assume launch transaction is still in queue, so there is no client record. @@ -350,26 +329,19 @@ public class TransactionExecutorTests { @Test public void testActivityResultRequiredStateResolution() { - when(mTransactionHandler.getActivity(any())).thenReturn(mock(Activity.class)); - - PostExecItem postExecItem = new PostExecItem(ON_RESUME); + mSetFlagsRule.disableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG); - ClientTransaction transaction = ClientTransaction.obtain(null /* client */); - transaction.addCallback(postExecItem); + testActivityResultRequiredStateResolutionInner(); + } - // Verify resolution that should get to onPause - mClientRecord.setState(ON_RESUME); - mExecutor.executeCallbacks(transaction); - verify(mExecutor).cycleToPath(eq(mClientRecord), eq(ON_PAUSE), eq(transaction)); + @Test + public void testActivityResultRequiredStateResolution_bundleClientTransaction() { + mSetFlagsRule.enableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG); - // Verify resolution that should get to onStart - mClientRecord.setState(ON_STOP); - mExecutor.executeCallbacks(transaction); - verify(mExecutor).cycleToPath(eq(mClientRecord), eq(ON_START), eq(transaction)); + testActivityResultRequiredStateResolutionInner(); } - @Test - public void testExecuteTransactionItems_activityResultRequiredStateResolution() { + private void testActivityResultRequiredStateResolutionInner() { when(mTransactionHandler.getActivity(any())).thenReturn(mock(Activity.class)); PostExecItem postExecItem = new PostExecItem(ON_RESUME); @@ -379,12 +351,12 @@ public class TransactionExecutorTests { // Verify resolution that should get to onPause mClientRecord.setState(ON_RESUME); - mExecutor.executeTransactionItems(transaction); + mExecutor.execute(transaction); verify(mExecutor).cycleToPath(eq(mClientRecord), eq(ON_PAUSE), eq(transaction)); // Verify resolution that should get to onStart mClientRecord.setState(ON_STOP); - mExecutor.executeTransactionItems(transaction); + mExecutor.execute(transaction); verify(mExecutor).cycleToPath(eq(mClientRecord), eq(ON_START), eq(transaction)); } @@ -523,18 +495,19 @@ public class TransactionExecutorTests { @Test(expected = IllegalArgumentException.class) public void testActivityItemNullRecordThrowsException() { - final ActivityTransactionItem activityItem = mock(ActivityTransactionItem.class); - when(activityItem.getPostExecutionState()).thenReturn(UNDEFINED); - final IBinder token = mock(IBinder.class); - final ClientTransaction transaction = ClientTransaction.obtain(null /* client */); - transaction.addCallback(activityItem); - when(mTransactionHandler.getActivityClient(token)).thenReturn(null); + mSetFlagsRule.disableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG); - mExecutor.executeCallbacks(transaction); + testActivityItemNullRecordThrowsExceptionInner(); } @Test(expected = IllegalArgumentException.class) - public void testExecuteTransactionItems_activityItemNullRecordThrowsException() { + public void testActivityItemNullRecordThrowsException_bundleClientTransaction() { + mSetFlagsRule.enableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG); + + testActivityItemNullRecordThrowsExceptionInner(); + } + + private void testActivityItemNullRecordThrowsExceptionInner() { final ActivityTransactionItem activityItem = mock(ActivityTransactionItem.class); when(activityItem.getPostExecutionState()).thenReturn(UNDEFINED); final IBinder token = mock(IBinder.class); @@ -542,28 +515,24 @@ public class TransactionExecutorTests { transaction.addTransactionItem(activityItem); when(mTransactionHandler.getActivityClient(token)).thenReturn(null); - mExecutor.executeTransactionItems(transaction); + mExecutor.execute(transaction); } @Test public void testActivityItemExecute() { - final ClientTransaction transaction = ClientTransaction.obtain(null /* client */); - final ActivityTransactionItem activityItem = mock(ActivityTransactionItem.class); - when(activityItem.getPostExecutionState()).thenReturn(UNDEFINED); - when(activityItem.getActivityToken()).thenReturn(mActivityToken); - transaction.addCallback(activityItem); - transaction.setLifecycleStateRequest(mActivityLifecycleItem); - - mExecutor.execute(transaction); + mSetFlagsRule.disableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG); - final InOrder inOrder = inOrder(activityItem, mActivityLifecycleItem); - inOrder.verify(activityItem).execute(eq(mTransactionHandler), eq(mClientRecord), any()); - inOrder.verify(mActivityLifecycleItem).execute(eq(mTransactionHandler), eq(mClientRecord), - any()); + testActivityItemExecuteInner(); } @Test - public void testExecuteTransactionItems_activityItemExecute() { + public void testActivityItemExecute_bundleClientTransaction() { + mSetFlagsRule.enableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG); + + testActivityItemExecuteInner(); + } + + private void testActivityItemExecuteInner() { final ClientTransaction transaction = ClientTransaction.obtain(null /* client */); final ActivityTransactionItem activityItem = mock(ActivityTransactionItem.class); when(activityItem.getPostExecutionState()).thenReturn(UNDEFINED); diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java index c30d216208f9..aa8001310008 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java @@ -20,6 +20,9 @@ import static android.app.servertransaction.TestUtils.config; import static android.app.servertransaction.TestUtils.mergedConfig; import static android.app.servertransaction.TestUtils.referrerIntentList; import static android.app.servertransaction.TestUtils.resultInfoList; +import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT; + +import static com.android.window.flags.Flags.FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG; import static org.junit.Assert.assertEquals; @@ -36,11 +39,13 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.PersistableBundle; import android.platform.test.annotations.Presubmit; +import android.platform.test.flag.junit.SetFlagsRule; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -60,6 +65,9 @@ import java.util.ArrayList; @Presubmit public class TransactionParcelTests { + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(DEVICE_DEFAULT); + private Parcel mParcel; private IBinder mActivityToken; @@ -275,6 +283,8 @@ public class TransactionParcelTests { @Test public void testClientTransaction() { + mSetFlagsRule.enableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG); + // Write to parcel NewIntentItem callback1 = NewIntentItem.obtain(mActivityToken, new ArrayList<>(), true); ActivityConfigurationChangeItem callback2 = ActivityConfigurationChangeItem.obtain( @@ -300,14 +310,16 @@ public class TransactionParcelTests { @Test public void testClientTransactionCallbacksOnly() { + mSetFlagsRule.disableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG); + // Write to parcel NewIntentItem callback1 = NewIntentItem.obtain(mActivityToken, new ArrayList<>(), true); ActivityConfigurationChangeItem callback2 = ActivityConfigurationChangeItem.obtain( mActivityToken, config()); ClientTransaction transaction = ClientTransaction.obtain(null /* client */); - transaction.addCallback(callback1); - transaction.addCallback(callback2); + transaction.addTransactionItem(callback1); + transaction.addTransactionItem(callback2); writeAndPrepareForReading(transaction); @@ -321,12 +333,14 @@ public class TransactionParcelTests { @Test public void testClientTransactionLifecycleOnly() { + mSetFlagsRule.disableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG); + // Write to parcel StopActivityItem lifecycleRequest = StopActivityItem.obtain(mActivityToken, 78 /* configChanges */); ClientTransaction transaction = ClientTransaction.obtain(null /* client */); - transaction.setLifecycleStateRequest(lifecycleRequest); + transaction.addTransactionItem(lifecycleRequest); writeAndPrepareForReading(transaction); diff --git a/services/core/java/com/android/server/wm/ClientLifecycleManager.java b/services/core/java/com/android/server/wm/ClientLifecycleManager.java index 5b4fb3e6971f..e48e4e84d60d 100644 --- a/services/core/java/com/android/server/wm/ClientLifecycleManager.java +++ b/services/core/java/com/android/server/wm/ClientLifecycleManager.java @@ -87,11 +87,7 @@ class ClientLifecycleManager { void scheduleTransactionItemNow(@NonNull IApplicationThread client, @NonNull ClientTransactionItem transactionItem) throws RemoteException { final ClientTransaction clientTransaction = ClientTransaction.obtain(client); - if (transactionItem.isActivityLifecycleItem()) { - clientTransaction.setLifecycleStateRequest((ActivityLifecycleItem) transactionItem); - } else { - clientTransaction.addCallback(transactionItem); - } + clientTransaction.addTransactionItem(transactionItem); scheduleTransaction(clientTransaction); } @@ -115,11 +111,8 @@ class ClientLifecycleManager { } else { // TODO(b/260873529): cleanup after launch. final ClientTransaction clientTransaction = ClientTransaction.obtain(client); - if (transactionItem.isActivityLifecycleItem()) { - clientTransaction.setLifecycleStateRequest((ActivityLifecycleItem) transactionItem); - } else { - clientTransaction.addCallback(transactionItem); - } + clientTransaction.addTransactionItem(transactionItem); + scheduleTransaction(clientTransaction); } } @@ -160,8 +153,8 @@ class ClientLifecycleManager { } else { // TODO(b/260873529): cleanup after launch. final ClientTransaction clientTransaction = ClientTransaction.obtain(client); - clientTransaction.addCallback(transactionItem); - clientTransaction.setLifecycleStateRequest(lifecycleItem); + clientTransaction.addTransactionItem(transactionItem); + clientTransaction.addTransactionItem(lifecycleItem); scheduleTransaction(clientTransaction); } } diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 838ce86515cd..10cbc6633533 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -1590,7 +1590,7 @@ class TaskFragment extends WindowContainer<WindowContainer> { mAtmService.getLifecycleManager().scheduleTransactionItem( appThread, activityResultItem); } else { - transaction.addCallback(activityResultItem); + transaction.addTransactionItem(activityResultItem); } } } @@ -1602,7 +1602,7 @@ class TaskFragment extends WindowContainer<WindowContainer> { mAtmService.getLifecycleManager().scheduleTransactionItem( appThread, newIntentItem); } else { - transaction.addCallback(newIntentItem); + transaction.addTransactionItem(newIntentItem); } } @@ -1624,7 +1624,7 @@ class TaskFragment extends WindowContainer<WindowContainer> { mAtmService.getLifecycleManager().scheduleTransactionItem( appThread, resumeActivityItem); } else { - transaction.setLifecycleStateRequest(resumeActivityItem); + transaction.addTransactionItem(resumeActivityItem); mAtmService.getLifecycleManager().scheduleTransaction(transaction); } |