Use new PreviewPositionHelper for each GetThumbnailPositionUseCase call

It is now injected via a factory so a new instance is used each time.

Bug: 399641570
Flag: EXEMPT BUGFIX
Test: Unit test
Change-Id: Iee703f0c954c95599c07ceb788edabb0d808abb2
diff --git a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
index 553a620..00ef13b 100644
--- a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
+++ b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
@@ -31,7 +31,7 @@
 import com.android.quickstep.recents.domain.usecase.IsThumbnailValidUseCase
 import com.android.quickstep.recents.domain.usecase.OrganizeDesktopTasksUseCase
 import com.android.quickstep.recents.viewmodel.RecentsViewData
-import com.android.systemui.shared.recents.utilities.PreviewPositionHelper
+import com.android.systemui.shared.recents.utilities.PreviewPositionHelper.PreviewPositionHelperFactory
 import kotlinx.coroutines.CoroutineName
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.SupervisorJob
@@ -203,7 +203,7 @@
                     GetThumbnailPositionUseCase(
                         deviceProfileRepository = inject(scopeId),
                         rotationStateRepository = inject(scopeId),
-                        previewPositionHelper = PreviewPositionHelper(),
+                        previewPositionHelperFactory = PreviewPositionHelperFactory(),
                     )
                 OrganizeDesktopTasksUseCase::class.java -> OrganizeDesktopTasksUseCase()
                 else -> {
diff --git a/quickstep/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCase.kt b/quickstep/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCase.kt
index 8501382..e83d9f0 100644
--- a/quickstep/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCase.kt
+++ b/quickstep/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCase.kt
@@ -27,7 +27,7 @@
 class GetThumbnailPositionUseCase(
     private val deviceProfileRepository: RecentsDeviceProfileRepository,
     private val rotationStateRepository: RecentsRotationStateRepository,
-    private val previewPositionHelper: PreviewPositionHelper,
+    private val previewPositionHelperFactory: PreviewPositionHelper.PreviewPositionHelperFactory,
 ) {
     operator fun invoke(
         thumbnailData: ThumbnailData?,
@@ -38,6 +38,7 @@
         val thumbnail =
             thumbnailData?.thumbnail ?: return ThumbnailPosition(Matrix.IDENTITY_MATRIX, false)
 
+        val previewPositionHelper = previewPositionHelperFactory.create()
         previewPositionHelper.updateThumbnailMatrix(
             Rect(0, 0, thumbnail.width, thumbnail.height),
             thumbnailData,
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCaseTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCaseTest.kt
index a253280..7646e69 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCaseTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCaseTest.kt
@@ -25,11 +25,14 @@
 import com.android.quickstep.recents.data.FakeRecentsRotationStateRepository
 import com.android.systemui.shared.recents.model.ThumbnailData
 import com.android.systemui.shared.recents.utilities.PreviewPositionHelper
+import com.android.systemui.shared.recents.utilities.PreviewPositionHelper.PreviewPositionHelperFactory
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.test.runTest
+import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.kotlin.mock
+import org.mockito.kotlin.times
 import org.mockito.kotlin.verify
 import org.mockito.kotlin.whenever
 
@@ -38,15 +41,21 @@
 class GetThumbnailPositionUseCaseTest {
     private val deviceProfileRepository = FakeRecentsDeviceProfileRepository()
     private val rotationStateRepository = FakeRecentsRotationStateRepository()
+    private val previewPositionHelperFactoryMock = mock<PreviewPositionHelperFactory>()
     private val previewPositionHelper = mock<PreviewPositionHelper>()
 
     private val systemUnderTest =
         GetThumbnailPositionUseCase(
-            deviceProfileRepository,
-            rotationStateRepository,
-            previewPositionHelper,
+            deviceProfileRepository = deviceProfileRepository,
+            rotationStateRepository = rotationStateRepository,
+            previewPositionHelperFactory = previewPositionHelperFactoryMock,
         )
 
+    @Before
+    fun setUp() {
+        whenever(previewPositionHelperFactoryMock.create()).thenReturn(previewPositionHelper)
+    }
+
     @Test
     fun nullThumbnailData_returnsIdentityMatrix() = runTest {
         val expectedResult = ThumbnailPosition(Matrix.IDENTITY_MATRIX, false)
@@ -96,6 +105,25 @@
             )
     }
 
+    @Test
+    fun multipleInvocations_usesPreviewPositionHelperFactoryEachTime() = runTest {
+        whenever(previewPositionHelper.matrix).thenReturn(MATRIX)
+
+        val sut =
+            GetThumbnailPositionUseCase(
+                deviceProfileRepository = deviceProfileRepository,
+                rotationStateRepository = rotationStateRepository,
+                previewPositionHelperFactory = previewPositionHelperFactoryMock,
+            )
+        verify(previewPositionHelperFactoryMock, times(0)).create()
+
+        sut.invoke(THUMBNAIL_DATA, CANVAS_WIDTH, CANVAS_HEIGHT, /* isRtl= */ true)
+        sut.invoke(THUMBNAIL_DATA, CANVAS_WIDTH, CANVAS_HEIGHT, /* isRtl= */ false)
+
+        // Each invocation of use case should use a fresh position helper acquired by the factory.
+        verify(previewPositionHelperFactoryMock, times(2)).create()
+    }
+
     private companion object {
         const val THUMBNAIL_WIDTH = 100
         const val THUMBNAIL_HEIGHT = 200