Loading core/java/android/app/servertransaction/ClientTransaction.java +23 −20 Original line number Original line Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.annotation.Nullable; import android.app.ClientTransactionHandler; import android.app.ClientTransactionHandler; import android.app.IApplicationThread; import android.app.IApplicationThread; import android.compat.annotation.UnsupportedAppUsage; import android.compat.annotation.UnsupportedAppUsage; import android.os.Build; import android.os.IBinder; import android.os.IBinder; import android.os.Parcel; import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable; Loading Loading @@ -54,10 +55,12 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { @Nullable @Nullable private List<ClientTransactionItem> mTransactionItems; private List<ClientTransactionItem> mTransactionItems; /** A list of individual callbacks to a client. */ /** @deprecated use {@link #getTransactionItems} instead. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @UnsupportedAppUsage @Nullable @Nullable @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, trackingBug = 324203798, publicAlternatives = "Use {@code #getTransactionItems()}") @Deprecated private List<ClientTransactionItem> mActivityCallbacks; private List<ClientTransactionItem> mActivityCallbacks; /** /** Loading Loading @@ -126,42 +129,42 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { setActivityTokenIfNotSet(activityCallback); setActivityTokenIfNotSet(activityCallback); } } /** /** @deprecated use {@link #getTransactionItems()} instead. */ * Gets the list of callbacks. * @deprecated use {@link #getTransactionItems()} instead. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @Nullable @VisibleForTesting @VisibleForTesting @UnsupportedAppUsage @Nullable @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, trackingBug = 324203798, publicAlternatives = "Use {@code #getTransactionItems()}") @Deprecated @Deprecated public List<ClientTransactionItem> getCallbacks() { public List<ClientTransactionItem> getCallbacks() { return mActivityCallbacks; return mActivityCallbacks; } } /** /** * @deprecated a transaction can contain {@link ClientTransactionItem} of different activities, * A transaction can contain {@link ClientTransactionItem} of different activities, * this must not be used. For any unsupported app usages, please be aware that this is set to * this must not be used. For any unsupported app usages, please be aware that this is set to * the activity of the first item in {@link #getTransactionItems()}. * the activity of the first item in {@link #getTransactionItems()}. * * @deprecated use {@link ClientTransactionItem#getActivityToken()} instead. */ */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @VisibleForTesting @VisibleForTesting @Nullable @Nullable @UnsupportedAppUsage @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, trackingBug = 324203798, publicAlternatives = "Use {@code android.app.servertransaction" + ".ClientTransactionItem#getActivityToken()}") @Deprecated @Deprecated public IBinder getActivityToken() { public IBinder getActivityToken() { return mActivityToken; return mActivityToken; } } /** /** @deprecated use {@link #getTransactionItems()} instead. */ * Gets the target state lifecycle request. * @deprecated use {@link #getTransactionItems()} instead. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @VisibleForTesting(visibility = PACKAGE) @VisibleForTesting(visibility = PACKAGE) @UnsupportedAppUsage @Deprecated @Nullable @Nullable @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, trackingBug = 324203798, publicAlternatives = "Use {@code #getTransactionItems()}") @Deprecated public ActivityLifecycleItem getLifecycleStateRequest() { public ActivityLifecycleItem getLifecycleStateRequest() { return mLifecycleStateRequest; return mLifecycleStateRequest; } } Loading services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +8 −0 Original line number Original line Diff line number Diff line Loading @@ -74,6 +74,7 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLAS import static com.android.server.wm.ActivityTaskManagerService.ANIMATE; import static com.android.server.wm.ActivityTaskManagerService.ANIMATE; import static com.android.server.wm.ActivityTaskManagerService.H.FIRST_SUPERVISOR_TASK_MSG; import static com.android.server.wm.ActivityTaskManagerService.H.FIRST_SUPERVISOR_TASK_MSG; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE; import static com.android.server.wm.ClientLifecycleManager.shouldDispatchCompatClientTransactionIndependently; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_ALLOWLISTED; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_ALLOWLISTED; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; Loading Loading @@ -948,6 +949,13 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { } } // Schedule transaction. // Schedule transaction. if (shouldDispatchCompatClientTransactionIndependently(r.mTargetSdk)) { // LaunchActivityItem has @UnsupportedAppUsage usages. // Guard the bundleClientTransactionFlag feature with targetSDK on Android 15+. // To not bundle the transaction, dispatch the pending before schedule new // transaction. mService.getLifecycleManager().dispatchPendingTransaction(proc.getThread()); } mService.getLifecycleManager().scheduleTransactionAndLifecycleItems( mService.getLifecycleManager().scheduleTransactionAndLifecycleItems( proc.getThread(), launchActivityItem, lifecycleItem, proc.getThread(), launchActivityItem, lifecycleItem, // Immediately dispatch the transaction, so that if it fails, the server can // Immediately dispatch the transaction, so that if it fails, the server can Loading services/core/java/com/android/server/wm/ClientLifecycleManager.java +30 −0 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.app.servertransaction.ActivityLifecycleItem; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.ClientTransactionItem; import android.os.Binder; import android.os.Binder; import android.os.Build; import android.os.IBinder; import android.os.IBinder; import android.os.RemoteException; import android.os.RemoteException; import android.os.Trace; import android.os.Trace; Loading Loading @@ -179,6 +180,22 @@ class ClientLifecycleManager { Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); } } /** Executes the pending transaction for the given client process. */ void dispatchPendingTransaction(@NonNull IApplicationThread client) { if (!Flags.bundleClientTransactionFlag()) { return; } final ClientTransaction pendingTransaction = mPendingTransactions.remove(client.asBinder()); if (pendingTransaction != null) { try { scheduleTransaction(pendingTransaction); } catch (RemoteException e) { Slog.e(TAG, "Failed to deliver pending transaction", e); // TODO(b/323801078): apply cleanup for individual transaction item if needed. } } } /** /** * Called to when {@link WindowSurfacePlacer#continueLayout}. * Called to when {@link WindowSurfacePlacer#continueLayout}. * Dispatches all pending transactions unless there is an ongoing/scheduled layout, in which * Dispatches all pending transactions unless there is an ongoing/scheduled layout, in which Loading Loading @@ -233,4 +250,17 @@ class ClientLifecycleManager { && !mWms.mWindowPlacerLocked.isTraversalScheduled() && !mWms.mWindowPlacerLocked.isTraversalScheduled() && !mWms.mWindowPlacerLocked.isInLayout(); && !mWms.mWindowPlacerLocked.isInLayout(); } } /** * Guards the bundleClientTransactionFlag feature with targetSDK on Android 15+. * * Suppressing because it can't guard with @EnabledSince on VANILLA_ICE_CREAM yet since the * version is not published. * * TODO(b/324203798): update in V */ @SuppressWarnings("AndroidFrameworkCompatChange") static boolean shouldDispatchCompatClientTransactionIndependently(int appTargetSdk) { return appTargetSdk <= Build.VERSION_CODES.UPSIDE_DOWN_CAKE; } } } Loading
core/java/android/app/servertransaction/ClientTransaction.java +23 −20 Original line number Original line Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.annotation.Nullable; import android.app.ClientTransactionHandler; import android.app.ClientTransactionHandler; import android.app.IApplicationThread; import android.app.IApplicationThread; import android.compat.annotation.UnsupportedAppUsage; import android.compat.annotation.UnsupportedAppUsage; import android.os.Build; import android.os.IBinder; import android.os.IBinder; import android.os.Parcel; import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable; Loading Loading @@ -54,10 +55,12 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { @Nullable @Nullable private List<ClientTransactionItem> mTransactionItems; private List<ClientTransactionItem> mTransactionItems; /** A list of individual callbacks to a client. */ /** @deprecated use {@link #getTransactionItems} instead. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @UnsupportedAppUsage @Nullable @Nullable @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, trackingBug = 324203798, publicAlternatives = "Use {@code #getTransactionItems()}") @Deprecated private List<ClientTransactionItem> mActivityCallbacks; private List<ClientTransactionItem> mActivityCallbacks; /** /** Loading Loading @@ -126,42 +129,42 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { setActivityTokenIfNotSet(activityCallback); setActivityTokenIfNotSet(activityCallback); } } /** /** @deprecated use {@link #getTransactionItems()} instead. */ * Gets the list of callbacks. * @deprecated use {@link #getTransactionItems()} instead. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @Nullable @VisibleForTesting @VisibleForTesting @UnsupportedAppUsage @Nullable @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, trackingBug = 324203798, publicAlternatives = "Use {@code #getTransactionItems()}") @Deprecated @Deprecated public List<ClientTransactionItem> getCallbacks() { public List<ClientTransactionItem> getCallbacks() { return mActivityCallbacks; return mActivityCallbacks; } } /** /** * @deprecated a transaction can contain {@link ClientTransactionItem} of different activities, * A transaction can contain {@link ClientTransactionItem} of different activities, * this must not be used. For any unsupported app usages, please be aware that this is set to * this must not be used. For any unsupported app usages, please be aware that this is set to * the activity of the first item in {@link #getTransactionItems()}. * the activity of the first item in {@link #getTransactionItems()}. * * @deprecated use {@link ClientTransactionItem#getActivityToken()} instead. */ */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @VisibleForTesting @VisibleForTesting @Nullable @Nullable @UnsupportedAppUsage @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, trackingBug = 324203798, publicAlternatives = "Use {@code android.app.servertransaction" + ".ClientTransactionItem#getActivityToken()}") @Deprecated @Deprecated public IBinder getActivityToken() { public IBinder getActivityToken() { return mActivityToken; return mActivityToken; } } /** /** @deprecated use {@link #getTransactionItems()} instead. */ * Gets the target state lifecycle request. * @deprecated use {@link #getTransactionItems()} instead. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @VisibleForTesting(visibility = PACKAGE) @VisibleForTesting(visibility = PACKAGE) @UnsupportedAppUsage @Deprecated @Nullable @Nullable @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, trackingBug = 324203798, publicAlternatives = "Use {@code #getTransactionItems()}") @Deprecated public ActivityLifecycleItem getLifecycleStateRequest() { public ActivityLifecycleItem getLifecycleStateRequest() { return mLifecycleStateRequest; return mLifecycleStateRequest; } } Loading
services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +8 −0 Original line number Original line Diff line number Diff line Loading @@ -74,6 +74,7 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLAS import static com.android.server.wm.ActivityTaskManagerService.ANIMATE; import static com.android.server.wm.ActivityTaskManagerService.ANIMATE; import static com.android.server.wm.ActivityTaskManagerService.H.FIRST_SUPERVISOR_TASK_MSG; import static com.android.server.wm.ActivityTaskManagerService.H.FIRST_SUPERVISOR_TASK_MSG; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE; import static com.android.server.wm.ClientLifecycleManager.shouldDispatchCompatClientTransactionIndependently; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_ALLOWLISTED; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_ALLOWLISTED; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; Loading Loading @@ -948,6 +949,13 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { } } // Schedule transaction. // Schedule transaction. if (shouldDispatchCompatClientTransactionIndependently(r.mTargetSdk)) { // LaunchActivityItem has @UnsupportedAppUsage usages. // Guard the bundleClientTransactionFlag feature with targetSDK on Android 15+. // To not bundle the transaction, dispatch the pending before schedule new // transaction. mService.getLifecycleManager().dispatchPendingTransaction(proc.getThread()); } mService.getLifecycleManager().scheduleTransactionAndLifecycleItems( mService.getLifecycleManager().scheduleTransactionAndLifecycleItems( proc.getThread(), launchActivityItem, lifecycleItem, proc.getThread(), launchActivityItem, lifecycleItem, // Immediately dispatch the transaction, so that if it fails, the server can // Immediately dispatch the transaction, so that if it fails, the server can Loading
services/core/java/com/android/server/wm/ClientLifecycleManager.java +30 −0 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.app.servertransaction.ActivityLifecycleItem; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.ClientTransactionItem; import android.os.Binder; import android.os.Binder; import android.os.Build; import android.os.IBinder; import android.os.IBinder; import android.os.RemoteException; import android.os.RemoteException; import android.os.Trace; import android.os.Trace; Loading Loading @@ -179,6 +180,22 @@ class ClientLifecycleManager { Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); } } /** Executes the pending transaction for the given client process. */ void dispatchPendingTransaction(@NonNull IApplicationThread client) { if (!Flags.bundleClientTransactionFlag()) { return; } final ClientTransaction pendingTransaction = mPendingTransactions.remove(client.asBinder()); if (pendingTransaction != null) { try { scheduleTransaction(pendingTransaction); } catch (RemoteException e) { Slog.e(TAG, "Failed to deliver pending transaction", e); // TODO(b/323801078): apply cleanup for individual transaction item if needed. } } } /** /** * Called to when {@link WindowSurfacePlacer#continueLayout}. * Called to when {@link WindowSurfacePlacer#continueLayout}. * Dispatches all pending transactions unless there is an ongoing/scheduled layout, in which * Dispatches all pending transactions unless there is an ongoing/scheduled layout, in which Loading Loading @@ -233,4 +250,17 @@ class ClientLifecycleManager { && !mWms.mWindowPlacerLocked.isTraversalScheduled() && !mWms.mWindowPlacerLocked.isTraversalScheduled() && !mWms.mWindowPlacerLocked.isInLayout(); && !mWms.mWindowPlacerLocked.isInLayout(); } } /** * Guards the bundleClientTransactionFlag feature with targetSDK on Android 15+. * * Suppressing because it can't guard with @EnabledSince on VANILLA_ICE_CREAM yet since the * version is not published. * * TODO(b/324203798): update in V */ @SuppressWarnings("AndroidFrameworkCompatChange") static boolean shouldDispatchCompatClientTransactionIndependently(int appTargetSdk) { return appTargetSdk <= Build.VERSION_CODES.UPSIDE_DOWN_CAKE; } } }