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

Commit 76cb7285 authored by Wei Sheng Shih's avatar Wei Sheng Shih Committed by Android (Google) Code Review
Browse files

Merge changes I46536554,I14f20b1c into main

* changes:
  Enable predictShowStartingSurface by default.
  Combine launchBehind + solid color splash screen for back predictive.
parents ec792fa4 70ff5360
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -3614,8 +3614,7 @@
    <!-- Whether this device prefers to show snapshot or splash screen on back predict target.
         When set true, there will create windowless starting surface for the preview target, so it
         won't affect activity's lifecycle. This should only be disabled on low-ram device. -->
    <!-- TODO(b/268563842) enable once activity snapshot is ready -->
    <bool name="config_predictShowStartingSurface">false</bool>
    <bool name="config_predictShowStartingSurface">true</bool>

    <!-- default window ShowCircularMask property -->
    <bool name="config_windowShowCircularMask">false</bool>
+1 −1
Original line number Diff line number Diff line
@@ -417,7 +417,7 @@ public class SplashscreenContentDrawer {
        final SplashViewBuilder builder = new SplashViewBuilder(context, ai);
        final SplashScreenView view = builder
                .setWindowBGColor(themeBGColor)
                .chooseStyle(STARTING_WINDOW_TYPE_SPLASH_SCREEN)
                .chooseStyle(STARTING_WINDOW_TYPE_SOLID_COLOR_SPLASH_SCREEN)
                .build();
        view.setNotCopyable();
        return view;
+1 −0
Original line number Diff line number Diff line
@@ -6867,6 +6867,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        // stop tracking
        mSplashScreenStyleSolidColor = true;

        mAtmService.mBackNavigationController.removePredictiveSurfaceIfNeeded(this);
        if (mStartingWindow != null) {
            ProtoLog.v(WM_DEBUG_STARTING_WINDOW, "Finish starting %s"
                    + ": first real window is shown, no animation", win.mToken);
+39 −8
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.policy.TransitionAnimation;
import com.android.internal.protolog.common.ProtoLog;
import com.android.server.wm.utils.InsetUtils;
import com.android.window.flags.Flags;

import java.io.PrintWriter;
import java.util.ArrayList;
@@ -644,6 +645,10 @@ class BackNavigationController {
        return false;
    }

    void removePredictiveSurfaceIfNeeded(ActivityRecord openActivity) {
        mAnimationHandler.markWindowHasDrawn(openActivity);
    }

    private class NavigationMonitor {
        // The window which triggering the back navigation.
        private WindowState mNavigatingWindow;
@@ -897,7 +902,8 @@ class BackNavigationController {
            mWindowManagerService = wms;
            final Context context = wms.mContext;
            mShowWindowlessSurface = context.getResources().getBoolean(
                    com.android.internal.R.bool.config_predictShowStartingSurface);
                    com.android.internal.R.bool.config_predictShowStartingSurface)
                    && Flags.activitySnapshotByDefault();
        }
        private static final int UNKNOWN = 0;
        private static final int TASK_SWITCH = 1;
@@ -1032,6 +1038,23 @@ class BackNavigationController {
            return isAnimateTarget(wc, mCloseAdaptor.mTarget, mSwitchType);
        }

        void markWindowHasDrawn(ActivityRecord activity) {
            if (!mComposed || mWaitTransition) {
                return;
            }
            boolean allWindowDrawn = true;
            for (int i = mOpenAnimAdaptor.mAdaptors.length - 1; i >= 0; --i) {
                final BackWindowAnimationAdaptor next = mOpenAnimAdaptor.mAdaptors[i];
                if (isAnimateTarget(activity, next.mTarget, mSwitchType)) {
                    next.mAppWindowDrawn = true;
                }
                allWindowDrawn &= next.mAppWindowDrawn;
            }
            if (allWindowDrawn) {
                mOpenAnimAdaptor.cleanUpWindowlessSurface(true);
            }
        }

        private static boolean isAnimateTarget(@NonNull WindowContainer window,
                @NonNull WindowContainer animationTarget, int switchType) {
            if (switchType == TASK_SWITCH) {
@@ -1134,15 +1157,17 @@ class BackNavigationController {
            final BackWindowAnimationAdaptor adaptor =
                    new BackWindowAnimationAdaptor(target, isOpen, switchType);
            final SurfaceControl.Transaction pt = target.getPendingTransaction();
            target.startAnimation(pt, adaptor, false /* hidden */, ANIMATION_TYPE_PREDICT_BACK);
            // Workaround to show TaskFragment which can be hide in Transitions and won't show
            // during isAnimating.
            if (isOpen && target.asActivityRecord() != null) {
                final TaskFragment fragment = target.asActivityRecord().getTaskFragment();
                if (fragment != null) {
                    // Ensure task fragment surface has updated, in case configuration has changed.
                    fragment.updateOrganizedTaskFragmentSurface();
                    pt.show(fragment.mSurfaceControl);
                }
            }
            target.startAnimation(pt, adaptor, false /* hidden */, ANIMATION_TYPE_PREDICT_BACK);
            return adaptor;
        }

@@ -1181,8 +1206,6 @@ class BackNavigationController {
                for (int i = mAdaptors.length - 1; i >= 0; --i) {
                    mAdaptors[i].mTarget.cancelAnimation();
                }
                mRequestedStartingSurfaceId = INVALID_TASK_ID;
                mStartingSurface = null;
                if (mCloseTransaction != null) {
                    mCloseTransaction.apply();
                    mCloseTransaction = null;
@@ -1235,7 +1258,7 @@ class BackNavigationController {
                        represent.allowEnterPip);
            }

            void createStartingSurface(ActivityRecord[] visibleOpenActivities) {
            void createStartingSurface(@Nullable TaskSnapshot snapshot) {
                if (mAdaptors[0].mSwitchType == DIALOG_CLOSE) {
                    return;
                }
@@ -1253,7 +1276,6 @@ class BackNavigationController {
                if (mainActivity == null) {
                    return;
                }
                final TaskSnapshot snapshot = getSnapshot(mainOpen, visibleOpenActivities);
                // If there is only one adaptor, attach the windowless window to top activity,
                // because fixed rotation only applies on activity.
                // Note that embedded activity won't use fixed rotation.
@@ -1321,11 +1343,13 @@ class BackNavigationController {
                        .removeWindowlessStartingSurface(mRequestedStartingSurfaceId,
                                !openTransitionMatch);
                mRequestedStartingSurfaceId = INVALID_TASK_ID;
                mStartingSurface = null;
            }
        }

        private static class BackWindowAnimationAdaptor implements AnimationAdapter {
            SurfaceControl mCapturedLeash;
            boolean mAppWindowDrawn;
            private final Rect mBounds = new Rect();
            private final WindowContainer mTarget;
            private final boolean mIsOpen;
@@ -1507,9 +1531,16 @@ class BackNavigationController {
            private void applyPreviewStrategy(
                    @NonNull BackWindowAnimationAdaptorWrapper openAnimationAdaptor,
                    @NonNull ActivityRecord[] visibleOpenActivities) {
                boolean needsLaunchBehind = true;
                if (isSupportWindowlessSurface() && mShowWindowlessSurface && !mIsLaunchBehind) {
                    openAnimationAdaptor.createStartingSurface(visibleOpenActivities);
                } else {
                    final WindowContainer mainOpen = openAnimationAdaptor.mAdaptors[0].mTarget;
                    final TaskSnapshot snapshot = getSnapshot(mainOpen, visibleOpenActivities);
                    openAnimationAdaptor.createStartingSurface(snapshot);
                    // set LaunchBehind if we are creating splash screen surface.
                    needsLaunchBehind = snapshot == null
                            && openAnimationAdaptor.mRequestedStartingSurfaceId != INVALID_TASK_ID;
                }
                if (needsLaunchBehind) {
                    for (int i = visibleOpenActivities.length - 1; i >= 0; --i) {
                        setLaunchBehind(visibleOpenActivities[i]);
                    }