Fix rendering after rotation.

This commit is contained in:
Alex Hart
2025-05-29 16:01:09 -03:00
committed by Cody Henthorne
parent 21e53e360e
commit 0d51faf618
2 changed files with 62 additions and 2 deletions

View File

@@ -58,6 +58,37 @@ final class PictureInPictureExpansionHelper {
return defaultDimensions.x < ViewUtil.dpToPx(NORMAL_PIP_WIDTH_DP);
}
public void startExpandedSizeTransition(@NonNull Point dimensions, @NonNull Callback callback) {
if (defaultDimensions.equals(dimensions)) {
return;
}
defaultDimensions = dimensions;
int x = (dimensions.x > dimensions.y) ? EXPANDED_PIP_HEIGHT_DP : EXPANDED_PIP_WIDTH_DP;
int y = (dimensions.x > dimensions.y) ? EXPANDED_PIP_WIDTH_DP : EXPANDED_PIP_HEIGHT_DP;
expandedDimensions = new Point(ViewUtil.dpToPx(x), ViewUtil.dpToPx(y));
if (isExpandedOrExpanding()) {
return;
}
beginResizeSelfPipTransition(expandedDimensions, new Callback() {
@Override
public void onAnimationWillStart() {
setState(State.IS_EXPANDING);
callback.onAnimationWillStart();
}
@Override
public void onAnimationHasFinished() {
setState(State.IS_EXPANDED);
callback.onAnimationHasFinished();
}
});
}
public void startDefaultSizeTransition(@NonNull Point dimensions, @NonNull Callback callback) {
if (defaultDimensions.equals(dimensions)) {
return;

View File

@@ -557,8 +557,17 @@ public class WebRtcCallView extends InsetAwareConstraintLayout {
smallLocalRender.setMirror(localCallParticipant.getCameraDirection() == CameraState.Direction.FRONT);
if (state == WebRtcLocalRenderState.EXPANDED) {
pictureInPictureExpansionHelper.beginExpandTransition();
smallLocalRender.setSelfPipMode(CallParticipantView.SelfPipMode.EXPANDED_SELF_PIP, localCallParticipant.isMoreThanOneCameraAvailable());
if (largeLocalRenderFrame.getVisibility() == View.VISIBLE) {
smallLocalRenderFrame.setVisibility(View.VISIBLE);
animatePipToExpandedRectangle(displaySmallSelfPipInLandscape, localCallParticipant.isMoreThanOneCameraAvailable());
largeLocalRender.attachBroadcastVideoSink(null);
largeLocalRenderFrame.setVisibility(View.GONE);
} else {
pictureInPictureExpansionHelper.beginExpandTransition();
smallLocalRender.setSelfPipMode(CallParticipantView.SelfPipMode.EXPANDED_SELF_PIP, localCallParticipant.isMoreThanOneCameraAvailable());
}
return;
} else if ((state.isAnySmall() || state == WebRtcLocalRenderState.GONE) && pictureInPictureExpansionHelper.isExpandedOrExpanding()) {
pictureInPictureExpansionHelper.beginShrinkTransition();
@@ -784,6 +793,26 @@ public class WebRtcCallView extends InsetAwareConstraintLayout {
}
}
private void animatePipToExpandedRectangle(boolean isLandscape, boolean moreThanOneCameraAvailable) {
final Point dimens;
if (isLandscape) {
dimens = new Point(ViewUtil.dpToPx(PictureInPictureExpansionHelper.NORMAL_PIP_HEIGHT_DP),
ViewUtil.dpToPx(PictureInPictureExpansionHelper.NORMAL_PIP_WIDTH_DP));
} else {
dimens = new Point(ViewUtil.dpToPx(PictureInPictureExpansionHelper.NORMAL_PIP_WIDTH_DP),
ViewUtil.dpToPx(PictureInPictureExpansionHelper.NORMAL_PIP_HEIGHT_DP));
}
pictureInPictureExpansionHelper.startExpandedSizeTransition(dimens, new PictureInPictureExpansionHelper.Callback() {
@Override
public void onAnimationHasFinished() {
pictureInPictureGestureHelper.enableCorners();
}
});
smallLocalRender.setSelfPipMode(CallParticipantView.SelfPipMode.EXPANDED_SELF_PIP, moreThanOneCameraAvailable);
}
private void animatePipToLargeRectangle(boolean isLandscape, boolean moreThanOneCameraAvailable) {
final Point dimens;
if (isLandscape) {