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

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

Merge "Clean up bundleClientTransactionFlag (3/n)" into main

parents 10636d46 23308f4b
Loading
Loading
Loading
Loading
+34 −139
Original line number Diff line number Diff line
@@ -52,8 +52,8 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
     * List of transaction items that should be executed in order. Including both
     * {@link ActivityLifecycleItem} and other {@link ClientTransactionItem}.
     */
    @Nullable
    private List<ClientTransactionItem> mTransactionItems;
    @NonNull
    private final List<ClientTransactionItem> mTransactionItems = new ArrayList<>();

    /** @deprecated use {@link #getTransactionItems} instead. */
    @Nullable
@@ -89,9 +89,6 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
     * @param item A single message that can contain a client activity/window request/callback.
     */
    public void addTransactionItem(@NonNull ClientTransactionItem item) {
        if (mTransactionItems == null) {
            mTransactionItems = new ArrayList<>();
        }
        mTransactionItems.add(item);

        // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
@@ -105,9 +102,8 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {

    /**
     * Gets the list of client window requests/callbacks.
     * TODO(b/260873529): must be non null after remove the deprecated methods.
     */
    @Nullable
    @NonNull
    public List<ClientTransactionItem> getTransactionItems() {
        return mTransactionItems;
    }
@@ -195,23 +191,10 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
     *                                 requested by transaction items.
     */
    public void preExecute(@NonNull ClientTransactionHandler clientTransactionHandler) {
        if (mTransactionItems != null) {
        final int size = mTransactionItems.size();
        for (int i = 0; i < size; ++i) {
            mTransactionItems.get(i).preExecute(clientTransactionHandler);
        }
            return;
        }

        if (mActivityCallbacks != null) {
            final int size = mActivityCallbacks.size();
            for (int i = 0; i < size; ++i) {
                mActivityCallbacks.get(i).preExecute(clientTransactionHandler);
            }
        }
        if (mLifecycleStateRequest != null) {
            mLifecycleStateRequest.preExecute(clientTransactionHandler);
        }
    }

    /**
@@ -250,29 +233,13 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
        if (Flags.disableObjectPool()) {
            return;
        }
        if (mTransactionItems != null) {
        int size = mTransactionItems.size();
        for (int i = 0; i < size; i++) {
            mTransactionItems.get(i).recycle();
        }
            mTransactionItems = null;
        mTransactionItems.clear();
        mActivityCallbacks = null;
        mLifecycleStateRequest = null;
        } else {
            // Only needed when mTransactionItems is null, otherwise these will have the same
            // reference as mTransactionItems to support UnsupportedAppUsage.
            if (mActivityCallbacks != null) {
                int size = mActivityCallbacks.size();
                for (int i = 0; i < size; i++) {
                    mActivityCallbacks.get(i).recycle();
                }
                mActivityCallbacks = null;
            }
            if (mLifecycleStateRequest != null) {
                mLifecycleStateRequest.recycle();
                mLifecycleStateRequest = null;
            }
        }
        mClient = null;
        mActivityToken = null;
        ObjectPool.recycle(this);
@@ -284,28 +251,11 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
    @SuppressWarnings("AndroidFrameworkEfficientParcelable") // Item class is not final.
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        final boolean writeTransactionItems = mTransactionItems != null;
        dest.writeBoolean(writeTransactionItems);
        if (writeTransactionItems) {
        dest.writeParcelableList(mTransactionItems, flags);
        } else {
            // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
            // Only write mLifecycleStateRequest and mActivityCallbacks when mTransactionItems is
            // null
            dest.writeParcelable(mLifecycleStateRequest, flags);
            final boolean writeActivityCallbacks = mActivityCallbacks != null;
            dest.writeBoolean(writeActivityCallbacks);
            if (writeActivityCallbacks) {
                dest.writeParcelableList(mActivityCallbacks, flags);
            }
        }
    }

    /** Read from Parcel. */
    private ClientTransaction(@NonNull Parcel in) {
        final boolean readTransactionItems = in.readBoolean();
        if (readTransactionItems) {
            mTransactionItems = new ArrayList<>();
        in.readParcelableList(mTransactionItems, getClass().getClassLoader(),
                ClientTransactionItem.class);

@@ -321,25 +271,6 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
                addCallback(item);
            }
        }
        } else {
            // TODO(b/324203798): cleanup after remove UnsupportedAppUsage
            // Only read mLifecycleStateRequest and mActivityCallbacks when mTransactionItems is
            // null
            mLifecycleStateRequest = in.readParcelable(getClass().getClassLoader(),
                    ActivityLifecycleItem.class);
            setActivityTokenIfNotSet(mLifecycleStateRequest);
            final boolean readActivityCallbacks = in.readBoolean();
            if (readActivityCallbacks) {
                mActivityCallbacks = new ArrayList<>();
                in.readParcelableList(mActivityCallbacks, getClass().getClassLoader(),
                        ClientTransactionItem.class);
                final int size = mActivityCallbacks.size();
                for (int i = 0; mActivityToken == null && i < size; i++) {
                    final ClientTransactionItem item = mActivityCallbacks.get(i);
                    setActivityTokenIfNotSet(item);
                }
            }
        }
    }

    public static final @NonNull Creator<ClientTransaction> CREATOR = new Creator<>() {
@@ -388,25 +319,12 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
    public String toString() {
        final StringBuilder sb = new StringBuilder();
        sb.append("ClientTransaction{");
        if (mTransactionItems != null) {
            // #addTransactionItem
        sb.append("\n  transactionItems=[");
        final int size = mTransactionItems.size();
        for (int i = 0; i < size; i++) {
            sb.append("\n    ").append(mTransactionItems.get(i));
        }
        sb.append("\n  ]");
        } else {
            // #addCallback
            sb.append("\n  callbacks=[");
            final int size = mActivityCallbacks != null ? mActivityCallbacks.size() : 0;
            for (int i = 0; i < size; i++) {
                sb.append("\n    ").append(mActivityCallbacks.get(i));
            }
            sb.append("\n  ]");
            // #setLifecycleStateRequest
            sb.append("\n  stateRequest=").append(mLifecycleStateRequest);
        }
        sb.append("\n}");
        return sb.toString();
    }
@@ -415,7 +333,6 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
    void dump(@NonNull String prefix, @NonNull PrintWriter pw,
            @NonNull ClientTransactionHandler transactionHandler) {
        pw.append(prefix).println("ClientTransaction{");
        if (mTransactionItems != null) {
        pw.append(prefix).print("  transactionItems=[");
        final String itemPrefix = prefix + "    ";
        final int size = mTransactionItems.size();
@@ -429,27 +346,5 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
            pw.println("]");
        }
        pw.append(prefix).println("}");
            return;
        }
        pw.append(prefix).print("  callbacks=[");
        final String itemPrefix = prefix + "    ";
        final int size = mActivityCallbacks != null ? mActivityCallbacks.size() : 0;
        if (size > 0) {
            pw.println();
            for (int i = 0; i < size; i++) {
                mActivityCallbacks.get(i).dump(itemPrefix, pw, transactionHandler);
            }
            pw.append(prefix).println("  ]");
        } else {
            pw.println("]");
        }

        pw.append(prefix).println("  stateRequest=");
        if (mLifecycleStateRequest != null) {
            mLifecycleStateRequest.dump(itemPrefix, pw, transactionHandler);
        } else {
            pw.append(itemPrefix).println("null");
        }
        pw.append(prefix).println("}");
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -29,8 +29,8 @@ import android.os.Parcel;

/**
 * Callback that allows to {@link TransactionExecutor#cycleToPath} to {@link ON_PAUSE} or
 * {@link ON_STOP} in {@link TransactionExecutor#executeCallbacks} for activity "refresh" flow
 * that goes through "paused -> resumed" or "stopped -> resumed" cycle.
 * {@link ON_STOP} in {@link TransactionExecutor#executeTransactionItems} for activity "refresh"
 * flow that goes through "paused -> resumed" or "stopped -> resumed" cycle.
 *
 * <p>This is used in combination with {@link com.android.server.wm.DisplayRotationCompatPolicy}
 * for camera compatibility treatment that handles orientation mismatch between camera buffers and
+1 −58
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ import static android.app.servertransaction.ActivityLifecycleItem.ON_STOP;
import static android.app.servertransaction.ActivityLifecycleItem.UNDEFINED;
import static android.app.servertransaction.TransactionExecutorHelper.getShortActivityName;
import static android.app.servertransaction.TransactionExecutorHelper.getStateName;
import static android.app.servertransaction.TransactionExecutorHelper.lastCallbackRequestingState;
import static android.app.servertransaction.TransactionExecutorHelper.shouldExcludeLastLifecycleState;
import static android.app.servertransaction.TransactionExecutorHelper.tId;
import static android.app.servertransaction.TransactionExecutorHelper.transactionToString;
@@ -77,13 +76,7 @@ public class TransactionExecutor {

        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "clientTransactionExecuted");
        try {
            if (transaction.getTransactionItems() != null) {
            executeTransactionItems(transaction);
            } else {
                // TODO(b/260873529): cleanup after launch.
                executeCallbacks(transaction);
                executeLifecycleState(transaction);
            }
        } catch (Exception e) {
            Slog.e(TAG, "Failed to execute the transaction: "
                    + transactionToString(transaction, mTransactionHandler));
@@ -112,41 +105,6 @@ public class TransactionExecutor {
        }
    }

    /**
     * Cycle through all states requested by callbacks and execute them at proper times.
     * @deprecated use {@link #executeTransactionItems} instead.
     */
    @VisibleForTesting
    @Deprecated
    public void executeCallbacks(@NonNull ClientTransaction transaction) {
        final List<ClientTransactionItem> callbacks = transaction.getCallbacks();
        if (callbacks == null || callbacks.isEmpty()) {
            // No callbacks to execute, return early.
            return;
        }
        if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "Resolving callbacks in transaction");

        // In case when post-execution state of the last callback matches the final state requested
        // for the activity in this transaction, we won't do the last transition here and do it when
        // moving to final state instead (because it may contain additional parameters from server).
        final ActivityLifecycleItem finalStateRequest = transaction.getLifecycleStateRequest();
        final int finalState = finalStateRequest != null ? finalStateRequest.getTargetState()
                : UNDEFINED;
        // Index of the last callback that requests some post-execution state.
        final int lastCallbackRequestingState = lastCallbackRequestingState(transaction);

        final int size = callbacks.size();
        for (int i = 0; i < size; ++i) {
            final ClientTransactionItem item = callbacks.get(i);

            // Skip the very last transition and perform it by explicit state request instead.
            final int postExecutionState = item.getPostExecutionState();
            final boolean shouldExcludeLastLifecycleState = postExecutionState != UNDEFINED
                    && i == lastCallbackRequestingState && finalState == postExecutionState;
            executeNonLifecycleItem(transaction, item, shouldExcludeLastLifecycleState);
        }
    }

    private void executeNonLifecycleItem(@NonNull ClientTransaction transaction,
            @NonNull ClientTransactionItem item, boolean shouldExcludeLastLifecycleState) {
        final IBinder token = item.getActivityToken();
@@ -184,21 +142,6 @@ public class TransactionExecutor {
        }
    }

    /**
     * Transition to the final state if requested by the transaction.
     * @deprecated use {@link #executeTransactionItems} instead
     */
    @Deprecated
    private void executeLifecycleState(@NonNull ClientTransaction transaction) {
        final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();
        if (lifecycleItem == null) {
            // No lifecycle request, return early.
            return;
        }

        executeLifecycleItem(transaction, lifecycleItem);
    }

    private void executeLifecycleItem(@NonNull ClientTransaction transaction,
            @NonNull ActivityLifecycleItem lifecycleItem) {
        final IBinder token = lifecycleItem.getActivityToken();
+0 −23
Original line number Diff line number Diff line
@@ -225,29 +225,6 @@ public class TransactionExecutorHelper {
        return false;
    }

    /**
     * Return the index of the last callback that requests the state in which activity will be after
     * execution. If there is a group of callbacks in the end that requests the same specific state
     * or doesn't request any - we will find the first one from such group.
     *
     * E.g. ActivityResult requests RESUMED post-execution state, Configuration does not request any
     * specific state. If there is a sequence
     *   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()
                || transaction.getLifecycleStateRequest() == null) {
            return -1;
        }
        return lastCallbackRequestingStateIndex(callbacks, 0, callbacks.size() - 1,
                transaction.getLifecycleStateRequest().getActivityToken());
    }

    /**
     * Returns the index of the last callback between the start index and last index that requests
     * the state for the given activity token in which that activity will be after execution.
+3 −9
Original line number Diff line number Diff line
@@ -263,18 +263,12 @@ public class ActivityRecordTests extends WindowTestsBase {
        doAnswer((InvocationOnMock invocationOnMock) -> {
            final ClientTransaction transaction = invocationOnMock.getArgument(0);
            final List<ClientTransactionItem> items = transaction.getTransactionItems();
            if (items != null) {
            for (ClientTransactionItem item : items) {
                if (item instanceof PauseActivityItem) {
                    pauseFound.value = true;
                    break;
                }
            }
            } else {
                if (transaction.getLifecycleStateRequest() instanceof PauseActivityItem) {
                    pauseFound.value = true;
                }
            }
            return null;
        }).when(mClientLifecycleManager).scheduleTransaction(any());