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

Commit 9851d328 authored by Chris Li's avatar Chris Li
Browse files

Add ActivityWindowInfo into ActivityRelaunchItem

Bug: 287582673
Test: atest FrameworksCoreTests:ObjectPoolTests
Test: atest FrameworksCoreTests:TransactionParcelTests
Change-Id: Ia4897e1a1d6218de8ef2002970d2b1555e7a4815
parent f26047b7
Loading
Loading
Loading
Loading
+19 −11
Original line number Diff line number Diff line
@@ -5998,9 +5998,11 @@ public final class ActivityThread extends ClientTransactionHandler
    }

    @Override
    public ActivityClientRecord prepareRelaunchActivity(IBinder token,
            List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
            int configChanges, MergedConfiguration config, boolean preserveWindow) {
    public ActivityClientRecord prepareRelaunchActivity(@NonNull IBinder token,
            @Nullable List<ResultInfo> pendingResults,
            @Nullable List<ReferrerIntent> pendingNewIntents, int configChanges,
            @NonNull MergedConfiguration config, boolean preserveWindow,
            @NonNull ActivityWindowInfo activityWindowInfo) {
        ActivityClientRecord target = null;
        boolean scheduleRelaunch = false;

@@ -6041,14 +6043,15 @@ public final class ActivityThread extends ClientTransactionHandler
            target.createdConfig = config.getGlobalConfiguration();
            target.overrideConfig = config.getOverrideConfiguration();
            target.pendingConfigChanges |= configChanges;
            target.mActivityWindowInfo = activityWindowInfo;
        }

        return scheduleRelaunch ? target : null;
    }

    @Override
    public void handleRelaunchActivity(ActivityClientRecord tmp,
            PendingTransactionActions pendingActions) {
    public void handleRelaunchActivity(@NonNull ActivityClientRecord tmp,
            @NonNull PendingTransactionActions pendingActions) {
        // If we are getting ready to gc after going to the background, well
        // we are back active so skip it.
        unscheduleGcIdler();
@@ -6128,7 +6131,8 @@ public final class ActivityThread extends ClientTransactionHandler
        r.activity.mChangingConfigurations = true;

        handleRelaunchActivityInner(r, configChanges, tmp.pendingResults, tmp.pendingIntents,
                pendingActions, tmp.startsNotResumed, tmp.overrideConfig, "handleRelaunchActivity");
                pendingActions, tmp.startsNotResumed, tmp.overrideConfig, tmp.mActivityWindowInfo,
                "handleRelaunchActivity");
    }

    void scheduleRelaunchActivity(IBinder token) {
@@ -6183,7 +6187,8 @@ public final class ActivityThread extends ClientTransactionHandler
                r.overrideConfig);
        final ActivityRelaunchItem activityRelaunchItem = ActivityRelaunchItem.obtain(
                r.token, null /* pendingResults */, null /* pendingIntents */,
                0 /* configChanges */, mergedConfiguration, r.mPreserveWindow);
                0 /* configChanges */, mergedConfiguration, r.mPreserveWindow,
                r.getActivityWindowInfo());
        // Make sure to match the existing lifecycle state in the end of the transaction.
        final ActivityLifecycleItem lifecycleRequest =
                TransactionExecutorHelper.getLifecycleRequestForCurrentState(r);
@@ -6194,10 +6199,12 @@ public final class ActivityThread extends ClientTransactionHandler
        executeTransaction(transaction);
    }

    private void handleRelaunchActivityInner(ActivityClientRecord r, int configChanges,
            List<ResultInfo> pendingResults, List<ReferrerIntent> pendingIntents,
            PendingTransactionActions pendingActions, boolean startsNotResumed,
            Configuration overrideConfig, String reason) {
    private void handleRelaunchActivityInner(@NonNull ActivityClientRecord r, int configChanges,
            @Nullable List<ResultInfo> pendingResults,
            @Nullable List<ReferrerIntent> pendingIntents,
            @NonNull PendingTransactionActions pendingActions, boolean startsNotResumed,
            @NonNull Configuration overrideConfig, @NonNull ActivityWindowInfo activityWindowInfo,
            @NonNull String reason) {
        // Preserve last used intent, it may be set from Activity#setIntent().
        final Intent customIntent = r.activity.mIntent;
        // Need to ensure state is saved.
@@ -6230,6 +6237,7 @@ public final class ActivityThread extends ClientTransactionHandler
        }
        r.startsNotResumed = startsNotResumed;
        r.overrideConfig = overrideConfig;
        r.mActivityWindowInfo = activityWindowInfo;

        handleLaunchActivity(r, pendingActions, mLastReportedDeviceId, customIntent);
    }
