Merge "Immediately dispatch for LaunchActivityItem" into main
diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
index ec0e3e7..b7a943b 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
@@ -943,7 +943,10 @@
// Schedule transaction.
mService.getLifecycleManager().scheduleTransactionAndLifecycleItems(
- proc.getThread(), launchActivityItem, lifecycleItem);
+ proc.getThread(), launchActivityItem, lifecycleItem,
+ // Immediately dispatch the transaction, so that if it fails, the server can
+ // restart the process and retry now.
+ true /* shouldDispatchImmediately */);
if (procConfig.seq > mRootWindowContainer.getConfiguration().seq) {
// If the seq is increased, there should be something changed (e.g. registered
diff --git a/services/core/java/com/android/server/wm/ClientLifecycleManager.java b/services/core/java/com/android/server/wm/ClientLifecycleManager.java
index e84026c..5b4fb3e 100644
--- a/services/core/java/com/android/server/wm/ClientLifecycleManager.java
+++ b/services/core/java/com/android/server/wm/ClientLifecycleManager.java
@@ -110,7 +110,8 @@
final ClientTransaction clientTransaction = getOrCreatePendingTransaction(client);
clientTransaction.addTransactionItem(transactionItem);
- onClientTransactionItemScheduled(clientTransaction);
+ onClientTransactionItemScheduled(clientTransaction,
+ false /* shouldDispatchImmediately */);
} else {
// TODO(b/260873529): cleanup after launch.
final ClientTransaction clientTransaction = ClientTransaction.obtain(client);
@@ -123,14 +124,30 @@
}
}
+ void scheduleTransactionAndLifecycleItems(@NonNull IApplicationThread client,
+ @NonNull ClientTransactionItem transactionItem,
+ @NonNull ActivityLifecycleItem lifecycleItem) throws RemoteException {
+ scheduleTransactionAndLifecycleItems(client, transactionItem, lifecycleItem,
+ false /* shouldDispatchImmediately */);
+ }
+
/**
* Schedules a single transaction item with a lifecycle request, delivery to client application.
+ *
+ * @param shouldDispatchImmediately whether or not to dispatch the transaction immediately. This
+ * should only be {@code true} when it is important to know the
+ * result of dispatching immediately. For example, when cold
+ * launches an app, the server needs to know if the transaction
+ * is dispatched successfully, and may restart the process if
+ * not.
+ *
* @throws RemoteException
* @see ClientTransactionItem
*/
void scheduleTransactionAndLifecycleItems(@NonNull IApplicationThread client,
@NonNull ClientTransactionItem transactionItem,
- @NonNull ActivityLifecycleItem lifecycleItem) throws RemoteException {
+ @NonNull ActivityLifecycleItem lifecycleItem,
+ boolean shouldDispatchImmediately) throws RemoteException {
// The behavior is different depending on the flag.
// When flag is on, we wait until RootWindowContainer#performSurfacePlacementNoTrace to
// dispatch all pending transactions at once.
@@ -139,7 +156,7 @@
clientTransaction.addTransactionItem(transactionItem);
clientTransaction.addTransactionItem(lifecycleItem);
- onClientTransactionItemScheduled(clientTransaction);
+ onClientTransactionItemScheduled(clientTransaction, shouldDispatchImmediately);
} else {
// TODO(b/260873529): cleanup after launch.
final ClientTransaction clientTransaction = ClientTransaction.obtain(client);
@@ -162,6 +179,7 @@
scheduleTransaction(transaction);
} catch (RemoteException e) {
Slog.e(TAG, "Failed to deliver pending transaction", e);
+ // TODO(b/323801078): apply cleanup for individual transaction item if needed.
}
}
mPendingTransactions.clear();
@@ -198,8 +216,9 @@
/** Must only be called with WM lock. */
private void onClientTransactionItemScheduled(
- @NonNull ClientTransaction clientTransaction) throws RemoteException {
- if (shouldDispatchPendingTransactionsImmediately()) {
+ @NonNull ClientTransaction clientTransaction,
+ boolean shouldDispatchImmediately) throws RemoteException {
+ if (shouldDispatchImmediately || shouldDispatchPendingTransactionsImmediately()) {
// Dispatch the pending transaction immediately.
mPendingTransactions.remove(clientTransaction.getClient().asBinder());
scheduleTransaction(clientTransaction);
diff --git a/services/tests/wmtests/src/com/android/server/wm/ClientLifecycleManagerTests.java b/services/tests/wmtests/src/com/android/server/wm/ClientLifecycleManagerTests.java
index 46e14d51..5f18f84 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ClientLifecycleManagerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ClientLifecycleManagerTests.java
@@ -208,6 +208,21 @@
}
@Test
+ public void testScheduleTransactionAndLifecycleItems_shouldDispatchImmediately()
+ throws RemoteException {
+ mSetFlagsRule.enableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG);
+ spyOn(mWms.mWindowPlacerLocked);
+ doReturn(true).when(mWms.mWindowPlacerLocked).isTraversalScheduled();
+
+ // Use non binder client to get non-recycled ClientTransaction.
+ mLifecycleManager.scheduleTransactionAndLifecycleItems(mNonBinderClient, mTransactionItem,
+ mLifecycleItem, true /* shouldDispatchImmediately */);
+
+ verify(mLifecycleManager).scheduleTransaction(any());
+ assertTrue(mLifecycleManager.mPendingTransactions.isEmpty());
+ }
+
+ @Test
public void testDispatchPendingTransactions() throws RemoteException {
mSetFlagsRule.enableFlags(FLAG_BUNDLE_CLIENT_TRANSACTION_FLAG);