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

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

Add ActivityWindowInfo into MoveToDisplayItem

Bug: 287582673
Test: atest FrameworksCoreTests:ObjectPoolTests
Test: atest FrameworksCoreTests:TransactionParcelTests
Change-Id: I40db958b06fdf1265784f816df4f824414af6fe3
parent 9851d328
Loading
Loading
Loading
Loading
+15 −9
Original line number Diff line number Diff line
@@ -717,7 +717,7 @@ public final class ActivityThread extends ClientTransactionHandler
                    }
                    activity.mMainThread.handleActivityConfigurationChanged(
                            ActivityClientRecord.this, overrideConfig, newDisplayId,
                            false /* alwaysReportChange */);
                            mActivityWindowInfo, false /* alwaysReportChange */);
                }

                @Override
@@ -6659,11 +6659,12 @@ public final class ActivityThread extends ClientTransactionHandler
    /**
     * Sets the supplied {@code overrideConfig} as pending for the {@code token}. Calling
     * this method prevents any calls to
     * {@link #handleActivityConfigurationChanged(ActivityClientRecord, Configuration, int)} from
     * processing any configurations older than {@code overrideConfig}.
     * {@link #handleActivityConfigurationChanged(ActivityClientRecord, Configuration, int,
     * ActivityWindowInfo)} from processing any configurations older than {@code overrideConfig}.
     */
    @Override
    public void updatePendingActivityConfiguration(IBinder token, Configuration overrideConfig) {
    public void updatePendingActivityConfiguration(@NonNull IBinder token,
            @NonNull Configuration overrideConfig) {
        synchronized (mPendingOverrideConfigs) {
            final Configuration pendingOverrideConfig = mPendingOverrideConfigs.get(token);
            if (pendingOverrideConfig != null
@@ -6680,9 +6681,10 @@ public final class ActivityThread extends ClientTransactionHandler
    }

    @Override
    public void handleActivityConfigurationChanged(ActivityClientRecord r,
            @NonNull Configuration overrideConfig, int displayId) {
        handleActivityConfigurationChanged(r, overrideConfig, displayId,
    public void handleActivityConfigurationChanged(@NonNull ActivityClientRecord r,
            @NonNull Configuration overrideConfig, int displayId,
            @NonNull ActivityWindowInfo activityWindowInfo) {
        handleActivityConfigurationChanged(r, overrideConfig, displayId, activityWindowInfo,
                // This is the only place that uses alwaysReportChange=true. The entry point should
                // be from ActivityConfigurationChangeItem or MoveToDisplayItem, so the server side
                // has confirmed the activity should handle the configuration instead of relaunch.
@@ -6700,9 +6702,11 @@ public final class ActivityThread extends ClientTransactionHandler
     * @param overrideConfig Activity override config.
     * @param displayId Id of the display where activity was moved to, -1 if there was no move and
     *                  value didn't change.
     * @param activityWindowInfo the window info of the given activity.
     */
    void handleActivityConfigurationChanged(ActivityClientRecord r,
            @NonNull Configuration overrideConfig, int displayId, boolean alwaysReportChange) {
    void handleActivityConfigurationChanged(@NonNull ActivityClientRecord r,
            @NonNull Configuration overrideConfig, int displayId,
            @NonNull ActivityWindowInfo activityWindowInfo, boolean alwaysReportChange) {
        synchronized (mPendingOverrideConfigs) {
            final Configuration pendingOverrideConfig = mPendingOverrideConfigs.get(r.token);
            if (overrideConfig.isOtherSeqNewer(pendingOverrideConfig)) {
@@ -6735,6 +6739,8 @@ public final class ActivityThread extends ClientTransactionHandler

        // Perform updates.
        r.overrideConfig = overrideConfig;
        r.mActivityWindowInfo = activityWindowInfo;
        // TODO(b/287582673): notify on ActivityWindowInfo change
        final ViewRootImpl viewRoot = r.activity.mDecor != null
            ? r.activity.mDecor.getViewRootImpl() : null;

+3 −2
Original line number Diff line number Diff line
@@ -167,11 +167,12 @@ public abstract class ClientTransactionHandler {

    /** Set pending activity configuration in case it will be updated by other transaction item. */
    public abstract void updatePendingActivityConfiguration(@NonNull IBinder token,
            Configuration overrideConfig);
            @NonNull Configuration overrideConfig);

    /** Deliver activity (override) configuration change. */
    public abstract void handleActivityConfigurationChanged(@NonNull ActivityClientRecord r,
            Configuration overrideConfig, int displayId);
            @NonNull Configuration overrideConfig, int displayId,
            @NonNull ActivityWindowInfo activityWindowInfo);

    /** Deliver {@link android.window.WindowContextInfo} change. */
    public abstract void handleWindowContextInfoChanged(@NonNull IBinder clientToken,
+5 −2
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.content.res.Configuration;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Trace;
import android.window.ActivityWindowInfo;

import java.util.Objects;

@@ -49,11 +50,13 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem {
    }

    @Override
    public void execute(@NonNull ClientTransactionHandler client, @Nullable ActivityClientRecord r,
    public void execute(@NonNull ClientTransactionHandler client, @NonNull ActivityClientRecord r,
            @NonNull PendingTransactionActions pendingActions) {
        // TODO(lifecycler): detect if PIP or multi-window mode changed and report it here.
        Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityConfigChanged");
        client.handleActivityConfigurationChanged(r, mConfiguration, INVALID_DISPLAY);
        client.handleActivityConfigurationChanged(r, mConfiguration, INVALID_DISPLAY,
                // TODO(b/287582673): add ActivityWindowInfo
                new ActivityWindowInfo());
        Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
    }

+14 −4
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.content.res.Configuration;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Trace;
import android.window.ActivityWindowInfo;

import java.util.Objects;

@@ -39,6 +40,7 @@ public class MoveToDisplayItem extends ActivityTransactionItem {

    private int mTargetDisplayId;
    private Configuration mConfiguration;
    private ActivityWindowInfo mActivityWindowInfo;

    @Override
    public void preExecute(@NonNull ClientTransactionHandler client) {
@@ -52,7 +54,8 @@ public class MoveToDisplayItem extends ActivityTransactionItem {
    public void execute(@NonNull ClientTransactionHandler client, @NonNull ActivityClientRecord r,
            @NonNull PendingTransactionActions pendingActions) {
        Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityMovedToDisplay");
        client.handleActivityConfigurationChanged(r, mConfiguration, mTargetDisplayId);
        client.handleActivityConfigurationChanged(r, mConfiguration, mTargetDisplayId,
                mActivityWindowInfo);
        Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
    }

@@ -69,7 +72,7 @@ public class MoveToDisplayItem extends ActivityTransactionItem {
    /** Obtain an instance initialized with provided params. */
    @NonNull
    public static MoveToDisplayItem obtain(@NonNull IBinder activityToken, int targetDisplayId,
            @NonNull Configuration configuration) {
            @NonNull Configuration configuration, @NonNull ActivityWindowInfo activityWindowInfo) {
        MoveToDisplayItem instance = ObjectPool.obtain(MoveToDisplayItem.class);
        if (instance == null) {
            instance = new MoveToDisplayItem();
@@ -77,6 +80,7 @@ public class MoveToDisplayItem extends ActivityTransactionItem {
        instance.setActivityToken(activityToken);
        instance.mTargetDisplayId = targetDisplayId;
        instance.mConfiguration = new Configuration(configuration);
        instance.mActivityWindowInfo = new ActivityWindowInfo(activityWindowInfo);

        return instance;
    }
@@ -86,6 +90,7 @@ public class MoveToDisplayItem extends ActivityTransactionItem {
        super.recycle();
        mTargetDisplayId = 0;
        mConfiguration = null;
        mActivityWindowInfo = null;
        ObjectPool.recycle(this);
    }

@@ -97,6 +102,7 @@ public class MoveToDisplayItem extends ActivityTransactionItem {
        super.writeToParcel(dest, flags);
        dest.writeInt(mTargetDisplayId);
        dest.writeTypedObject(mConfiguration, flags);
        dest.writeTypedObject(mActivityWindowInfo, flags);
    }

    /** Read from Parcel. */
@@ -104,6 +110,7 @@ public class MoveToDisplayItem extends ActivityTransactionItem {
        super(in);
        mTargetDisplayId = in.readInt();
        mConfiguration = in.readTypedObject(Configuration.CREATOR);
        mActivityWindowInfo = in.readTypedObject(ActivityWindowInfo.CREATOR);
    }

    public static final @NonNull Creator<MoveToDisplayItem> CREATOR = new Creator<>() {
@@ -126,7 +133,8 @@ public class MoveToDisplayItem extends ActivityTransactionItem {
        }
        final MoveToDisplayItem other = (MoveToDisplayItem) o;
        return mTargetDisplayId == other.mTargetDisplayId
                && Objects.equals(mConfiguration, other.mConfiguration);
                && Objects.equals(mConfiguration, other.mConfiguration)
                && Objects.equals(mActivityWindowInfo, other.mActivityWindowInfo);
    }

    @Override
@@ -135,6 +143,7 @@ public class MoveToDisplayItem extends ActivityTransactionItem {
        result = 31 * result + super.hashCode();
        result = 31 * result + mTargetDisplayId;
        result = 31 * result + mConfiguration.hashCode();
        result = 31 * result + Objects.hashCode(mActivityWindowInfo);
        return result;
    }

@@ -142,6 +151,7 @@ public class MoveToDisplayItem extends ActivityTransactionItem {
    public String toString() {
        return "MoveToDisplayItem{" + super.toString()
                + ",targetDisplayId=" + mTargetDisplayId
                + ",configuration=" + mConfiguration + "}";
                + ",configuration=" + mConfiguration
                + ",activityWindowInfo=" + mActivityWindowInfo + "}";
    }
}
+13 −9
Original line number Diff line number Diff line
@@ -395,11 +395,13 @@ public class ActivityThreadTest {
            olderConfig.seq = seq + 1;

            final ActivityClientRecord r = getActivityClientRecord(activity);
            activityThread.handleActivityConfigurationChanged(r, olderConfig, INVALID_DISPLAY);
            activityThread.handleActivityConfigurationChanged(r, olderConfig, INVALID_DISPLAY,
                    new ActivityWindowInfo());
            assertEquals(numOfConfig, activity.mNumOfConfigChanges);
            assertEquals(olderConfig.orientation, activity.mConfig.orientation);

            activityThread.handleActivityConfigurationChanged(r, newerConfig, INVALID_DISPLAY);
            activityThread.handleActivityConfigurationChanged(r, newerConfig, INVALID_DISPLAY,
                    new ActivityWindowInfo());
            assertEquals(numOfConfig + 1, activity.mNumOfConfigChanges);
            assertEquals(newerConfig.orientation, activity.mConfig.orientation);
        });
@@ -417,7 +419,7 @@ public class ActivityThreadTest {
            config.orientation = ORIENTATION_PORTRAIT;

            activityThread.handleActivityConfigurationChanged(getActivityClientRecord(activity),
                    config, INVALID_DISPLAY);
                    config, INVALID_DISPLAY, new ActivityWindowInfo());
        });

        final IApplicationThread appThread = activityThread.getApplicationThread();
@@ -488,7 +490,7 @@ public class ActivityThreadTest {
            config.orientation = ORIENTATION_PORTRAIT;

            activityThread.handleActivityConfigurationChanged(getActivityClientRecord(activity),
                    config, INVALID_DISPLAY);
                    config, INVALID_DISPLAY, new ActivityWindowInfo());
        });

        final int numOfConfig = activity.mNumOfConfigChanges;
@@ -618,7 +620,7 @@ public class ActivityThreadTest {
            activityThread.updatePendingActivityConfiguration(activity.getActivityToken(),
                    newActivityConfig);
            activityThread.handleActivityConfigurationChanged(r, newActivityConfig,
                    INVALID_DISPLAY);
                    INVALID_DISPLAY, new ActivityWindowInfo());

            assertEquals("Virtual display orientation must not change when activity"
                            + " configuration orientation changes.",
@@ -783,8 +785,8 @@ public class ActivityThreadTest {

    /**
     * Calls {@link ActivityThread#handleActivityConfigurationChanged(ActivityClientRecord,
     * Configuration, int)} to try to push activity configuration to the activity for the given
     * sequence number.
     * Configuration, int, ActivityWindowInfo)} to try to push activity configuration to the
     * activity for the given sequence number.
     * <p>
     * It uses orientation to push the configuration and it tries a different orientation if the
     * first attempt doesn't make through, to rule out the possibility that the previous
@@ -803,7 +805,8 @@ public class ActivityThreadTest {
        Configuration config = new Configuration();
        config.orientation = ORIENTATION_PORTRAIT;
        config.seq = seq;
        activityThread.handleActivityConfigurationChanged(r, config, INVALID_DISPLAY);
        activityThread.handleActivityConfigurationChanged(r, config, INVALID_DISPLAY,
                new ActivityWindowInfo());

        if (activity.mNumOfConfigChanges > numOfConfig) {
            return config.seq;
@@ -812,7 +815,8 @@ public class ActivityThreadTest {
        config = new Configuration();
        config.orientation = ORIENTATION_LANDSCAPE;
        config.seq = seq + 1;
        activityThread.handleActivityConfigurationChanged(r, config, INVALID_DISPLAY);
        activityThread.handleActivityConfigurationChanged(r, config, INVALID_DISPLAY,
                new ActivityWindowInfo());

        return config.seq;
    }
Loading