diff options
| author | 2025-03-12 10:57:29 -0700 | |
|---|---|---|
| committer | 2025-03-12 16:00:43 -0700 | |
| commit | b08d443d6dc6b7fd1aab8b4dd21de81804462af2 (patch) | |
| tree | 5c61fb1eabc406dde01d82bb65e0b98dc4d48a07 | |
| parent | 70a58b70fa136a10a0790976c572c4f87ffcdd7d (diff) | |
[PiP2] Allow btn nav legacy fixed rotation
Implement legacy-enter PiP2 with fixed rotation,
by detecting fixed rotation signals in
PipTransition#startAlphaTypeEnterAnimation().
Allow PipController#onDisplayChange() to come in
while we are still entering PiP ans display rotation
TRANSIT_CHANGE transition can be requested during that time as well.
For PiP2, We also don't need to block Transition::setEndFixedRotation()
if both PiP task and its activity are in pinned windowing mode. This is
needed since, in PiP2, both the task and activity become pinned in the
collection phase as the startWCT gets applied.
Bug: 377508792
Flag: com.android.wm.shell.enable_pip2
Test: legacy-enter PiP from landscape orientation in btn-nav
Change-Id: I8c0c033fabfbbcf91521679effc961fc2853c596
3 files changed, 35 insertions, 9 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java index 119763ff2022..4e341ac9b7eb 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java @@ -340,7 +340,8 @@ public class PipController implements ConfigurationChangeListener, mPipDisplayLayoutState.rotateTo(toRotation); } - if (!mPipTransitionState.isInPip()) { + if (!mPipTransitionState.isInPip() + && mPipTransitionState.getState() != PipTransitionState.ENTERING_PIP) { // Skip the PiP-relevant updates if we aren't in a valid PiP state. if (mPipTransitionState.isInFixedRotation()) { ProtoLog.e(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java index 9bb2e38e1526..cfcd56393bc2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java @@ -45,6 +45,7 @@ import android.app.ActivityManager; import android.app.PictureInPictureParams; import android.app.TaskInfo; import android.content.Context; +import android.graphics.Matrix; import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; @@ -452,7 +453,7 @@ public class PipTransition extends PipTransitionController implements final int delta = getFixedRotationDelta(info, pipChange, mPipDisplayLayoutState); if (delta != ROTATION_0) { // Update transition target changes in place to prepare for fixed rotation. - handleBoundsEnterFixedRotation(info, pipChange, pipActivityChange); + updatePipChangesForFixedRotation(info, pipChange, pipActivityChange); } // Update the src-rect-hint in params in place, to set up initial animator transform. @@ -513,7 +514,7 @@ public class PipTransition extends PipTransitionController implements final int delta = getFixedRotationDelta(info, pipChange, mPipDisplayLayoutState); if (delta != ROTATION_0) { // Update transition target changes in place to prepare for fixed rotation. - handleBoundsEnterFixedRotation(info, pipChange, pipActivityChange); + updatePipChangesForFixedRotation(info, pipChange, pipActivityChange); } PipEnterAnimator animator = new PipEnterAnimator(mContext, pipLeash, @@ -546,7 +547,7 @@ public class PipTransition extends PipTransitionController implements return true; } - private void handleBoundsEnterFixedRotation(TransitionInfo info, + private void updatePipChangesForFixedRotation(TransitionInfo info, TransitionInfo.Change outPipTaskChange, TransitionInfo.Change outPipActivityChange) { final TransitionInfo.Change fixedRotationChange = findFixedRotationChange(info); @@ -604,10 +605,33 @@ public class PipTransition extends PipTransitionController implements SurfaceControl pipLeash = mPipTransitionState.getPinnedTaskLeash(); Preconditions.checkNotNull(pipLeash, "Leash is null for alpha transition."); - // Start transition with 0 alpha at the entry bounds. - startTransaction.setPosition(pipLeash, destinationBounds.left, destinationBounds.top) - .setWindowCrop(pipLeash, destinationBounds.width(), destinationBounds.height()) - .setAlpha(pipLeash, 0f); + final int delta = getFixedRotationDelta(info, pipChange, mPipDisplayLayoutState); + if (delta != ROTATION_0) { + updatePipChangesForFixedRotation(info, pipChange, + // We don't have an activity change to animate in legacy enter, + // so just use a placeholder one as the outPipActivityChange. + new TransitionInfo.Change(null /* container */, new SurfaceControl())); + } + startTransaction.setWindowCrop(pipLeash, + destinationBounds.width(), destinationBounds.height()); + if (delta != ROTATION_0) { + // In a fixed rotation case, rotate PiP leash in the old orientation to its final + // position, but keep the bounds visually invariant until async rotation changes + // the display rotation after + int normalizedRotation = delta; + if (normalizedRotation == ROTATION_270) { + normalizedRotation = -ROTATION_90; + } + Matrix transformTensor = new Matrix(); + final float[] matrixTmp = new float[9]; + transformTensor.setTranslate(destinationBounds.left, destinationBounds.top); + transformTensor.postRotate(-normalizedRotation * 90f); + + startTransaction.setMatrix(pipLeash, transformTensor, matrixTmp); + finishTransaction.setMatrix(pipLeash, transformTensor, matrixTmp); + } else { + startTransaction.setPosition(pipLeash, destinationBounds.left, destinationBounds.top); + } PipAlphaAnimator animator = new PipAlphaAnimator(mContext, pipLeash, startTransaction, finishTransaction, PipAlphaAnimator.FADE_IN); diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index c78cdaa10df2..8917f4e787f4 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -3194,7 +3194,8 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { // Fixed rotation only applies to opening or changing activity. return; } - if (task.inMultiWindowMode() && taskTopRunning.inMultiWindowMode()) { + if (!ActivityTaskManagerService.isPip2ExperimentEnabled() + && task.inMultiWindowMode() && taskTopRunning.inMultiWindowMode()) { // Display won't be rotated for multi window Task, so the fixed rotation won't be // applied. This can happen when the windowing mode is changed before the previous // fixed rotation is applied. Check both task and activity because the activity keeps |