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

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

Merge "Synchronize window config updates (6/n)" into main

parents 82506efc 3b104a1a
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -62,7 +62,7 @@ import android.app.servertransaction.ActivityLifecycleItem.LifecycleState;
import android.app.servertransaction.ActivityRelaunchItem;
import android.app.servertransaction.ActivityResultItem;
import android.app.servertransaction.ClientTransaction;
import android.app.servertransaction.ClientTransactionItem;
import android.app.servertransaction.DestroyActivityItem;
import android.app.servertransaction.PauseActivityItem;
import android.app.servertransaction.PendingTransactionActions;
import android.app.servertransaction.PendingTransactionActions.StopInfo;
@@ -375,8 +375,8 @@ public final class ActivityThread extends ClientTransactionHandler
    @GuardedBy("mPendingOverrideConfigs")
    private final ArrayMap<IBinder, Configuration> mPendingOverrideConfigs = new ArrayMap<>();
    /** The activities to be truly destroyed (not include relaunch). */
    final Map<IBinder, ClientTransactionItem> mActivitiesToBeDestroyed =
            Collections.synchronizedMap(new ArrayMap<IBinder, ClientTransactionItem>());
    final Map<IBinder, DestroyActivityItem> mActivitiesToBeDestroyed =
            Collections.synchronizedMap(new ArrayMap<>());
    // List of new activities that should be reported when next we idle.
    final ArrayList<ActivityClientRecord> mNewActivities = new ArrayList<>();
    // Number of activities that are currently visible on-screen.
@@ -5799,7 +5799,7 @@ public final class ActivityThread extends ClientTransactionHandler
    }

    @Override
    public Map<IBinder, ClientTransactionItem> getActivitiesToBeDestroyed() {
    public Map<IBinder, DestroyActivityItem> getActivitiesToBeDestroyed() {
        return mActivitiesToBeDestroyed;
    }

+2 −2
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityThread.ActivityClientRecord;
import android.app.servertransaction.ClientTransaction;
import android.app.servertransaction.ClientTransactionItem;
import android.app.servertransaction.DestroyActivityItem;
import android.app.servertransaction.PendingTransactionActions;
import android.app.servertransaction.TransactionExecutor;
import android.content.Context;
@@ -108,7 +108,7 @@ public abstract class ClientTransactionHandler {
    // and deliver callbacks.

    /** Get activity and its corresponding transaction item which are going to destroy. */
    public abstract Map<IBinder, ClientTransactionItem> getActivitiesToBeDestroyed();
    public abstract Map<IBinder, DestroyActivityItem> getActivitiesToBeDestroyed();

    /** Destroy the activity. */
    public abstract void handleDestroyActivity(@NonNull ActivityClientRecord r, boolean finishing,
+0 −18
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import android.annotation.Nullable;
import android.app.ClientTransactionHandler;
import android.app.IApplicationThread;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
@@ -83,23 +82,6 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem {
        return mActivityCallbacks;
    }

    /** Get the target activity. */
    @Nullable
    @UnsupportedAppUsage
    public IBinder getActivityToken() {
        // TODO(b/260873529): remove after we allow multiple activity items in one transaction.
        if (mLifecycleStateRequest != null) {
            return mLifecycleStateRequest.getActivityToken();
        }
        for (int i = mActivityCallbacks.size() - 1; i >= 0; i--) {
            final IBinder token = mActivityCallbacks.get(i).getActivityToken();
            if (token != null) {
                return token;
            }
        }
        return null;
    }

    /** Get the target state lifecycle request. */
    @VisibleForTesting(visibility = PACKAGE)
    @UnsupportedAppUsage
+7 −0
Original line number Diff line number Diff line
@@ -49,6 +49,13 @@ public class DestroyActivityItem extends ActivityLifecycleItem {
        Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
    }

    @Override
    public void postExecute(@NonNull ClientTransactionHandler client,
            @NonNull PendingTransactionActions pendingActions) {
        // Cleanup after execution.
        client.getActivitiesToBeDestroyed().remove(getActivityToken());
    }

    @Override
    public int getTargetState() {
        return ON_DESTROY;
+16 −25
Original line number Diff line number Diff line
@@ -47,7 +47,6 @@ import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;

import java.util.List;
import java.util.Map;

/**
 * Class that manages transaction execution in the correct order.
@@ -75,34 +74,14 @@ public class TransactionExecutor {
     * either remain in the initial state, or last state needed by a callback.
     */
    public void execute(@NonNull ClientTransaction transaction) {
        if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "Start resolving transaction");

        final IBinder token = transaction.getActivityToken();
        if (token != null) {
            final Map<IBinder, ClientTransactionItem> activitiesToBeDestroyed =
                    mTransactionHandler.getActivitiesToBeDestroyed();
            final ClientTransactionItem destroyItem = activitiesToBeDestroyed.get(token);
            if (destroyItem != null) {
                if (transaction.getLifecycleStateRequest() == destroyItem) {
                    // It is going to execute the transaction that will destroy activity with the
                    // token, so the corresponding to-be-destroyed record can be removed.
                    activitiesToBeDestroyed.remove(token);
                }
                if (mTransactionHandler.getActivityClient(token) == null) {
                    // The activity has not been created but has been requested to destroy, so all
                    // transactions for the token are just like being cancelled.
                    Slog.w(TAG, tId(transaction) + "Skip pre-destroyed transaction:\n"
                            + transactionToString(transaction, mTransactionHandler));
                    return;
                }
            }
        if (DEBUG_RESOLVER) {
            Slog.d(TAG, tId(transaction) + "Start resolving transaction");
            Slog.d(TAG, transactionToString(transaction, mTransactionHandler));
        }

        if (DEBUG_RESOLVER) Slog.d(TAG, transactionToString(transaction, mTransactionHandler));

        executeCallbacks(transaction);

        executeLifecycleState(transaction);

        mPendingActions.clear();
        if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "End resolving transaction");
    }
@@ -135,6 +114,14 @@ public class TransactionExecutor {
            final IBinder token = item.getActivityToken();
            ActivityClientRecord r = mTransactionHandler.getActivityClient(token);

            if (token != null && r == null
                    && mTransactionHandler.getActivitiesToBeDestroyed().containsKey(token)) {
                // The activity has not been created but has been requested to destroy, so all
                // transactions for the token are just like being cancelled.
                Slog.w(TAG, "Skip pre-destroyed transaction item:\n" + item);
                continue;
            }

            if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "Resolving callback: " + item);
            final int postExecutionState = item.getPostExecutionState();

@@ -211,6 +198,10 @@ public class TransactionExecutor {
        }

        if (r == null) {
            if (mTransactionHandler.getActivitiesToBeDestroyed().get(token) == lifecycleItem) {
                // Always cleanup for destroy item.
                lifecycleItem.postExecute(mTransactionHandler, mPendingActions);
            }
            // Ignore requests for non-existent client records for now.
            return;
        }
Loading