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

Commit dc352a4c authored by Chris Li's avatar Chris Li
Browse files

Synchronize window config updates (14/n)

1. Also trigger display changed callbacks for ActivityRelaunchItem,
   LaunchActivityItem, MoveToDisplayItem, WindowStateResizeItem as
   those may also update Configuration.
2. Instead of testing Configuration changes before and after each
   transaction item execute, record the Context and the first
   pre-transaction Configuration to do the checking at the end, in case
   a Configuration is not changed after executing multiple transaction
   items.

Bug: 260873529
Test: atest FrameworksCoreTests:ClientTransactionItemTest
Change-Id: I380ab82a944fe01bb757467035e2f2c6a8ca5105
parent 91487ebd
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.annotation.Nullable;
import android.app.ActivityThread.ActivityClientRecord;
import android.app.ClientTransactionHandler;
import android.app.ResultInfo;
import android.content.Context;
import android.content.res.CompatibilityInfo;
import android.os.IBinder;
import android.os.Parcel;
@@ -85,6 +86,12 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
        client.reportRelaunch(r);
    }

    @Nullable
    @Override
    public Context getContextToUpdate(@NonNull ClientTransactionHandler client) {
        return client.getActivity(getActivityToken());
    }

    // ObjectPoolItem implementation

    private ActivityRelaunchItem() {}
+9 −0
Original line number Diff line number Diff line
@@ -24,12 +24,14 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityClient;
import android.app.ActivityOptions;
import android.app.ActivityThread;
import android.app.ActivityThread.ActivityClientRecord;
import android.app.ClientTransactionHandler;
import android.app.IActivityClientController;
import android.app.ProfilerInfo;
import android.app.ResultInfo;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.CompatibilityInfo;
@@ -115,6 +117,13 @@ public class LaunchActivityItem extends ClientTransactionItem {
        client.countLaunchingActivities(-1);
    }

    @Nullable
    @Override
    public Context getContextToUpdate(@NonNull ClientTransactionHandler client) {
        // LaunchActivityItem may update the global config with #mCurConfig.
        return ActivityThread.currentApplication();
    }

    // ObjectPoolItem implementation

    private LaunchActivityItem() {}
+7 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityThread.ActivityClientRecord;
import android.app.ClientTransactionHandler;
import android.content.Context;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.os.IBinder;
@@ -55,6 +56,12 @@ public class MoveToDisplayItem extends ActivityTransactionItem {
        Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
    }

    @Nullable
    @Override
    public Context getContextToUpdate(@NonNull ClientTransactionHandler client) {
        return client.getActivity(getActivityToken());
    }

    // ObjectPoolItem implementation

    private MoveToDisplayItem() {}
