summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ikram Gabiyev <gabiyev@google.com> 2025-03-12 20:39:03 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2025-03-12 20:39:03 -0700
commitb2858a5e13a248339af286bbba1c9bc8786e58f3 (patch)
tree87902747c688541536582cdffb8082a62902d535
parentf21e3a1d3a62f69c904bbd183be2e94b1a0a5f7b (diff)
parentb08d443d6dc6b7fd1aab8b4dd21de81804462af2 (diff)
Merge "[PiP2] Allow btn nav legacy fixed rotation" into main
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java3
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java38
-rw-r--r--services/core/java/com/android/server/wm/Transition.java3
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 30313fc63857..2c10af4c5851 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -3191,7 +3191,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