+8 −4
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.content.res.Configuration;
import android.os.IBinder;
import android.util.MergedConfiguration;
import android.view.SurfaceControl;
import android.window.ActivityWindowInfo;
import android.window.SplashScreenView.SplashScreenViewParcelable;
import android.window.WindowContext;
import android.window.WindowContextInfo;
@@ -232,12 +233,15 @@ public abstract class ClientTransactionHandler {
     * @param config New configuration applied to the activity.
     * @param preserveWindow Whether the activity should try to reuse the window it created,
     *                        including the decor view after the relaunch.
     * @param activityWindowInfo Window information about the relaunched Activity.
     * @return An initialized instance of {@link ActivityThread.ActivityClientRecord} to use during
     *         relaunch, or {@code null} if relaunch cancelled.
     */
    public abstract ActivityClientRecord prepareRelaunchActivity(IBinder token,
            List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
            int configChanges, MergedConfiguration config, boolean preserveWindow);
    public abstract ActivityClientRecord prepareRelaunchActivity(@NonNull IBinder token,
            @Nullable List<ResultInfo> pendingResults,
            @Nullable List<ReferrerIntent> pendingNewIntents, int configChanges,
            @NonNull MergedConfiguration config, boolean preserveWindow,
            @NonNull ActivityWindowInfo activityWindowInfo);

    /**
     * Perform activity relaunch.
@@ -245,7 +249,7 @@ public abstract class ClientTransactionHandler {
     * @param pendingActions Pending actions to be used on later stages of activity transaction.
     * */
    public abstract void handleRelaunchActivity(@NonNull ActivityClientRecord r,
            PendingTransactionActions pendingActions);
            @NonNull PendingTransactionActions pendingActions);

    /**
     * Report that relaunch request was handled.
+14 −4
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.os.Parcel;
import android.os.Trace;
import android.util.MergedConfiguration;
import android.util.Slog;
import android.window.ActivityWindowInfo;

import com.android.internal.content.ReferrerIntent;

@@ -50,6 +51,7 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
    private int mConfigChanges;
    private MergedConfiguration mConfig;
    private boolean mPreserveWindow;
    private ActivityWindowInfo mActivityWindowInfo;

    /**
     * A record that was properly configured for relaunch. Execution will be cancelled if not
@@ -64,7 +66,7 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
            CompatibilityInfo.applyOverrideScaleIfNeeded(mConfig);
        }
        mActivityClientRecord = client.prepareRelaunchActivity(getActivityToken(), mPendingResults,
                mPendingNewIntents, mConfigChanges, mConfig, mPreserveWindow);
                mPendingNewIntents, mConfigChanges, mConfig, mPreserveWindow, mActivityWindowInfo);
    }

    @Override
@@ -101,7 +103,8 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
    public static ActivityRelaunchItem obtain(@NonNull IBinder activityToken,
            @Nullable List<ResultInfo> pendingResults,
            @Nullable List<ReferrerIntent> pendingNewIntents, int configChanges,
            @NonNull MergedConfiguration config, boolean preserveWindow) {
            @NonNull MergedConfiguration config, boolean preserveWindow,
            @NonNull ActivityWindowInfo activityWindowInfo) {
        ActivityRelaunchItem instance = ObjectPool.obtain(ActivityRelaunchItem.class);
        if (instance == null) {
            instance = new ActivityRelaunchItem();
@@ -113,6 +116,7 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
        instance.mConfigChanges = configChanges;
        instance.mConfig = new MergedConfiguration(config);
        instance.mPreserveWindow = preserveWindow;
        instance.mActivityWindowInfo = new ActivityWindowInfo(activityWindowInfo);

        return instance;
    }
@@ -126,6 +130,7 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
        mConfig = null;
        mPreserveWindow = false;
        mActivityClientRecord = null;
        mActivityWindowInfo = null;
        ObjectPool.recycle(this);
    }

@@ -141,6 +146,7 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
        dest.writeInt(mConfigChanges);
        dest.writeTypedObject(mConfig, flags);
        dest.writeBoolean(mPreserveWindow);
        dest.writeTypedObject(mActivityWindowInfo, flags);
    }

    /** Read from Parcel. */
