Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23e05492 authored by Hongwei Wang's avatar Hongwei Wang
Browse files

Resize PiP on display density dpi change

Video: http://recall/-/aaaaaabFQoRHlzixHdtY/hucGOzgPr3NzCKndSnwpKo
Bug: 229561096
Bug: 229561218
Test: follow the reproduce steps in bug, see video
Change-Id: I9797197a63ed9574caaba7319d0b058821bdab36
parent 3473559b
Loading
Loading
Loading
Loading
+27 −7
Original line number Original line Diff line number Diff line
@@ -524,24 +524,44 @@ public class PipController implements PipTransitionController.PipTransitionCallb
            mMenuController.attachPipMenuView();
            mMenuController.attachPipMenuView();
            // Calculate the snap fraction of the current stack along the old movement bounds
            // Calculate the snap fraction of the current stack along the old movement bounds
            final PipSnapAlgorithm pipSnapAlgorithm = mPipBoundsAlgorithm.getSnapAlgorithm();
            final PipSnapAlgorithm pipSnapAlgorithm = mPipBoundsAlgorithm.getSnapAlgorithm();
            final Rect postChangeStackBounds = new Rect(mPipBoundsState.getBounds());
            final Rect postChangeBounds = new Rect(mPipBoundsState.getBounds());
            final float snapFraction = pipSnapAlgorithm.getSnapFraction(postChangeStackBounds,
            final float snapFraction = pipSnapAlgorithm.getSnapFraction(postChangeBounds,
                    mPipBoundsAlgorithm.getMovementBounds(postChangeStackBounds),
                    mPipBoundsAlgorithm.getMovementBounds(postChangeBounds),
                    mPipBoundsState.getStashedState());
                    mPipBoundsState.getStashedState());


            // Scale PiP on density dpi change, so it appears to be the same size physically.
            final boolean densityDpiChanged = mPipBoundsState.getDisplayLayout().densityDpi() != 0
                    && (mPipBoundsState.getDisplayLayout().densityDpi() != layout.densityDpi());
            if (densityDpiChanged) {
                final float scale = (float) layout.densityDpi()
                        / mPipBoundsState.getDisplayLayout().densityDpi();
                postChangeBounds.set(0, 0,
                        (int) (postChangeBounds.width() * scale),
                        (int) (postChangeBounds.height() * scale));
            }

            updateDisplayLayout.run();
            updateDisplayLayout.run();


            // Calculate the stack bounds in the new orientation based on same fraction along the
            // Calculate the PiP bounds in the new orientation based on same fraction along the
            // rotated movement bounds.
            // rotated movement bounds.
            final Rect postChangeMovementBounds = mPipBoundsAlgorithm.getMovementBounds(
            final Rect postChangeMovementBounds = mPipBoundsAlgorithm.getMovementBounds(
                    postChangeStackBounds, false /* adjustForIme */);
                    postChangeBounds, false /* adjustForIme */);
            pipSnapAlgorithm.applySnapFraction(postChangeStackBounds, postChangeMovementBounds,
            pipSnapAlgorithm.applySnapFraction(postChangeBounds, postChangeMovementBounds,
                    snapFraction, mPipBoundsState.getStashedState(),
                    snapFraction, mPipBoundsState.getStashedState(),
                    mPipBoundsState.getStashOffset(),
                    mPipBoundsState.getStashOffset(),
                    mPipBoundsState.getDisplayBounds(),
                    mPipBoundsState.getDisplayBounds(),
                    mPipBoundsState.getDisplayLayout().stableInsets());
                    mPipBoundsState.getDisplayLayout().stableInsets());


            mTouchHandler.getMotionHelper().movePip(postChangeStackBounds);
            if (densityDpiChanged) {
                // Using PipMotionHelper#movePip directly here may cause race condition since
                // the app content in PiP mode may or may not be updated for the new density dpi.
                final int duration = mContext.getResources().getInteger(
                        R.integer.config_pipEnterAnimationDuration);
                mPipTaskOrganizer.scheduleAnimateResizePip(
                        postChangeBounds, duration, null /* updateBoundsCallback */);
            } else {
                mTouchHandler.getMotionHelper().movePip(postChangeBounds);
            }
        } else {
        } else {
            updateDisplayLayout.run();
            updateDisplayLayout.run();
        }
        }