+46 −25
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import android.content.Context;
import android.content.res.Configuration;
import android.os.IBinder;
import android.os.Process;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.IntArray;
import android.util.Slog;
@@ -62,8 +63,11 @@ public class TransactionExecutor {
    private final PendingTransactionActions mPendingActions = new PendingTransactionActions();
    private final TransactionExecutorHelper mHelper = new TransactionExecutorHelper();

    /** Keeps track of display ids whose Configuration got updated within a transaction. */
    private final ArraySet<Integer> mConfigUpdatedDisplayIds = new ArraySet<>();
    /**
     * Keeps track of the Context whose Configuration got updated within a transaction, mapping to
     * the config before the transaction.
     */
    private final ArrayMap<Context, Configuration> mContextToPreChangedConfigMap = new ArrayMap<>();

    /** Initialize an instance with transaction handler, that will execute all requested actions. */
    public TransactionExecutor(@NonNull ClientTransactionHandler clientTransactionHandler) {
@@ -91,16 +95,35 @@ public class TransactionExecutor {
            executeLifecycleState(transaction);
        }

        if (!mConfigUpdatedDisplayIds.isEmpty()) {
        if (!mContextToPreChangedConfigMap.isEmpty()) {
            // Whether this transaction should trigger DisplayListener#onDisplayChanged.
            try {
                // Calculate display ids that have config changed.
                final ArraySet<Integer> configUpdatedDisplayIds = new ArraySet<>();
                final int contextCount = mContextToPreChangedConfigMap.size();
                for (int i = 0; i < contextCount; i++) {
                    final Context context = mContextToPreChangedConfigMap.keyAt(i);
                    final Configuration preTransactionConfig =
                            mContextToPreChangedConfigMap.valueAt(i);
                    final Configuration postTransactionConfig = context.getResources()
                            .getConfiguration();
                    if (!areConfigurationsEqualForDisplay(
                            postTransactionConfig, preTransactionConfig)) {
                        configUpdatedDisplayIds.add(context.getDisplayId());
                    }
                }

                // Dispatch the display changed callbacks.
                final ClientTransactionListenerController controller =
                        ClientTransactionListenerController.getInstance();
            final int displayCount = mConfigUpdatedDisplayIds.size();
                final int displayCount = configUpdatedDisplayIds.size();
                for (int i = 0; i < displayCount; i++) {
                final int displayId = mConfigUpdatedDisplayIds.valueAt(i);
                    final int displayId = configUpdatedDisplayIds.valueAt(i);
                    controller.onDisplayChanged(displayId);
                }
            mConfigUpdatedDisplayIds.clear();
            } finally {
                mContextToPreChangedConfigMap.clear();
            }
        }

        mPendingActions.clear();
@@ -182,26 +205,24 @@ public class TransactionExecutor {
            }
        }

        final boolean shouldTrackConfigUpdatedContext =
                // No configuration change for local transaction.
                !mTransactionHandler.isExecutingLocalTransaction()
                        // Can't read flag from isolated process.
        final boolean isBundleClientTransactionFlagEnabled = !Process.isIsolated()
                        && !Process.isIsolated()
                        && bundleClientTransactionFlag();
        final Context configUpdatedContext = isBundleClientTransactionFlagEnabled
        final Context configUpdatedContext = shouldTrackConfigUpdatedContext
                ? item.getContextToUpdate(mTransactionHandler)
                : null;
        final Configuration preExecutedConfig = configUpdatedContext != null
                ? new Configuration(configUpdatedContext.getResources().getConfiguration())
                : null;
        if (configUpdatedContext != null
                && !mContextToPreChangedConfigMap.containsKey(configUpdatedContext)) {
            // Keep track of the first pre-executed config of each changed Context.
            mContextToPreChangedConfigMap.put(configUpdatedContext,
                    new Configuration(configUpdatedContext.getResources().getConfiguration()));
        }

        item.execute(mTransactionHandler, mPendingActions);

        if (configUpdatedContext != null) {
            final Configuration postExecutedConfig = configUpdatedContext.getResources()
                    .getConfiguration();
            if (!areConfigurationsEqualForDisplay(postExecutedConfig, preExecutedConfig)) {
                mConfigUpdatedDisplayIds.add(configUpdatedContext.getDisplayId());
            }
        }

        item.postExecute(mTransactionHandler, mPendingActions);
        if (r == null) {
            // Launch activity request will create an activity record.
+9 −0
Original line number Diff line number Diff line
@@ -22,7 +22,9 @@ import static java.util.Objects.requireNonNull;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityThread;
import android.app.ClientTransactionHandler;
import android.content.Context;
import android.os.Parcel;
import android.os.RemoteException;
import android.util.MergedConfiguration;
@@ -61,6 +63,13 @@ public class WindowStateResizeItem extends ClientTransactionItem {
        }
    }

    @Nullable
    @Override
    public Context getContextToUpdate(@NonNull ClientTransactionHandler client) {
        // WindowStateResizeItem may update the global config with #mConfiguration.
        return ActivityThread.currentApplication();
    }

    // ObjectPoolItem implementation

    private WindowStateResizeItem() {}
Loading