Loading core/java/android/app/ActivityThread.java +29 −7 Original line number Diff line number Diff line Loading @@ -232,6 +232,7 @@ 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; Loading Loading @@ -3713,7 +3714,13 @@ public final class ActivityThread extends ClientTransactionHandler final ArrayList<ResultInfo> list = new ArrayList<>(); list.add(new ResultInfo(id, requestCode, resultCode, data)); final ClientTransaction clientTransaction = ClientTransaction.obtain(mAppThread); clientTransaction.addCallback(ActivityResultItem.obtain(activityToken, list)); final ActivityResultItem activityResultItem = ActivityResultItem.obtain( activityToken, list); if (Flags.bundleClientTransactionFlag()) { clientTransaction.addTransactionItem(activityResultItem); } else { clientTransaction.addCallback(activityResultItem); } try { mAppThread.scheduleTransaction(clientTransaction); } catch (RemoteException e) { Loading Loading @@ -4492,16 +4499,26 @@ public final class ActivityThread extends ClientTransactionHandler private void schedulePauseWithUserLeavingHint(ActivityClientRecord r) { final ClientTransaction transaction = ClientTransaction.obtain(mAppThread); transaction.setLifecycleStateRequest(PauseActivityItem.obtain(r.token, final PauseActivityItem pauseActivityItem = PauseActivityItem.obtain(r.token, r.activity.isFinishing(), /* userLeaving */ true, r.activity.mConfigChangeFlags, /* dontReport */ false, /* autoEnteringPip */ false)); /* dontReport */ false, /* autoEnteringPip */ false); if (Flags.bundleClientTransactionFlag()) { transaction.addTransactionItem(pauseActivityItem); } else { transaction.setLifecycleStateRequest(pauseActivityItem); } executeTransaction(transaction); } private void scheduleResume(ActivityClientRecord r) { final ClientTransaction transaction = ClientTransaction.obtain(mAppThread); transaction.setLifecycleStateRequest(ResumeActivityItem.obtain(r.token, /* isForward */ false, /* shouldSendCompatFakeFocus */ false)); final ResumeActivityItem resumeActivityItem = ResumeActivityItem.obtain(r.token, /* isForward */ false, /* shouldSendCompatFakeFocus */ false); if (Flags.bundleClientTransactionFlag()) { transaction.addTransactionItem(resumeActivityItem); } else { transaction.setLifecycleStateRequest(resumeActivityItem); } executeTransaction(transaction); } Loading Loading @@ -6092,8 +6109,13 @@ 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); } executeTransaction(transaction); } Loading core/java/android/app/servertransaction/ClientTransaction.java +0 −1 Original line number Diff line number Diff line Loading @@ -75,7 +75,6 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { /** * Adds a message to the end of the sequence of transaction items. * @param item A single message that can contain a client activity/window request/callback. * TODO(b/260873529): replace both {@link #addCallback} and {@link #setLifecycleStateRequest}. */ public void addTransactionItem(@NonNull ClientTransactionItem item) { if (mTransactionItems == null) { Loading core/java/android/app/servertransaction/TransactionExecutorHelper.java +2 −0 Original line number Diff line number Diff line Loading @@ -235,7 +235,9 @@ public class TransactionExecutorHelper { * Configuration - ActivityResult - Configuration - ActivityResult * index 1 will be returned, because ActivityResult request on position 1 will be the last * request that moves activity to the RESUMED state where it will eventually end. * @deprecated to be removed with {@link TransactionExecutor#executeCallbacks}. */ @Deprecated static int lastCallbackRequestingState(@NonNull ClientTransaction transaction) { final List<ClientTransactionItem> callbacks = transaction.getCallbacks(); if (callbacks == null || callbacks.isEmpty() Loading core/java/android/window/flags/windowing_sdk.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -9,6 +9,16 @@ flag { bug: "260873529" } # Using a fixed read only flag because there are ClientTransaction scheduling before # WindowManagerService creation. flag { namespace: "windowing_sdk" name: "bundle_client_transaction_flag" description: "To bundle multiple ClientTransactionItems into one ClientTransaction" bug: "260873529" is_fixed_read_only: true } flag { namespace: "windowing_sdk" name: "activity_embedding_overlay_presentation_flag" Loading core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +26 −12 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import android.app.IApplicationThread; import android.app.PictureInPictureParams; 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; Loading Loading @@ -73,6 +74,7 @@ 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; Loading Loading @@ -227,7 +229,8 @@ public class ActivityThreadTest { try { // Send process level config change. ClientTransaction transaction = newTransaction(activityThread); transaction.addCallback(ConfigurationChangeItem.obtain(newConfig, DEVICE_ID_INVALID)); addClientTransactionItem(transaction, ConfigurationChangeItem.obtain( newConfig, DEVICE_ID_INVALID)); appThread.scheduleTransaction(transaction); InstrumentationRegistry.getInstrumentation().waitForIdleSync(); Loading @@ -243,7 +246,7 @@ public class ActivityThreadTest { newConfig.seq++; newConfig.smallestScreenWidthDp++; transaction = newTransaction(activityThread); transaction.addCallback(ActivityConfigurationChangeItem.obtain( addClientTransactionItem(transaction, ActivityConfigurationChangeItem.obtain( activity.getActivityToken(), newConfig)); appThread.scheduleTransaction(transaction); InstrumentationRegistry.getInstrumentation().waitForIdleSync(); Loading Loading @@ -444,16 +447,16 @@ public class ActivityThreadTest { activity.mTestLatch = new CountDownLatch(1); ClientTransaction transaction = newTransaction(activityThread); transaction.addCallback(ConfigurationChangeItem.obtain( addClientTransactionItem(transaction, ConfigurationChangeItem.obtain( processConfigLandscape, DEVICE_ID_INVALID)); appThread.scheduleTransaction(transaction); transaction = newTransaction(activityThread); transaction.addCallback(ActivityConfigurationChangeItem.obtain( addClientTransactionItem(transaction, ActivityConfigurationChangeItem.obtain( activity.getActivityToken(), activityConfigLandscape)); transaction.addCallback(ConfigurationChangeItem.obtain( addClientTransactionItem(transaction, ConfigurationChangeItem.obtain( processConfigPortrait, DEVICE_ID_INVALID)); transaction.addCallback(ActivityConfigurationChangeItem.obtain( addClientTransactionItem(transaction, ActivityConfigurationChangeItem.obtain( activity.getActivityToken(), activityConfigPortrait)); appThread.scheduleTransaction(transaction); Loading Loading @@ -840,8 +843,8 @@ public class ActivityThreadTest { false /* shouldSendCompatFakeFocus*/); final ClientTransaction transaction = newTransaction(activity); transaction.addCallback(callbackItem); transaction.setLifecycleStateRequest(resumeStateRequest); addClientTransactionItem(transaction, callbackItem); addClientTransactionItem(transaction, resumeStateRequest); return transaction; } Loading @@ -853,7 +856,7 @@ public class ActivityThreadTest { false /* shouldSendCompatFakeFocus */); final ClientTransaction transaction = newTransaction(activity); transaction.setLifecycleStateRequest(resumeStateRequest); addClientTransactionItem(transaction, resumeStateRequest); return transaction; } Loading @@ -864,7 +867,7 @@ public class ActivityThreadTest { activity.getActivityToken(), 0 /* configChanges */); final ClientTransaction transaction = newTransaction(activity); transaction.setLifecycleStateRequest(stopStateRequest); addClientTransactionItem(transaction, stopStateRequest); return transaction; } Loading @@ -876,7 +879,7 @@ public class ActivityThreadTest { activity.getActivityToken(), config); final ClientTransaction transaction = newTransaction(activity); transaction.addCallback(item); addClientTransactionItem(transaction, item); return transaction; } Loading @@ -888,7 +891,7 @@ public class ActivityThreadTest { resume); final ClientTransaction transaction = newTransaction(activity); transaction.addCallback(item); addClientTransactionItem(transaction, item); return transaction; } Loading @@ -903,6 +906,17 @@ 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"; Loading Loading
core/java/android/app/ActivityThread.java +29 −7 Original line number Diff line number Diff line Loading @@ -232,6 +232,7 @@ 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; Loading Loading @@ -3713,7 +3714,13 @@ public final class ActivityThread extends ClientTransactionHandler final ArrayList<ResultInfo> list = new ArrayList<>(); list.add(new ResultInfo(id, requestCode, resultCode, data)); final ClientTransaction clientTransaction = ClientTransaction.obtain(mAppThread); clientTransaction.addCallback(ActivityResultItem.obtain(activityToken, list)); final ActivityResultItem activityResultItem = ActivityResultItem.obtain( activityToken, list); if (Flags.bundleClientTransactionFlag()) { clientTransaction.addTransactionItem(activityResultItem); } else { clientTransaction.addCallback(activityResultItem); } try { mAppThread.scheduleTransaction(clientTransaction); } catch (RemoteException e) { Loading Loading @@ -4492,16 +4499,26 @@ public final class ActivityThread extends ClientTransactionHandler private void schedulePauseWithUserLeavingHint(ActivityClientRecord r) { final ClientTransaction transaction = ClientTransaction.obtain(mAppThread); transaction.setLifecycleStateRequest(PauseActivityItem.obtain(r.token, final PauseActivityItem pauseActivityItem = PauseActivityItem.obtain(r.token, r.activity.isFinishing(), /* userLeaving */ true, r.activity.mConfigChangeFlags, /* dontReport */ false, /* autoEnteringPip */ false)); /* dontReport */ false, /* autoEnteringPip */ false); if (Flags.bundleClientTransactionFlag()) { transaction.addTransactionItem(pauseActivityItem); } else { transaction.setLifecycleStateRequest(pauseActivityItem); } executeTransaction(transaction); } private void scheduleResume(ActivityClientRecord r) { final ClientTransaction transaction = ClientTransaction.obtain(mAppThread); transaction.setLifecycleStateRequest(ResumeActivityItem.obtain(r.token, /* isForward */ false, /* shouldSendCompatFakeFocus */ false)); final ResumeActivityItem resumeActivityItem = ResumeActivityItem.obtain(r.token, /* isForward */ false, /* shouldSendCompatFakeFocus */ false); if (Flags.bundleClientTransactionFlag()) { transaction.addTransactionItem(resumeActivityItem); } else { transaction.setLifecycleStateRequest(resumeActivityItem); } executeTransaction(transaction); } Loading Loading @@ -6092,8 +6109,13 @@ 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); } executeTransaction(transaction); } Loading
core/java/android/app/servertransaction/ClientTransaction.java +0 −1 Original line number Diff line number Diff line Loading @@ -75,7 +75,6 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { /** * Adds a message to the end of the sequence of transaction items. * @param item A single message that can contain a client activity/window request/callback. * TODO(b/260873529): replace both {@link #addCallback} and {@link #setLifecycleStateRequest}. */ public void addTransactionItem(@NonNull ClientTransactionItem item) { if (mTransactionItems == null) { Loading
core/java/android/app/servertransaction/TransactionExecutorHelper.java +2 −0 Original line number Diff line number Diff line Loading @@ -235,7 +235,9 @@ public class TransactionExecutorHelper { * Configuration - ActivityResult - Configuration - ActivityResult * index 1 will be returned, because ActivityResult request on position 1 will be the last * request that moves activity to the RESUMED state where it will eventually end. * @deprecated to be removed with {@link TransactionExecutor#executeCallbacks}. */ @Deprecated static int lastCallbackRequestingState(@NonNull ClientTransaction transaction) { final List<ClientTransactionItem> callbacks = transaction.getCallbacks(); if (callbacks == null || callbacks.isEmpty() Loading
core/java/android/window/flags/windowing_sdk.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -9,6 +9,16 @@ flag { bug: "260873529" } # Using a fixed read only flag because there are ClientTransaction scheduling before # WindowManagerService creation. flag { namespace: "windowing_sdk" name: "bundle_client_transaction_flag" description: "To bundle multiple ClientTransactionItems into one ClientTransaction" bug: "260873529" is_fixed_read_only: true } flag { namespace: "windowing_sdk" name: "activity_embedding_overlay_presentation_flag" Loading
core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +26 −12 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import android.app.IApplicationThread; import android.app.PictureInPictureParams; 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; Loading Loading @@ -73,6 +74,7 @@ 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; Loading Loading @@ -227,7 +229,8 @@ public class ActivityThreadTest { try { // Send process level config change. ClientTransaction transaction = newTransaction(activityThread); transaction.addCallback(ConfigurationChangeItem.obtain(newConfig, DEVICE_ID_INVALID)); addClientTransactionItem(transaction, ConfigurationChangeItem.obtain( newConfig, DEVICE_ID_INVALID)); appThread.scheduleTransaction(transaction); InstrumentationRegistry.getInstrumentation().waitForIdleSync(); Loading @@ -243,7 +246,7 @@ public class ActivityThreadTest { newConfig.seq++; newConfig.smallestScreenWidthDp++; transaction = newTransaction(activityThread); transaction.addCallback(ActivityConfigurationChangeItem.obtain( addClientTransactionItem(transaction, ActivityConfigurationChangeItem.obtain( activity.getActivityToken(), newConfig)); appThread.scheduleTransaction(transaction); InstrumentationRegistry.getInstrumentation().waitForIdleSync(); Loading Loading @@ -444,16 +447,16 @@ public class ActivityThreadTest { activity.mTestLatch = new CountDownLatch(1); ClientTransaction transaction = newTransaction(activityThread); transaction.addCallback(ConfigurationChangeItem.obtain( addClientTransactionItem(transaction, ConfigurationChangeItem.obtain( processConfigLandscape, DEVICE_ID_INVALID)); appThread.scheduleTransaction(transaction); transaction = newTransaction(activityThread); transaction.addCallback(ActivityConfigurationChangeItem.obtain( addClientTransactionItem(transaction, ActivityConfigurationChangeItem.obtain( activity.getActivityToken(), activityConfigLandscape)); transaction.addCallback(ConfigurationChangeItem.obtain( addClientTransactionItem(transaction, ConfigurationChangeItem.obtain( processConfigPortrait, DEVICE_ID_INVALID)); transaction.addCallback(ActivityConfigurationChangeItem.obtain( addClientTransactionItem(transaction, ActivityConfigurationChangeItem.obtain( activity.getActivityToken(), activityConfigPortrait)); appThread.scheduleTransaction(transaction); Loading Loading @@ -840,8 +843,8 @@ public class ActivityThreadTest { false /* shouldSendCompatFakeFocus*/); final ClientTransaction transaction = newTransaction(activity); transaction.addCallback(callbackItem); transaction.setLifecycleStateRequest(resumeStateRequest); addClientTransactionItem(transaction, callbackItem); addClientTransactionItem(transaction, resumeStateRequest); return transaction; } Loading @@ -853,7 +856,7 @@ public class ActivityThreadTest { false /* shouldSendCompatFakeFocus */); final ClientTransaction transaction = newTransaction(activity); transaction.setLifecycleStateRequest(resumeStateRequest); addClientTransactionItem(transaction, resumeStateRequest); return transaction; } Loading @@ -864,7 +867,7 @@ public class ActivityThreadTest { activity.getActivityToken(), 0 /* configChanges */); final ClientTransaction transaction = newTransaction(activity); transaction.setLifecycleStateRequest(stopStateRequest); addClientTransactionItem(transaction, stopStateRequest); return transaction; } Loading @@ -876,7 +879,7 @@ public class ActivityThreadTest { activity.getActivityToken(), config); final ClientTransaction transaction = newTransaction(activity); transaction.addCallback(item); addClientTransactionItem(transaction, item); return transaction; } Loading @@ -888,7 +891,7 @@ public class ActivityThreadTest { resume); final ClientTransaction transaction = newTransaction(activity); transaction.addCallback(item); addClientTransactionItem(transaction, item); return transaction; } Loading @@ -903,6 +906,17 @@ 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"; Loading