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

Commit a9990309 authored by Beth Thibodeau's avatar Beth Thibodeau
Browse files

Don't override alpha for invisible elements when squishing

The seekbar is set to 0.0f alpha when disabled, which was getting
overridden to scale between 0-1 when transitioning between views.
Instead, if an element is invisible in a view state, keep the alpha at 0.

Fixes: 313908304
Test: visual
Test: atest MediaViewControllerTest
Flag: NONE
Change-Id: I70a552efe35fdbe90cd011576d1bd38442472220
parent 2596f1e1
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -405,6 +405,8 @@ constructor(
        }
        widgetGroupIds.forEach { id ->
            squishedViewState.widgetStates.get(id)?.let { state ->
                // Don't modify alpha for elements that should be invisible (e.g. disabled seekbar)
                if (state.alpha != 0f) {
                    state.alpha =
                        calculateAlpha(
                            squishFraction,
@@ -413,6 +415,7 @@ constructor(
                        )
                }
            }
        }
        return groupTop // used for the widget group above this group
    }

+36 −2
Original line number Diff line number Diff line
@@ -22,11 +22,11 @@ import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.view.View
import androidx.test.filters.SmallTest
import com.android.systemui.res.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.media.controls.models.player.MediaViewHolder
import com.android.systemui.media.controls.models.recommendation.RecommendationViewHolder
import com.android.systemui.media.controls.util.MediaFlags
import com.android.systemui.res.R
import com.android.systemui.util.animation.MeasurementInput
import com.android.systemui.util.animation.TransitionLayout
import com.android.systemui.util.animation.TransitionViewState
@@ -37,6 +37,7 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.floatThat
import org.mockito.Mock
import org.mockito.Mockito.never
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when` as whenever
@@ -183,10 +184,12 @@ class MediaViewControllerTest : SysuiTestCase() {
        // detail widgets occupy [90, 100]
        whenever(detailWidgetState.y).thenReturn(90F)
        whenever(detailWidgetState.height).thenReturn(10)
        whenever(detailWidgetState.alpha).thenReturn(1F)
        // control widgets occupy [150, 170]
        whenever(controlWidgetState.y).thenReturn(150F)
        whenever(controlWidgetState.height).thenReturn(20)
        // in current beizer, when the progress reach 0.38, the result will be 0.5
        whenever(controlWidgetState.alpha).thenReturn(1F)
        // in current bezier, when the progress reach 0.38, the result will be 0.5
        mediaViewController.squishViewState(mockViewState, 181.4F / 200F)
        verify(controlWidgetState).alpha = floatThat { kotlin.math.abs(it - 0.5F) < delta }
        verify(detailWidgetState).alpha = floatThat { kotlin.math.abs(it - 1.0F) < delta }
@@ -195,6 +198,34 @@ class MediaViewControllerTest : SysuiTestCase() {
        verify(detailWidgetState, times(2)).alpha = floatThat { kotlin.math.abs(it - 1.0F) < delta }
    }

    @Test
    fun testSquishViewState_applySquishFraction_toTransitionViewState_alpha_invisibleElements() {
        whenever(mockViewState.copy()).thenReturn(mockCopiedState)
        whenever(mockCopiedState.widgetStates)
            .thenReturn(
                mutableMapOf(
                    R.id.media_progress_bar to controlWidgetState,
                    R.id.header_artist to detailWidgetState
                )
            )
        whenever(mockCopiedState.measureHeight).thenReturn(200)
        // detail widgets occupy [90, 100]
        whenever(detailWidgetState.y).thenReturn(90F)
        whenever(detailWidgetState.height).thenReturn(10)
        whenever(detailWidgetState.alpha).thenReturn(0F)
        // control widgets occupy [150, 170]
        whenever(controlWidgetState.y).thenReturn(150F)
        whenever(controlWidgetState.height).thenReturn(20)
        whenever(controlWidgetState.alpha).thenReturn(0F)
        // Verify that alpha remains 0 throughout squishing
        mediaViewController.squishViewState(mockViewState, 181.4F / 200F)
        verify(controlWidgetState, never()).alpha = floatThat { it > 0 }
        verify(detailWidgetState, never()).alpha = floatThat { it > 0 }
        mediaViewController.squishViewState(mockViewState, 200F / 200F)
        verify(controlWidgetState, never()).alpha = floatThat { it > 0 }
        verify(detailWidgetState, never()).alpha = floatThat { it > 0 }
    }

    @Test
    fun testSquishViewState_applySquishFraction_toTransitionViewState_alpha_forRecommendation() {
        whenever(mockViewState.copy()).thenReturn(mockCopiedState)
@@ -210,12 +241,15 @@ class MediaViewControllerTest : SysuiTestCase() {
        // media container widgets occupy [20, 300]
        whenever(mediaContainerWidgetState.y).thenReturn(20F)
        whenever(mediaContainerWidgetState.height).thenReturn(280)
        whenever(mediaContainerWidgetState.alpha).thenReturn(1F)
        // media title widgets occupy [320, 330]
        whenever(mediaTitleWidgetState.y).thenReturn(320F)
        whenever(mediaTitleWidgetState.height).thenReturn(10)
        whenever(mediaTitleWidgetState.alpha).thenReturn(1F)
        // media subtitle widgets occupy [340, 350]
        whenever(mediaSubTitleWidgetState.y).thenReturn(340F)
        whenever(mediaSubTitleWidgetState.height).thenReturn(10)
        whenever(mediaSubTitleWidgetState.alpha).thenReturn(1F)

        // in current beizer, when the progress reach 0.38, the result will be 0.5
        mediaViewController.squishViewState(mockViewState, 307.6F / 360F)