Merge "Prevent duplicate call to update movement bounds on rotation"
This commit is contained in:
@@ -129,10 +129,9 @@ public class PipBoundsAlgorithm {
|
||||
: getDefaultBounds();
|
||||
|
||||
final boolean useCurrentSize = reentryState != null && reentryState.getSize() != null;
|
||||
final Rect r = transformBoundsToAspectRatioIfValid(destinationBounds,
|
||||
return transformBoundsToAspectRatioIfValid(destinationBounds,
|
||||
mPipBoundsState.getAspectRatio(), false /* useCurrentMinEdgeSize */,
|
||||
useCurrentSize);
|
||||
return r;
|
||||
}
|
||||
|
||||
/** Returns the current bounds adjusted to the new aspect ratio, if valid. */
|
||||
|
||||
@@ -26,6 +26,7 @@ import android.util.Size;
|
||||
import android.view.DisplayInfo;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.util.function.TriConsumer;
|
||||
import com.android.wm.shell.R;
|
||||
import com.android.wm.shell.common.DisplayLayout;
|
||||
|
||||
@@ -33,7 +34,6 @@ import java.io.PrintWriter;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.Objects;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
/**
|
||||
* Singleton source of truth for the current state of PIP bounds.
|
||||
@@ -80,7 +80,7 @@ public final class PipBoundsState {
|
||||
private boolean mHasUserResizedPip;
|
||||
|
||||
private @Nullable Runnable mOnMinimalSizeChangeCallback;
|
||||
private @Nullable BiConsumer<Boolean, Integer> mOnShelfVisibilityChangeCallback;
|
||||
private @Nullable TriConsumer<Boolean, Integer, Boolean> mOnShelfVisibilityChangeCallback;
|
||||
|
||||
public PipBoundsState(@NonNull Context context) {
|
||||
mContext = context;
|
||||
@@ -310,6 +310,11 @@ public final class PipBoundsState {
|
||||
|
||||
/** Set whether the shelf is showing and its height. */
|
||||
public void setShelfVisibility(boolean showing, int height) {
|
||||
setShelfVisibility(showing, height, true);
|
||||
}
|
||||
|
||||
/** Set whether the shelf is showing and its height. */
|
||||
public void setShelfVisibility(boolean showing, int height, boolean updateMovementBounds) {
|
||||
final boolean shelfShowing = showing && height > 0;
|
||||
if (shelfShowing == mIsShelfShowing && height == mShelfHeight) {
|
||||
return;
|
||||
@@ -318,7 +323,8 @@ public final class PipBoundsState {
|
||||
mIsShelfShowing = showing;
|
||||
mShelfHeight = height;
|
||||
if (mOnShelfVisibilityChangeCallback != null) {
|
||||
mOnShelfVisibilityChangeCallback.accept(mIsShelfShowing, mShelfHeight);
|
||||
mOnShelfVisibilityChangeCallback.accept(mIsShelfShowing, mShelfHeight,
|
||||
updateMovementBounds);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -351,7 +357,7 @@ public final class PipBoundsState {
|
||||
|
||||
/** Set a callback to be notified when the shelf visibility changes. */
|
||||
public void setOnShelfVisibilityChangeCallback(
|
||||
@Nullable BiConsumer<Boolean, Integer> onShelfVisibilityChangeCallback) {
|
||||
@Nullable TriConsumer<Boolean, Integer, Boolean> onShelfVisibilityChangeCallback) {
|
||||
mOnShelfVisibilityChangeCallback = onShelfVisibilityChangeCallback;
|
||||
}
|
||||
|
||||
|
||||
@@ -114,14 +114,14 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac
|
||||
// the bounds for the next orientation using the destination bounds of the animation
|
||||
// TODO: Technically this should account for movement animation bounds as well
|
||||
Rect currentBounds = mPipTaskOrganizer.getCurrentOrAnimatingBounds();
|
||||
final boolean changed = onDisplayRotationChanged(mContext,
|
||||
mPipBoundsState.getNormalBounds(), currentBounds, mTmpInsetBounds, displayId,
|
||||
fromRotation, toRotation, t);
|
||||
final Rect outBounds = new Rect();
|
||||
final boolean changed = onDisplayRotationChanged(mContext, outBounds, currentBounds,
|
||||
mTmpInsetBounds, displayId, fromRotation, toRotation, t);
|
||||
if (changed) {
|
||||
// If the pip was in the offset zone earlier, adjust the new bounds to the bottom of the
|
||||
// movement bounds
|
||||
mTouchHandler.adjustBoundsForRotation(mPipBoundsState.getNormalBounds(),
|
||||
mPipBoundsState.getBounds(), mTmpInsetBounds);
|
||||
mTouchHandler.adjustBoundsForRotation(outBounds, mPipBoundsState.getBounds(),
|
||||
mTmpInsetBounds);
|
||||
|
||||
// The bounds are being applied to a specific snap fraction, so reset any known offsets
|
||||
// for the previous orientation before updating the movement bounds.
|
||||
@@ -129,14 +129,18 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac
|
||||
// not during the fixed rotation. In fixed rotation case, app is about to enter PiP
|
||||
// and we need the offsets preserved to calculate the destination bounds.
|
||||
if (!mIsInFixedRotation) {
|
||||
mPipBoundsState.setShelfVisibility(false /* showing */, 0 /* height */);
|
||||
// Update the shelf visibility without updating the movement bounds. We're already
|
||||
// updating them below with the |fromRotation| flag set, which is more accurate
|
||||
// than using the |fromShelfAdjustment|.
|
||||
mPipBoundsState.setShelfVisibility(false /* showing */, 0 /* height */,
|
||||
false /* updateMovementBounds */);
|
||||
mPipBoundsState.setImeVisibility(false /* showing */, 0 /* height */);
|
||||
mTouchHandler.onShelfVisibilityChanged(false, 0);
|
||||
mTouchHandler.onImeVisibilityChanged(false, 0);
|
||||
}
|
||||
|
||||
updateMovementBounds(mPipBoundsState.getNormalBounds(), true /* fromRotation */,
|
||||
false /* fromImeAdjustment */, false /* fromShelfAdjustment */, t);
|
||||
updateMovementBounds(outBounds, true /* fromRotation */, false /* fromImeAdjustment */,
|
||||
false /* fromShelfAdjustment */, t);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -248,12 +252,16 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac
|
||||
false /* fromImeAdjustment */, false /* fromShelfAdjustment */,
|
||||
null /* wct */);
|
||||
});
|
||||
mPipBoundsState.setOnShelfVisibilityChangeCallback((isShowing, height) -> {
|
||||
mTouchHandler.onShelfVisibilityChanged(isShowing, height);
|
||||
updateMovementBounds(mPipBoundsState.getBounds(),
|
||||
false /* fromRotation */, false /* fromImeAdjustment */,
|
||||
true /* fromShelfAdjustment */, null /* windowContainerTransaction */);
|
||||
});
|
||||
mPipBoundsState.setOnShelfVisibilityChangeCallback(
|
||||
(isShowing, height, updateMovementBounds) -> {
|
||||
mTouchHandler.onShelfVisibilityChanged(isShowing, height);
|
||||
if (updateMovementBounds) {
|
||||
updateMovementBounds(mPipBoundsState.getBounds(),
|
||||
false /* fromRotation */, false /* fromImeAdjustment */,
|
||||
true /* fromShelfAdjustment */,
|
||||
null /* windowContainerTransaction */);
|
||||
}
|
||||
});
|
||||
if (mTouchHandler != null) {
|
||||
// Register the listener for input consumer touch events. Only for Phone
|
||||
mPipInputConsumer.setInputListener(mTouchHandler::handleTouchEvent);
|
||||
|
||||
@@ -31,14 +31,13 @@ import android.util.Size;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.internal.util.function.TriConsumer;
|
||||
import com.android.wm.shell.ShellTestCase;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
/**
|
||||
* Tests for {@link PipBoundsState}.
|
||||
*/
|
||||
@@ -117,23 +116,33 @@ public class PipBoundsStateTest extends ShellTestCase {
|
||||
|
||||
@Test
|
||||
public void testSetShelfVisibility_changed_callbackInvoked() {
|
||||
final BiConsumer<Boolean, Integer> callback = mock(BiConsumer.class);
|
||||
final TriConsumer<Boolean, Integer, Boolean> callback = mock(TriConsumer.class);
|
||||
mPipBoundsState.setOnShelfVisibilityChangeCallback(callback);
|
||||
|
||||
mPipBoundsState.setShelfVisibility(true, 100);
|
||||
|
||||
verify(callback).accept(true, 100);
|
||||
verify(callback).accept(true, 100, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetShelfVisibility_changedWithoutUpdateMovBounds_callbackInvoked() {
|
||||
final TriConsumer<Boolean, Integer, Boolean> callback = mock(TriConsumer.class);
|
||||
mPipBoundsState.setOnShelfVisibilityChangeCallback(callback);
|
||||
|
||||
mPipBoundsState.setShelfVisibility(true, 100, false);
|
||||
|
||||
verify(callback).accept(true, 100, false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetShelfVisibility_notChanged_callbackNotInvoked() {
|
||||
final BiConsumer<Boolean, Integer> callback = mock(BiConsumer.class);
|
||||
final TriConsumer<Boolean, Integer, Boolean> callback = mock(TriConsumer.class);
|
||||
mPipBoundsState.setShelfVisibility(true, 100);
|
||||
mPipBoundsState.setOnShelfVisibilityChangeCallback(callback);
|
||||
|
||||
mPipBoundsState.setShelfVisibility(true, 100);
|
||||
|
||||
verify(callback, never()).accept(true, 100);
|
||||
verify(callback, never()).accept(true, 100, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user