Fix strange pip size in horizontal expanded mode

Fix: 228188320
Test: atest TvPipKeepClearAlgorithmTest#test_PipInsets
Change-Id: I217663863acbf15e8bdd6f7a7942f6de56942b95
This commit is contained in:
Galia Peycheva
2022-04-06 13:26:22 +02:00
parent 6166d7a7af
commit 413044b7de
2 changed files with 70 additions and 7 deletions

View File

@@ -133,7 +133,8 @@ class TvPipKeepClearAlgorithm(private val clock: () -> Long) {
val pipAnchorBoundsWithAllDecors = val pipAnchorBoundsWithAllDecors =
getNormalPipAnchorBounds(pipSizeWithAllDecors, transformedMovementBounds) getNormalPipAnchorBounds(pipSizeWithAllDecors, transformedMovementBounds)
val pipAnchorBoundsWithPermanentDecors = removeTemporaryDecors(pipAnchorBoundsWithAllDecors) val pipAnchorBoundsWithPermanentDecors =
removeTemporaryDecorsTransformed(pipAnchorBoundsWithAllDecors)
val result = calculatePipPositionTransformed( val result = calculatePipPositionTransformed(
pipAnchorBoundsWithPermanentDecors, pipAnchorBoundsWithPermanentDecors,
transformedRestrictedAreas, transformedRestrictedAreas,
@@ -465,12 +466,10 @@ class TvPipKeepClearAlgorithm(private val clock: () -> Long) {
} }
fun setPipPermanentDecorInsets(insets: Insets) { fun setPipPermanentDecorInsets(insets: Insets) {
if (pipPermanentDecorInsets == insets) return
pipPermanentDecorInsets = insets pipPermanentDecorInsets = insets
} }
fun setPipTemporaryDecorInsets(insets: Insets) { fun setPipTemporaryDecorInsets(insets: Insets) {
if (pipTemporaryDecorInsets == insets) return
pipTemporaryDecorInsets = insets pipTemporaryDecorInsets = insets
} }
@@ -775,6 +774,7 @@ class TvPipKeepClearAlgorithm(private val clock: () -> Long) {
/** /**
* Removes the space that was reserved for permanent decorations around the pip * Removes the space that was reserved for permanent decorations around the pip
* @param bounds the bounds (in screen space) to remove the insets from
*/ */
private fun removePermanentDecors(bounds: Rect): Rect { private fun removePermanentDecors(bounds: Rect): Rect {
val pipDecorReverseInsets = Insets.subtract(Insets.NONE, pipPermanentDecorInsets) val pipDecorReverseInsets = Insets.subtract(Insets.NONE, pipPermanentDecorInsets)
@@ -784,11 +784,15 @@ class TvPipKeepClearAlgorithm(private val clock: () -> Long) {
/** /**
* Removes the space that was reserved for temporary decorations around the pip * Removes the space that was reserved for temporary decorations around the pip
* @param bounds the bounds (in base case) to remove the insets from
*/ */
private fun removeTemporaryDecors(bounds: Rect): Rect { private fun removeTemporaryDecorsTransformed(bounds: Rect): Rect {
val pipDecorReverseInsets = Insets.subtract(Insets.NONE, pipTemporaryDecorInsets) if (pipTemporaryDecorInsets == Insets.NONE) return bounds
bounds.inset(pipDecorReverseInsets)
return bounds var reverseInsets = Insets.subtract(Insets.NONE, pipTemporaryDecorInsets)
var boundsInScreenSpace = fromTransformedSpace(bounds)
boundsInScreenSpace.inset(reverseInsets)
return toTransformedSpace(boundsInScreenSpace)
} }
private fun Rect.offsetCopy(dx: Int, dy: Int) = Rect(this).apply { offset(dx, dy) } private fun Rect.offsetCopy(dx: Int, dy: Int) = Rect(this).apply { offset(dx, dy) }

View File

@@ -16,6 +16,7 @@
package com.android.wm.shell.pip.tv package com.android.wm.shell.pip.tv
import android.graphics.Insets
import android.graphics.Rect import android.graphics.Rect
import android.testing.AndroidTestingRunner import android.testing.AndroidTestingRunner
import android.util.Size import android.util.Size
@@ -432,6 +433,64 @@ class TvPipKeepClearAlgorithmTest {
assertEquals(currentTime + algorithm.stashDuration, placement.unstashTime) assertEquals(currentTime + algorithm.stashDuration, placement.unstashTime)
} }
@Test
fun test_PipInsets() {
val permInsets = Insets.of(-1, -2, -3, -4)
algorithm.setPipPermanentDecorInsets(permInsets)
testInsetsForAllPositions(permInsets)
val tempInsets = Insets.of(-4, -3, -2, -1)
algorithm.setPipPermanentDecorInsets(Insets.NONE)
algorithm.setPipTemporaryDecorInsets(tempInsets)
testInsetsForAllPositions(tempInsets)
algorithm.setPipPermanentDecorInsets(permInsets)
algorithm.setPipTemporaryDecorInsets(tempInsets)
testInsetsForAllPositions(Insets.add(permInsets, tempInsets))
}
private fun testInsetsForAllPositions(insets: Insets) {
gravity = Gravity.BOTTOM or Gravity.RIGHT
testAnchorPositionWithInsets(insets)
gravity = Gravity.BOTTOM or Gravity.LEFT
testAnchorPositionWithInsets(insets)
gravity = Gravity.TOP or Gravity.LEFT
testAnchorPositionWithInsets(insets)
gravity = Gravity.TOP or Gravity.RIGHT
testAnchorPositionWithInsets(insets)
pipSize = EXPANDED_WIDE_PIP_SIZE
gravity = Gravity.BOTTOM
testAnchorPositionWithInsets(insets)
gravity = Gravity.TOP
testAnchorPositionWithInsets(insets)
pipSize = Size(pipSize.height, pipSize.width)
gravity = Gravity.LEFT
testAnchorPositionWithInsets(insets)
gravity = Gravity.RIGHT
testAnchorPositionWithInsets(insets)
}
private fun testAnchorPositionWithInsets(insets: Insets) {
var pipRect = Rect(0, 0, pipSize.width, pipSize.height)
pipRect.inset(insets)
var expectedBounds = Rect()
Gravity.apply(gravity, pipRect.width(), pipRect.height(), movementBounds, expectedBounds)
val reverseInsets = Insets.subtract(Insets.NONE, insets)
expectedBounds.inset(reverseInsets)
var placement = getActualPlacement()
assertEquals(expectedBounds, placement.bounds)
}
private fun makeSideBar(width: Int, @Gravity.GravityFlags side: Int): Rect { private fun makeSideBar(width: Int, @Gravity.GravityFlags side: Int): Rect {
val sidebar = Rect(0, 0, width, SCREEN_SIZE.height) val sidebar = Rect(0, 0, width, SCREEN_SIZE.height)
if (side == Gravity.RIGHT) { if (side == Gravity.RIGHT) {