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

Commit a7da661d authored by Chris Li's avatar Chris Li Committed by Android (Google) Code Review
Browse files

Merge "Guard ClientTransaction UnsupportedAppUsage from bundling" into main

parents 2ce67465 9ccbf997
Loading
Loading
Loading
Loading
+23 −20
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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;


    /**
    /**
@@ -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;
    }
    }
+8 −0
Original line number Original line 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.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;
@@ -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
+30 −0
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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
@@ -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;
    }
}
}