diff options
| author | 2022-05-05 21:05:15 +0000 | |
|---|---|---|
| committer | 2022-05-05 22:44:01 +0000 | |
| commit | c5c41e1be71f1b2afad1e05b775eb28a1d617bd0 (patch) | |
| tree | 4b6295dbacfee45d3e028b2f4c793704bbf1c4ff | |
| parent | f944c4856fd40807c8642d88868000741b9b9514 (diff) | |
Squishy ViewState no longer mutates global album art widgetState
Test: Manual
Fixes: 228454172
Fixes: 231398191
Change-Id: I6e8fcfb234a5cd6af467350871852d925aa3c6d6
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt | 6 | ||||
| -rw-r--r-- | packages/SystemUI/tests/src/com/android/systemui/media/MediaViewControllerTest.kt | 20 |
2 files changed, 24 insertions, 2 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt index 1437c965512e..7eccb3b91bb5 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt @@ -278,13 +278,14 @@ class MediaViewController @Inject constructor( /** * Apply squishFraction to a copy of viewState such that the cached version is untouched. */ - private fun squishViewState( + @VisibleForTesting + internal fun squishViewState( viewState: TransitionViewState, squishFraction: Float ): TransitionViewState { val squishedViewState = viewState.copy() squishedViewState.height = (squishedViewState.height * squishFraction).toInt() - val albumArtViewState = viewState.widgetStates.get(R.id.album_art) + val albumArtViewState = squishedViewState.widgetStates.get(R.id.album_art) if (albumArtViewState != null) { albumArtViewState.height = squishedViewState.height } @@ -317,6 +318,7 @@ class MediaViewController @Inject constructor( if (transitionLayout == null) { return null } + // Not cached. Let's create a new measurement if (state.expansion == 0.0f || state.expansion == 1.0f) { result = transitionLayout!!.calculateViewState( diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaViewControllerTest.kt index 604e1f3ac9eb..18178097d5e3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaViewControllerTest.kt @@ -4,16 +4,22 @@ import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.view.View import androidx.test.filters.SmallTest +import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.util.animation.MeasurementInput import com.android.systemui.util.animation.TransitionLayout import com.android.systemui.util.animation.TransitionViewState +import com.android.systemui.util.animation.WidgetState import junit.framework.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock +import org.mockito.Mockito.times +import org.mockito.Mockito.verify +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.MockitoAnnotations +import org.mockito.Mockito.`when` as whenever /** * Tests for {@link MediaViewController}. @@ -31,6 +37,9 @@ class MediaViewControllerTest : SysuiTestCase() { private lateinit var mediaViewController: MediaViewController private val mediaHostStateHolder = MediaHost.MediaHostStateHolder() private var transitionLayout = TransitionLayout(context, /* attrs */ null, /* defStyleAttr */ 0) + @Mock private lateinit var mockViewState: TransitionViewState + @Mock private lateinit var mockCopiedState: TransitionViewState + @Mock private lateinit var mockWidgetState: WidgetState @Before fun setUp() { @@ -63,4 +72,15 @@ class MediaViewControllerTest : SysuiTestCase() { mediaHostStateHolder.squishFraction = 0.5f assertTrue(mediaViewController.obtainViewState(mediaHostStateHolder)!!.height == 50) } + + @Test + fun testSquish_DoesNotMutateViewState() { + whenever(mockViewState.copy()).thenReturn(mockCopiedState) + whenever(mockCopiedState.widgetStates) + .thenReturn(mutableMapOf(R.id.album_art to mockWidgetState)) + + mediaViewController.squishViewState(mockViewState, 0.5f) + verify(mockViewState, times(1)).copy() + verifyNoMoreInteractions(mockViewState) + } }
\ No newline at end of file |