Loading core/res/res/values/config.xml +1 −2 Original line number Diff line number Diff line Loading @@ -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> Loading libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading services/core/java/com/android/server/wm/ActivityRecord.java +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading services/core/java/com/android/server/wm/BackNavigationController.java +39 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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; } Loading Loading @@ -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; Loading Loading @@ -1235,7 +1258,7 @@ class BackNavigationController { represent.allowEnterPip); } void createStartingSurface(ActivityRecord[] visibleOpenActivities) { void createStartingSurface(@Nullable TaskSnapshot snapshot) { if (mAdaptors[0].mSwitchType == DIALOG_CLOSE) { return; } Loading @@ -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. Loading Loading @@ -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; Loading Loading @@ -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]); } Loading Loading
core/res/res/values/config.xml +1 −2 Original line number Diff line number Diff line Loading @@ -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> Loading
libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading
services/core/java/com/android/server/wm/ActivityRecord.java +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
services/core/java/com/android/server/wm/BackNavigationController.java +39 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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; } Loading Loading @@ -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; Loading Loading @@ -1235,7 +1258,7 @@ class BackNavigationController { represent.allowEnterPip); } void createStartingSurface(ActivityRecord[] visibleOpenActivities) { void createStartingSurface(@Nullable TaskSnapshot snapshot) { if (mAdaptors[0].mSwitchType == DIALOG_CLOSE) { return; } Loading @@ -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. Loading Loading @@ -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; Loading Loading @@ -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]); } Loading