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

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

Synchronize window config updates (4/n)

Before, ClientTransaction can only contain one ActivityTransactionItem,
and store the activity token in ClientTransaction.

Now, each ActivityTransactionItem stores its own activity token, so that
it unblocks to have multiple ActivityTransactionItems in one
ClientTransaction.

Bug: 260873529
Test: atest FrameworksCoreTests:ObjectPoolTests
Test: atest FrameworksCoreTests:TransactionExecutorTests
Change-Id: Ida1bfd63fe5b58280fd66c09e3cdecc62be2d990
parent 6e1c9f67
Loading
Loading
Loading
Loading
+12 −11
Original line number Diff line number Diff line
@@ -3651,15 +3651,16 @@ public final class ActivityThread extends ClientTransactionHandler
    }

    @UnsupportedAppUsage
    public final void sendActivityResult(
            IBinder token, String id, int requestCode,
    public void sendActivityResult(
            IBinder activityToken, String id, int requestCode,
            int resultCode, Intent data) {
        if (DEBUG_RESULTS) Slog.v(TAG, "sendActivityResult: id=" + id
                + " req=" + requestCode + " res=" + resultCode + " data=" + data);
        ArrayList<ResultInfo> list = new ArrayList<ResultInfo>();
        list.add(new ResultInfo(id, requestCode, resultCode, data));
        final ClientTransaction clientTransaction = ClientTransaction.obtain(mAppThread, token);
        clientTransaction.addCallback(ActivityResultItem.obtain(list));
        final ClientTransaction clientTransaction = ClientTransaction.obtain(mAppThread,
                activityToken);
        clientTransaction.addCallback(ActivityResultItem.obtain(activityToken, list));
        try {
            mAppThread.scheduleTransaction(clientTransaction);
        } catch (RemoteException e) {
@@ -4361,16 +4362,16 @@ public final class ActivityThread extends ClientTransactionHandler

    private void schedulePauseWithUserLeavingHint(ActivityClientRecord r) {
        final ClientTransaction transaction = ClientTransaction.obtain(this.mAppThread, r.token);
        transaction.setLifecycleStateRequest(PauseActivityItem.obtain(r.activity.isFinishing(),
                /* userLeaving */ true, r.activity.mConfigChangeFlags, /* dontReport */ false,
                /* autoEnteringPip */ false));
        transaction.setLifecycleStateRequest(PauseActivityItem.obtain(r.token,
                r.activity.isFinishing(), /* userLeaving */ true, r.activity.mConfigChangeFlags,
                /* dontReport */ false, /* autoEnteringPip */ false));
        executeTransaction(transaction);
    }

    private void scheduleResume(ActivityClientRecord r) {
        final ClientTransaction transaction = ClientTransaction.obtain(this.mAppThread, r.token);
        transaction.setLifecycleStateRequest(ResumeActivityItem.obtain(/* isForward */ false,
                /* shouldSendCompatFakeFocus */ false));
        transaction.setLifecycleStateRequest(ResumeActivityItem.obtain(r.token,
                /* isForward */ false, /* shouldSendCompatFakeFocus */ false));
        executeTransaction(transaction);
    }

@@ -5954,8 +5955,8 @@ public final class ActivityThread extends ClientTransactionHandler
                        ? r.createdConfig : mConfigurationController.getConfiguration(),
                r.overrideConfig);
        final ActivityRelaunchItem activityRelaunchItem = ActivityRelaunchItem.obtain(
                null /* pendingResults */, null /* pendingIntents */, 0 /* configChanges */,
                mergedConfiguration, r.mPreserveWindow);
                r.token, null /* pendingResults */, null /* pendingIntents */,
                0 /* configChanges */, mergedConfiguration, r.mPreserveWindow);
        // Make sure to match the existing lifecycle state in the end of the transaction.
        final ActivityLifecycleItem lifecycleRequest =
                TransactionExecutorHelper.getLifecycleRequestForCurrentState(r);
+26 −17
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem {
        CompatibilityInfo.applyOverrideScaleIfNeeded(mConfiguration);
        // Notify the client of an upcoming change in the token configuration. This ensures that
        // batches of config change items only process the newest configuration.
        client.updatePendingActivityConfiguration(token, mConfiguration);
        client.updatePendingActivityConfiguration(getActivityToken(), mConfiguration);
    }

    @Override
@@ -61,8 +61,7 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem {
    @Override
    public Context getContextToUpdate(@NonNull ClientTransactionHandler client,
            @Nullable IBinder token) {
        // TODO(b/260873529): Update ClientTransaction to bundle multiple activity config updates.
        return client.getActivity(token);
        return client.getActivity(getActivityToken());
    }

    // ObjectPoolItem implementation
@@ -70,7 +69,9 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem {
    private ActivityConfigurationChangeItem() {}

    /** Obtain an instance initialized with provided params. */
    public static ActivityConfigurationChangeItem obtain(@NonNull Configuration config) {
    @NonNull
    public static ActivityConfigurationChangeItem obtain(@NonNull IBinder activityToken,
            @NonNull Configuration config) {
        if (config == null) {
            throw new IllegalArgumentException("Config must not be null.");
        }
@@ -80,6 +81,7 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem {
        if (instance == null) {
            instance = new ActivityConfigurationChangeItem();
        }
        instance.setActivityToken(activityToken);
        instance.mConfiguration = config;

        return instance;
@@ -87,6 +89,7 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem {

    @Override
    public void recycle() {
        super.recycle();
        mConfiguration = Configuration.EMPTY;
        ObjectPool.recycle(this);
    }
@@ -96,18 +99,20 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem {

    /** Write to Parcel. */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeTypedObject(mConfiguration, flags);
    }

    /** Read from Parcel. */
    private ActivityConfigurationChangeItem(Parcel in) {
    private ActivityConfigurationChangeItem(@NonNull Parcel in) {
        super(in);
        mConfiguration = in.readTypedObject(Configuration.CREATOR);
    }

    public static final @NonNull Creator<ActivityConfigurationChangeItem> CREATOR =
            new Creator<ActivityConfigurationChangeItem>() {
        public ActivityConfigurationChangeItem createFromParcel(Parcel in) {
            new Creator<>() {
                public ActivityConfigurationChangeItem createFromParcel(@NonNull Parcel in) {
                    return new ActivityConfigurationChangeItem(in);
                }

@@ -121,7 +126,7 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
        if (!super.equals(o)) {
            return false;
        }
        final ActivityConfigurationChangeItem other = (ActivityConfigurationChangeItem) o;
@@ -130,11 +135,15 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem {

    @Override
    public int hashCode() {
        return mConfiguration.hashCode();
        int result = 17;
        result = 31 * result + super.hashCode();
        result = 31 * result + Objects.hashCode(mConfiguration);
        return result;
    }

    @Override
    public String toString() {
        return "ActivityConfigurationChange{config=" + mConfiguration + "}";
        return "ActivityConfigurationChange{" + super.toString()
                + ",config=" + mConfiguration + "}";
    }
}
+8 −5
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
package android.app.servertransaction;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.os.Parcel;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -50,12 +52,13 @@ public abstract class ActivityLifecycleItem extends ActivityTransactionItem {
    public static final int ON_DESTROY = 6;
    public static final int ON_RESTART = 7;

    ActivityLifecycleItem() {}

    ActivityLifecycleItem(@NonNull Parcel in) {
        super(in);
    }

    /** A final lifecycle state that an activity should reach. */
    @LifecycleState
    public abstract int getTargetState();

    /** Called by subclasses to make sure base implementation is cleaned up */
    @Override
    public void recycle() {
    }
}
+34 −24
Original line number Diff line number Diff line
@@ -56,18 +56,18 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
    private ActivityClientRecord mActivityClientRecord;

    @Override
    public void preExecute(ClientTransactionHandler client, IBinder token) {
    public void preExecute(@NonNull ClientTransactionHandler client, @NonNull IBinder token) {
        // The local config is already scaled so only apply if this item is from server side.
        if (!client.isExecutingLocalTransaction()) {
            CompatibilityInfo.applyOverrideScaleIfNeeded(mConfig);
        }
        mActivityClientRecord = client.prepareRelaunchActivity(token, mPendingResults,
        mActivityClientRecord = client.prepareRelaunchActivity(getActivityToken(), mPendingResults,
                mPendingNewIntents, mConfigChanges, mConfig, mPreserveWindow);
    }

    @Override
    public void execute(ClientTransactionHandler client, ActivityClientRecord r,
            PendingTransactionActions pendingActions) {
    public void execute(@NonNull ClientTransactionHandler client, @NonNull ActivityClientRecord r,
            @NonNull PendingTransactionActions pendingActions) {
        if (mActivityClientRecord == null) {
            if (DEBUG_ORDER) Slog.d(TAG, "Activity relaunch cancelled");
            return;
@@ -78,9 +78,9 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
    }

    @Override
    public void postExecute(ClientTransactionHandler client, IBinder token,
            PendingTransactionActions pendingActions) {
        final ActivityClientRecord r = getActivityClientRecord(client, token);
    public void postExecute(@NonNull ClientTransactionHandler client, @NonNull IBinder token,
            @NonNull PendingTransactionActions pendingActions) {
        final ActivityClientRecord r = getActivityClientRecord(client);
        client.reportRelaunch(r);
    }

@@ -89,13 +89,16 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
    private ActivityRelaunchItem() {}

    /** Obtain an instance initialized with provided params. */
    public static ActivityRelaunchItem obtain(List<ResultInfo> pendingResults,
            List<ReferrerIntent> pendingNewIntents, int configChanges, MergedConfiguration config,
            boolean preserveWindow) {
    @NonNull
    public static ActivityRelaunchItem obtain(@NonNull IBinder activityToken,
            @Nullable List<ResultInfo> pendingResults,
            @Nullable List<ReferrerIntent> pendingNewIntents, int configChanges,
            @NonNull MergedConfiguration config, boolean preserveWindow) {
        ActivityRelaunchItem instance = ObjectPool.obtain(ActivityRelaunchItem.class);
        if (instance == null) {
            instance = new ActivityRelaunchItem();
        }
        instance.setActivityToken(activityToken);
        instance.mPendingResults = pendingResults;
        instance.mPendingNewIntents = pendingNewIntents;
        instance.mConfigChanges = configChanges;
@@ -107,6 +110,7 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {

    @Override
    public void recycle() {
        super.recycle();
        mPendingResults = null;
        mPendingNewIntents = null;
        mConfigChanges = 0;
@@ -121,7 +125,8 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {

    /** Write to Parcel. */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeTypedList(mPendingResults, flags);
        dest.writeTypedList(mPendingNewIntents, flags);
        dest.writeInt(mConfigChanges);
@@ -130,7 +135,8 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
    }

    /** Read from Parcel. */
    private ActivityRelaunchItem(Parcel in) {
    private ActivityRelaunchItem(@NonNull Parcel in) {
        super(in);
        mPendingResults = in.createTypedArrayList(ResultInfo.CREATOR);
        mPendingNewIntents = in.createTypedArrayList(ReferrerIntent.CREATOR);
        mConfigChanges = in.readInt();
@@ -139,8 +145,8 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
    }

    public static final @NonNull Creator<ActivityRelaunchItem> CREATOR =
            new Creator<ActivityRelaunchItem>() {
        public ActivityRelaunchItem createFromParcel(Parcel in) {
            new Creator<>() {
                public ActivityRelaunchItem createFromParcel(@NonNull Parcel in) {
                    return new ActivityRelaunchItem(in);
                }

@@ -154,7 +160,7 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
        if (!super.equals(o)) {
            return false;
        }
        final ActivityRelaunchItem other = (ActivityRelaunchItem) o;
@@ -167,6 +173,7 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + super.hashCode();
        result = 31 * result + Objects.hashCode(mPendingResults);
        result = 31 * result + Objects.hashCode(mPendingNewIntents);
        result = 31 * result + mConfigChanges;
@@ -177,8 +184,11 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {

    @Override
    public String toString() {
        return "ActivityRelaunchItem{pendingResults=" + mPendingResults
                + ",pendingNewIntents=" + mPendingNewIntents + ",configChanges="  + mConfigChanges
                + ",config=" + mConfig + ",preserveWindow" + mPreserveWindow + "}";
        return "ActivityRelaunchItem{" + super.toString()
                + ",pendingResults=" + mPendingResults
                + ",pendingNewIntents=" + mPendingNewIntents
                + ",configChanges="  + mConfigChanges
                + ",config=" + mConfig
                + ",preserveWindow" + mPreserveWindow + "}";
    }
}
+27 −18
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledAfter;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Build;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Trace;
@@ -61,24 +62,26 @@ public class ActivityResultItem extends ActivityTransactionItem {
    }

    @Override
    public void execute(ClientTransactionHandler client, ActivityClientRecord r,
            PendingTransactionActions pendingActions) {
    public void execute(@NonNull ClientTransactionHandler client, @NonNull ActivityClientRecord r,
            @NonNull PendingTransactionActions pendingActions) {
        Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityDeliverResult");
        client.handleSendResult(r, mResultInfoList, "ACTIVITY_RESULT");
        Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
    }


    // ObjectPoolItem implementation

    private ActivityResultItem() {}

    /** Obtain an instance initialized with provided params. */
    public static ActivityResultItem obtain(List<ResultInfo> resultInfoList) {
    @NonNull
    public static ActivityResultItem obtain(@NonNull IBinder activityToken,
            @NonNull List<ResultInfo> resultInfoList) {
        ActivityResultItem instance = ObjectPool.obtain(ActivityResultItem.class);
        if (instance == null) {
            instance = new ActivityResultItem();
        }
        instance.setActivityToken(activityToken);
        instance.mResultInfoList = resultInfoList;

        return instance;
@@ -86,27 +89,29 @@ public class ActivityResultItem extends ActivityTransactionItem {

    @Override
    public void recycle() {
        super.recycle();
        mResultInfoList = null;
        ObjectPool.recycle(this);
    }


    // Parcelable implementation

    /** Write to Parcel. */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeTypedList(mResultInfoList, flags);
    }

    /** Read from Parcel. */
    private ActivityResultItem(Parcel in) {
    private ActivityResultItem(@NonNull Parcel in) {
        super(in);
        mResultInfoList = in.createTypedArrayList(ResultInfo.CREATOR);
    }

    public static final @NonNull Parcelable.Creator<ActivityResultItem> CREATOR =
            new Parcelable.Creator<ActivityResultItem>() {
        public ActivityResultItem createFromParcel(Parcel in) {
            new Parcelable.Creator<>() {
                public ActivityResultItem createFromParcel(@NonNull Parcel in) {
                    return new ActivityResultItem(in);
                }

@@ -120,7 +125,7 @@ public class ActivityResultItem extends ActivityTransactionItem {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
        if (!super.equals(o)) {
            return false;
        }
        final ActivityResultItem other = (ActivityResultItem) o;
@@ -129,11 +134,15 @@ public class ActivityResultItem extends ActivityTransactionItem {

    @Override
    public int hashCode() {
        return mResultInfoList.hashCode();
        int result = 17;
        result = 31 * result + super.hashCode();
        result = 31 * result + Objects.hashCode(mResultInfoList);
        return result;
    }

    @Override
    public String toString() {
        return "ActivityResultItem{resultInfoList=" + mResultInfoList + "}";
        return "ActivityResultItem{" + super.toString()
                + ",resultInfoList=" + mResultInfoList + "}";
    }
}
Loading