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

Commit c5c41e1b authored by Hawkwood Glazier's avatar Hawkwood Glazier
Browse files

Squishy ViewState no longer mutates global album art widgetState

Test: Manual
Fixes: 228454172
Fixes: 231398191
Change-Id: I6e8fcfb234a5cd6af467350871852d925aa3c6d6
parent f944c485
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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(
+20 −0
Original line number Diff line number Diff line
@@ -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