Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9ccbf997 authored by Chris Li's avatar Chris Li
Browse files

Guard ClientTransaction UnsupportedAppUsage from bundling

Guard the bundleClientTransaction feature with target SDK for
ClientTransactionItem with UnsupportedAppUsage.

Bug: 323964766
Bug: 324203798
Bug: 260873529
Test: pass existing tests
Change-Id: I940d62fe583b9bf01377af24b5c08de7c6e802f9
parent 71175c17
Loading
Loading
Loading
Loading
+23 −20
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.annotation.Nullable;
import android.app.ClientTransactionHandler;
import android.app.IApplicationThread;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Build;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
@@ -54,10 +55,12 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
    @Nullable
    private List<ClientTransactionItem> mTransactionItems;

    /** A list of individual callbacks to a client. */
    // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
    @UnsupportedAppUsage
    /** @deprecated use {@link #getTransactionItems} instead. */
    @Nullable
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE,
            trackingBug = 324203798,
            publicAlternatives = "Use {@code #getTransactionItems()}")
    @Deprecated
    private List<ClientTransactionItem> mActivityCallbacks;

    /**
@@ -126,42 +129,42 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
        setActivityTokenIfNotSet(activityCallback);
    }

    /**
     * Gets the list of callbacks.
     * @deprecated use {@link #getTransactionItems()} instead.
     */
    // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
    @Nullable
    /** @deprecated use {@link #getTransactionItems()} instead. */
    @VisibleForTesting
    @UnsupportedAppUsage
    @Nullable
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE,
            trackingBug = 324203798,
            publicAlternatives = "Use {@code #getTransactionItems()}")
    @Deprecated
    public List<ClientTransactionItem> getCallbacks() {
        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
     * the activity of the first item in {@link #getTransactionItems()}.
     *
     * @deprecated use {@link ClientTransactionItem#getActivityToken()} instead.
     */
    // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
    @VisibleForTesting
    @Nullable
    @UnsupportedAppUsage
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE,
            trackingBug = 324203798,
            publicAlternatives = "Use {@code android.app.servertransaction"
                    + ".ClientTransactionItem#getActivityToken()}")
    @Deprecated
    public IBinder getActivityToken() {
        return mActivityToken;
    }

    /**
     * Gets the target state lifecycle request.
     * @deprecated use {@link #getTransactionItems()} instead.
     */
    // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
    /** @deprecated use {@link #getTransactionItems()} instead. */
    @VisibleForTesting(visibility = PACKAGE)
    @UnsupportedAppUsage
    @Deprecated
    @Nullable
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE,
            trackingBug = 324203798,
            publicAlternatives = "Use {@code #getTransactionItems()}")
    @Deprecated
    public ActivityLifecycleItem getLifecycleStateRequest() {
        return mLifecycleStateRequest;
    }
+8 −0
Original line number Diff line number Diff line
@@ -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.H.FIRST_SUPERVISOR_TASK_MSG;
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_LAUNCHABLE;
import static com.android.server.wm.LockTaskController.LOCK_TASK_AUTH_LAUNCHABLE_PRIV;
@@ -948,6 +949,13 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
                }

                // 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(
                        proc.getThread(), launchActivityItem, lifecycleItem,
                        // Immediately dispatch the transaction, so that if it fails, the server can
+30 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.app.servertransaction.ActivityLifecycleItem;
import android.app.servertransaction.ClientTransaction;
import android.app.servertransaction.ClientTransactionItem;
import android.os.Binder;
import android.os.Build;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.Trace;
@@ -179,6 +180,22 @@ class ClientLifecycleManager {
        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}.
     * Dispatches all pending transactions unless there is an ongoing/scheduled layout, in which
@@ -233,4 +250,17 @@ class ClientLifecycleManager {
                && !mWms.mWindowPlacerLocked.isTraversalScheduled()
                && !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;
    }
}