Fix entry bounds for 3 button nav

The fix uses the similar approach to shelf height to ensure that the
keep clear area is being updated as soon as possible for quickstep.

Without this, the entry animation finishes before the actual keep
clear area from the view is registered, which causes the PiP to enter
lower right corner and then move up, which was the regression.

Bug: 260779127
Test: manually
Test: http://recall/-/g8x7ZkgdfbqscttAA9wzl9/72aNHwWH5wihwN4gf3mfj

Change-Id: I548a4821915c6b9066836374910a94f6bcae6630
This commit is contained in:
Mateusz Cicheński
2023-03-07 00:42:48 +00:00
parent 767ab1e8c4
commit dc8af9bd5f
4 changed files with 63 additions and 4 deletions

View File

@@ -70,4 +70,9 @@ interface IPip {
* Sets the next pip animation type to be the alpha animation.
*/
oneway void setPipAnimationTypeToAlpha() = 5;
/**
* Sets the height and visibility of the Launcher keep clear area.
*/
oneway void setLauncherKeepClearAreaHeight(boolean visible, int height) = 6;
}

View File

@@ -1178,6 +1178,20 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
destinationBoundsOut.set(newDestinationBounds);
}
/**
* Directly update the animator bounds.
*/
public void updateAnimatorBounds(Rect bounds) {
final PipAnimationController.PipTransitionAnimator animator =
mPipAnimationController.getCurrentAnimator();
if (animator != null && animator.isRunning()) {
if (animator.getAnimationType() == ANIM_TYPE_BOUNDS) {
animator.updateEndValue(bounds);
}
animator.setDestinationBounds(bounds);
}
}
/**
* Handles all changes to the PictureInPictureParams.
*/

View File

@@ -93,6 +93,11 @@ public class PipTransitionState {
return hasEnteredPip(mState);
}
/** Returns true if activity is currently entering PiP mode. */
public boolean isEnteringPip() {
return isEnteringPip(mState);
}
public void setInSwipePipToHomeTransition(boolean inSwipePipToHomeTransition) {
mInSwipePipToHomeTransition = inSwipePipToHomeTransition;
}
@@ -130,6 +135,11 @@ public class PipTransitionState {
return state == ENTERED_PIP;
}
/** Returns true if activity is currently entering PiP mode. */
public static boolean isEnteringPip(@TransitionState int state) {
return state == ENTERING_PIP;
}
public interface OnPipTransitionStateChangedListener {
void onPipTransitionStateChanged(@TransitionState int oldState,
@TransitionState int newState);

View File

@@ -101,6 +101,7 @@ import com.android.wm.shell.sysui.UserChangeListener;
import com.android.wm.shell.transition.Transitions;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@@ -181,14 +182,20 @@ public class PipController implements PipTransitionController.PipTransitionCallb
// early bail out if the keep clear areas feature is disabled
return;
}
// only move if already in pip, other transitions account for keep clear areas
if (mPipTransitionState.hasEnteredPip()) {
// only move if we're in PiP or transitioning into PiP
if (!mPipTransitionState.shouldBlockResizeRequest()) {
Rect destBounds = mPipKeepClearAlgorithm.adjust(mPipBoundsState,
mPipBoundsAlgorithm);
// only move if the bounds are actually different
if (destBounds != mPipBoundsState.getBounds()) {
mPipTaskOrganizer.scheduleAnimateResizePip(destBounds,
mEnterAnimationDuration, null);
if (mPipTransitionState.hasEnteredPip()) {
// if already in PiP, schedule separate animation
mPipTaskOrganizer.scheduleAnimateResizePip(destBounds,
mEnterAnimationDuration, null);
} else if (mPipTransitionState.isEnteringPip()) {
// while entering PiP we just need to update animator bounds
mPipTaskOrganizer.updateAnimatorBounds(destBounds);
}
}
}
}
@@ -874,6 +881,21 @@ public class PipController implements PipTransitionController.PipTransitionCallb
}
}
private void setLauncherKeepClearAreaHeight(boolean visible, int height) {
if (visible) {
Rect rect = new Rect(
0, mPipBoundsState.getDisplayBounds().bottom - height,
mPipBoundsState.getDisplayBounds().right,
mPipBoundsState.getDisplayBounds().bottom);
Set<Rect> restrictedKeepClearAreas = new HashSet<>(
mPipBoundsState.getRestrictedKeepClearAreas());
restrictedKeepClearAreas.add(rect);
mPipBoundsState.setKeepClearAreas(restrictedKeepClearAreas,
mPipBoundsState.getUnrestrictedKeepClearAreas());
updatePipPositionForKeepClearAreas();
}
}
private void setOnIsInPipStateChangedListener(Consumer<Boolean> callback) {
mOnIsInPipStateChangedListener = callback;
if (mOnIsInPipStateChangedListener != null) {
@@ -1236,6 +1258,14 @@ public class PipController implements PipTransitionController.PipTransitionCallb
});
}
@Override
public void setLauncherKeepClearAreaHeight(boolean visible, int height) {
executeRemoteCallWithTaskPermission(mController, "setLauncherKeepClearAreaHeight",
(controller) -> {
controller.setLauncherKeepClearAreaHeight(visible, height);
});
}
@Override
public void setPipAnimationListener(IPipAnimationListener listener) {
executeRemoteCallWithTaskPermission(mController, "setPipAnimationListener",