diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipKeepClearAlgorithm.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipKeepClearAlgorithm.kt
index 9ede443..5086bed 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipKeepClearAlgorithm.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipKeepClearAlgorithm.kt
@@ -133,7 +133,8 @@
         val pipAnchorBoundsWithAllDecors =
                 getNormalPipAnchorBounds(pipSizeWithAllDecors, transformedMovementBounds)
 
-        val pipAnchorBoundsWithPermanentDecors = removeTemporaryDecors(pipAnchorBoundsWithAllDecors)
+        val pipAnchorBoundsWithPermanentDecors =
+                removeTemporaryDecorsTransformed(pipAnchorBoundsWithAllDecors)
         val result = calculatePipPositionTransformed(
             pipAnchorBoundsWithPermanentDecors,
             transformedRestrictedAreas,
@@ -465,12 +466,10 @@
     }
 
     fun setPipPermanentDecorInsets(insets: Insets) {
-        if (pipPermanentDecorInsets == insets) return
         pipPermanentDecorInsets = insets
     }
 
     fun setPipTemporaryDecorInsets(insets: Insets) {
-        if (pipTemporaryDecorInsets == insets) return
         pipTemporaryDecorInsets = insets
     }
 
@@ -775,6 +774,7 @@
 
     /**
      * 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 {
         val pipDecorReverseInsets = Insets.subtract(Insets.NONE, pipPermanentDecorInsets)
@@ -784,11 +784,15 @@
 
     /**
      * 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 {
-        val pipDecorReverseInsets = Insets.subtract(Insets.NONE, pipTemporaryDecorInsets)
-        bounds.inset(pipDecorReverseInsets)
-        return bounds
+    private fun removeTemporaryDecorsTransformed(bounds: Rect): Rect {
+        if (pipTemporaryDecorInsets == Insets.NONE) 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) }
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/tv/TvPipKeepClearAlgorithmTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/tv/TvPipKeepClearAlgorithmTest.kt
index e6ba70e..9919214 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/tv/TvPipKeepClearAlgorithmTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/tv/TvPipKeepClearAlgorithmTest.kt
@@ -16,6 +16,7 @@
 
 package com.android.wm.shell.pip.tv
 
+import android.graphics.Insets
 import android.graphics.Rect
 import android.testing.AndroidTestingRunner
 import android.util.Size
@@ -432,6 +433,64 @@
         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 {
         val sidebar = Rect(0, 0, width, SCREEN_SIZE.height)
         if (side == Gravity.RIGHT) {