@@ -151,6 +157,7 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
        mConfigChanges = in.readInt();
        mConfig = in.readTypedObject(MergedConfiguration.CREATOR);
        mPreserveWindow = in.readBoolean();
        mActivityWindowInfo = in.readTypedObject(ActivityWindowInfo.CREATOR);
    }

    public static final @NonNull Creator<ActivityRelaunchItem> CREATOR =
@@ -176,7 +183,8 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
        return Objects.equals(mPendingResults, other.mPendingResults)
                && Objects.equals(mPendingNewIntents, other.mPendingNewIntents)
                && mConfigChanges == other.mConfigChanges && Objects.equals(mConfig, other.mConfig)
                && mPreserveWindow == other.mPreserveWindow;
                && mPreserveWindow == other.mPreserveWindow
                && Objects.equals(mActivityWindowInfo, other.mActivityWindowInfo);
    }

    @Override
@@ -188,6 +196,7 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
        result = 31 * result + mConfigChanges;
        result = 31 * result + Objects.hashCode(mConfig);
        result = 31 * result + (mPreserveWindow ? 1 : 0);
        result = 31 * result + Objects.hashCode(mActivityWindowInfo);
        return result;
    }

@@ -198,6 +207,7 @@ public class ActivityRelaunchItem extends ActivityTransactionItem {
                + ",pendingNewIntents=" + mPendingNewIntents
                + ",configChanges="  + mConfigChanges
                + ",config=" + mConfig
                + ",preserveWindow" + mPreserveWindow + "}";
                + ",preserveWindow=" + mPreserveWindow
                + ",activityWindowInfo=" + mActivityWindowInfo + "}";
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ import android.util.DisplayMetrics;
import android.util.MergedConfiguration;
import android.view.Display;
import android.view.View;
import android.window.ActivityWindowInfo;
import android.window.WindowContextInfo;
import android.window.WindowTokenClientController;

@@ -839,7 +840,7 @@ public class ActivityThreadTest {
        final ClientTransactionItem callbackItem = ActivityRelaunchItem.obtain(
                activity.getActivityToken(), null, null, 0,
                new MergedConfiguration(currentConfig, currentConfig),
                false /* preserveWindow */);
                false /* preserveWindow */, new ActivityWindowInfo());
        final ResumeActivityItem resumeStateRequest =
                ResumeActivityItem.obtain(activity.getActivityToken(), true /* isForward */,
                        false /* shouldSendCompatFakeFocus*/);
+3 −1
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import android.util.ArrayMap;
import android.util.MergedConfiguration;
import android.view.IWindow;
import android.view.InsetsState;
import android.window.ActivityWindowInfo;
import android.window.ClientWindowFrames;
import android.window.WindowContext;
import android.window.WindowContextInfo;
@@ -116,7 +117,8 @@ public class ClientTransactionItemTest {
    public void testActivityRelaunchItem_getContextToUpdate() {
        final ActivityRelaunchItem item = ActivityRelaunchItem
                .obtain(mActivityToken, null /* pendingResults */, null  /* pendingNewIntents */,
                        0 /* configChange */, mMergedConfiguration, false /* preserveWindow */);
                        0 /* configChange */, mMergedConfiguration, false /* preserveWindow */,
                        new ActivityWindowInfo());
        final Context context = item.getContextToUpdate(mHandler);

        assertEquals(mActivity, context);
Loading