diff options
5 files changed, 41 insertions, 23 deletions
diff --git a/services/core/java/com/android/server/wm/AbsAppSnapshotController.java b/services/core/java/com/android/server/wm/AbsAppSnapshotController.java index e5c743cc69e4..fd4b06148c5f 100644 --- a/services/core/java/com/android/server/wm/AbsAppSnapshotController.java +++ b/services/core/java/com/android/server/wm/AbsAppSnapshotController.java @@ -147,6 +147,7 @@ abstract class AbsAppSnapshotController<TYPE extends WindowContainer, @Nullable protected abstract ActivityRecord findAppTokenForSnapshot(TYPE source); protected abstract boolean use16BitFormat(); + protected abstract Rect getLetterboxInsets(ActivityRecord topActivity); /** * This is different than {@link #recordSnapshotInner(TYPE)} because it doesn't store @@ -309,7 +310,7 @@ abstract class AbsAppSnapshotController<TYPE extends WindowContainer, final WindowState mainWindow = result.second; final Rect contentInsets = getSystemBarInsets(mainWindow.getFrame(), mainWindow.getInsetsStateWithVisibilityOverride()); - final Rect letterboxInsets = activity.getLetterboxInsets(); + final Rect letterboxInsets = getLetterboxInsets(activity); InsetUtils.addInsets(contentInsets, letterboxInsets); builder.setIsRealSnapshot(true); builder.setId(System.currentTimeMillis()); @@ -335,22 +336,27 @@ abstract class AbsAppSnapshotController<TYPE extends WindowContainer, final Configuration taskConfig = activity.getTask().getConfiguration(); final int displayRotation = taskConfig.windowConfiguration.getDisplayRotation(); final Rect outCrop = new Rect(); + final Point taskSize = new Point(); final Transition.ChangeInfo changeInfo = mCurrentChangeInfo; if (changeInfo != null && changeInfo.mRotation != displayRotation) { // For example, the source is closing and display rotation changes at the same time. // The snapshot should record the state in previous rotation. outCrop.set(changeInfo.mAbsoluteBounds); + taskSize.set(changeInfo.mAbsoluteBounds.right, changeInfo.mAbsoluteBounds.bottom); builder.setRotation(changeInfo.mRotation); builder.setOrientation(changeInfo.mAbsoluteBounds.height() >= changeInfo.mAbsoluteBounds.width() ? Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE); } else { - outCrop.set(taskConfig.windowConfiguration.getBounds()); + final Configuration srcConfig = source.getConfiguration(); + outCrop.set(srcConfig.windowConfiguration.getBounds()); + final Rect taskBounds = taskConfig.windowConfiguration.getBounds(); + taskSize.set(taskBounds.width(), taskBounds.height()); builder.setRotation(displayRotation); - builder.setOrientation(taskConfig.orientation); + builder.setOrientation(srcConfig.orientation); } outCrop.offsetTo(0, 0); - builder.setTaskSize(new Point(outCrop.right, outCrop.bottom)); + builder.setTaskSize(taskSize); return outCrop; } @@ -438,7 +444,7 @@ abstract class AbsAppSnapshotController<TYPE extends WindowContainer, return null; } final Rect contentInsets = new Rect(systemBarInsets); - final Rect letterboxInsets = topActivity.getLetterboxInsets(); + final Rect letterboxInsets = getLetterboxInsets(topActivity); InsetUtils.addInsets(contentInsets, letterboxInsets); // Note, the app theme snapshot is never translucent because we enforce a non-translucent // color above diff --git a/services/core/java/com/android/server/wm/ActivitySnapshotController.java b/services/core/java/com/android/server/wm/ActivitySnapshotController.java index f83003d4e278..62fb4bfc74d7 100644 --- a/services/core/java/com/android/server/wm/ActivitySnapshotController.java +++ b/services/core/java/com/android/server/wm/ActivitySnapshotController.java @@ -21,6 +21,7 @@ import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; +import android.graphics.Rect; import android.os.Environment; import android.os.SystemProperties; import android.os.Trace; @@ -617,6 +618,12 @@ class ActivitySnapshotController extends AbsAppSnapshotController<ActivityRecord return mPersistInfoProvider.use16BitFormat(); } + @Override + protected Rect getLetterboxInsets(ActivityRecord topActivity) { + // Do not capture letterbox for ActivityRecord + return Letterbox.EMPTY_RECT; + } + @NonNull private SparseArray<UserSavedFile> getUserFiles(int userId) { if (mUserSavedFiles.get(userId) == null) { diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java index 38ee4564396e..b51f89931128 100644 --- a/services/core/java/com/android/server/wm/BackNavigationController.java +++ b/services/core/java/com/android/server/wm/BackNavigationController.java @@ -35,6 +35,7 @@ import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_PREDICT_BACK; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; +import android.content.res.Configuration; import android.content.res.ResourceId; import android.graphics.Point; import android.graphics.Rect; @@ -1065,8 +1066,9 @@ class BackNavigationController { if (mOpenActivities != null) { for (int i = mOpenActivities.length - 1; i >= 0; --i) { - if (mOpenActivities[i].mLaunchTaskBehind) { - restoreLaunchBehind(mOpenActivities[i]); + final ActivityRecord resetActivity = mOpenActivities[i]; + if (resetActivity.mLaunchTaskBehind) { + restoreLaunchBehind(resetActivity); } } } @@ -1233,8 +1235,7 @@ class BackNavigationController { represent.allowEnterPip); } - void createStartingSurface(@NonNull WindowContainer closeWindow, - ActivityRecord[] visibleOpenActivities) { + void createStartingSurface(ActivityRecord[] visibleOpenActivities) { if (mAdaptors[0].mSwitchType == DIALOG_CLOSE) { return; } @@ -1253,12 +1254,15 @@ class BackNavigationController { 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. + final Configuration openConfig = mAdaptors.length == 1 + ? mainActivity.getConfiguration() : openTask.getConfiguration(); mRequestedStartingSurfaceId = openTask.mAtmService.mTaskOrganizerController .addWindowlessStartingSurface(openTask, mainActivity, - // Choose configuration from closeWindow, because the configuration - // of opening target may not update before resume, so the starting - // surface should occlude it entirely. - mRemoteAnimationTarget.leash, snapshot, closeWindow.getConfiguration(), + mAdaptors.length == 1 ? mainActivity.getSurfaceControl() + : mRemoteAnimationTarget.leash, snapshot, openConfig, new IWindowlessStartingSurfaceCallback.Stub() { // Once the starting surface has been created in shell, it will call // onSurfaceAdded to pass the created surface to core, so if a @@ -1290,10 +1294,7 @@ class BackNavigationController { if (mStartingSurface != null && mStartingSurface.isValid()) { SurfaceControl.Transaction transaction = reparentTransaction != null ? reparentTransaction : mAdaptors[0].mTarget.getPendingTransaction(); - if (mAdaptors.length == 1) { - transaction.reparent(mStartingSurface, - mAdaptors[0].mTarget.getSurfaceControl()); - } else { + if (mAdaptors.length != 1) { // More than one opening window, reparent starting surface to leaf task. final WindowContainer wc = mAdaptors[0].mTarget; final Task task = wc.asActivityRecord() != null @@ -1499,16 +1500,15 @@ class BackNavigationController { /** * Apply preview strategy on the opening target - * @param closeWindow The close window, where it's configuration should cover all - * open target(s). + * * @param openAnimationAdaptor The animator who can create starting surface. * @param visibleOpenActivities The visible activities in opening targets. */ - private void applyPreviewStrategy(@NonNull WindowContainer closeWindow, + private void applyPreviewStrategy( @NonNull BackWindowAnimationAdaptorWrapper openAnimationAdaptor, @NonNull ActivityRecord[] visibleOpenActivities) { if (isSupportWindowlessSurface() && mShowWindowlessSurface && !mIsLaunchBehind) { - openAnimationAdaptor.createStartingSurface(closeWindow, visibleOpenActivities); + openAnimationAdaptor.createStartingSurface(visibleOpenActivities); } else { for (int i = visibleOpenActivities.length - 1; i >= 0; --i) { setLaunchBehind(visibleOpenActivities[i]); @@ -1539,7 +1539,7 @@ class BackNavigationController { } mCloseTarget.mTransitionController.mSnapshotController .mActivitySnapshotController.clearOnBackPressedActivities(); - applyPreviewStrategy(mCloseTarget, mOpenAnimAdaptor, openingActivities); + applyPreviewStrategy(mOpenAnimAdaptor, openingActivities); final IBackAnimationFinishedCallback callback = makeAnimationFinishedCallback(); final RemoteAnimationTarget[] targets = getAnimationTargets(); diff --git a/services/core/java/com/android/server/wm/Letterbox.java b/services/core/java/com/android/server/wm/Letterbox.java index e66321ae8219..362d4efa0825 100644 --- a/services/core/java/com/android/server/wm/Letterbox.java +++ b/services/core/java/com/android/server/wm/Letterbox.java @@ -49,7 +49,7 @@ import java.util.function.Supplier; */ public class Letterbox { - private static final Rect EMPTY_RECT = new Rect(); + static final Rect EMPTY_RECT = new Rect(); private static final Point ZERO_POINT = new Point(0, 0); private final Supplier<SurfaceControl.Builder> mSurfaceControlFactory; diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java index 8b622d28b651..4218f8f88a07 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -270,6 +270,11 @@ class TaskSnapshotController extends AbsAppSnapshotController<Task, TaskSnapshot return source.getTaskDescription(); } + @Override + protected Rect getLetterboxInsets(ActivityRecord topActivity) { + return topActivity.getLetterboxInsets(); + } + void getClosingTasksInner(Task task, ArraySet<Task> outClosingTasks) { // Since RecentsAnimation will handle task snapshot while switching apps with the // best capture timing (e.g. IME window capture), |