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

Commit 9720e32d authored by Sherry Zhou's avatar Sherry Zhou Committed by Android (Google) Code Review
Browse files

Merge "Revert "[automerger skipped] Merge "Revert "Make media squishy for...

Merge "Revert "[automerger skipped] Merge "Revert "Make media squishy for portrait shade open and close"" into tm-dev am: 5bcfb4c3 am: 0dd9f892 am: be0f9f70 am: ee086331 -s ours""
parents 7b5f243c f203c3a2
Loading
Loading
Loading
Loading
+0 −18
Original line number Diff line number Diff line
@@ -203,14 +203,6 @@ class MediaHost constructor(
                }
            }

        override var squishFraction: Float = 1.0f
            set(value) {
                if (!value.equals(field)) {
                    field = value
                    changedListener?.invoke()
                }
            }

        override var showsOnlyActiveMedia: Boolean = false
            set(value) {
                if (!value.equals(field)) {
@@ -261,7 +253,6 @@ class MediaHost constructor(
        override fun copy(): MediaHostState {
            val mediaHostState = MediaHostStateHolder()
            mediaHostState.expansion = expansion
            mediaHostState.squishFraction = squishFraction
            mediaHostState.showsOnlyActiveMedia = showsOnlyActiveMedia
            mediaHostState.measurementInput = measurementInput?.copy()
            mediaHostState.visible = visible
@@ -280,9 +271,6 @@ class MediaHost constructor(
            if (expansion != other.expansion) {
                return false
            }
            if (squishFraction != other.squishFraction) {
                return false
            }
            if (showsOnlyActiveMedia != other.showsOnlyActiveMedia) {
                return false
            }
@@ -301,7 +289,6 @@ class MediaHost constructor(
        override fun hashCode(): Int {
            var result = measurementInput?.hashCode() ?: 0
            result = 31 * result + expansion.hashCode()
            result = 31 * result + squishFraction.hashCode()
            result = 31 * result + falsingProtectionNeeded.hashCode()
            result = 31 * result + showsOnlyActiveMedia.hashCode()
            result = 31 * result + if (visible) 1 else 2
@@ -341,11 +328,6 @@ interface MediaHostState {
     */
    var expansion: Float

    /**
     * Fraction of the height animation.
     */
    var squishFraction: Float

    /**
     * Is this host only showing active media or is it showing all of them including resumption?
     */
+29 −56
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.systemui.media

import android.content.Context
import android.content.res.Configuration
import androidx.annotation.VisibleForTesting
import androidx.constraintlayout.widget.ConstraintSet
import com.android.systemui.R
import com.android.systemui.statusbar.policy.ConfigurationController
@@ -279,62 +278,38 @@ class MediaViewController @Inject constructor(
        }
    }

    /**
     * Apply squishFraction to a copy of viewState such that the cached version is untouched.
     */
    @VisibleForTesting
    internal fun squishViewState(
        viewState: TransitionViewState,
        squishFraction: Float
    ): TransitionViewState {
        val squishedViewState = viewState.copy()
        squishedViewState.height = (squishedViewState.height * squishFraction).toInt()
        val albumArtViewState = squishedViewState.widgetStates.get(R.id.album_art)
        if (albumArtViewState != null) {
            albumArtViewState.height = squishedViewState.height
        }
        return squishedViewState
    }

    /**
     * Obtain a new viewState for a given media state. This usually returns a cached state, but if
     * it's not available, it will recreate one by measuring, which may be expensive.
     */
    @VisibleForTesting
    public fun obtainViewState(state: MediaHostState?): TransitionViewState? {
    private fun obtainViewState(state: MediaHostState?): TransitionViewState? {
        if (state == null || state.measurementInput == null) {
            return null
        }
        // Only a subset of the state is relevant to get a valid viewState. Let's get the cachekey
        var cacheKey = getKey(state, isGutsVisible, tmpKey)
        val viewState = viewStates[cacheKey]

        if (viewState != null) {
            // we already have cached this measurement, let's continue
            if (state.squishFraction < 1f) {
                return squishViewState(viewState, state.squishFraction)
            }
            return viewState
        }
        // Copy the key since this might call recursively into it and we're using tmpKey
        cacheKey = cacheKey.copy()
        val result: TransitionViewState?
        if (transitionLayout == null) {
            return null
        }

        // Not cached. Let's create a new measurement
        if (transitionLayout != null) {
            // Let's create a new measurement
            if (state.expansion == 0.0f || state.expansion == 1.0f) {
                result = transitionLayout!!.calculateViewState(
                        state.measurementInput!!,
                        constraintSetForExpansion(state.expansion),
                        TransitionViewState())

                setGutsViewState(result)
                // We don't want to cache interpolated or null states as this could quickly fill up
                // our cache. We only cache the start and the end states since the interpolation
                // is cheap
            setGutsViewState(result)
                viewStates[cacheKey] = result
            logger.logMediaSize("measured new viewState", result.width, result.height)
            } else {
                // This is an interpolated state
                val startState = state.copy().also { it.expansion = 0.0f }
@@ -343,16 +318,14 @@ class MediaViewController @Inject constructor(
                // from the start and end state and interpolate them
                val startViewState = obtainViewState(startState) as TransitionViewState
                val endState = state.copy().also { it.expansion = 1.0f }

                val endViewState = obtainViewState(endState) as TransitionViewState
                result = layoutController.getInterpolatedState(
                        startViewState,
                        endViewState,
                        state.expansion)
            logger.logMediaSize("interpolated viewState", result.width, result.height)
            }
        if (state.squishFraction < 1f) {
            return squishViewState(result, state.squishFraction)
        } else {
            result = null
        }
        return result
    }
+0 −1
Original line number Diff line number Diff line
@@ -691,7 +691,6 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
        if (mQSAnimator != null) {
            mQSAnimator.setPosition(expansion);
        }
        mQqsMediaHost.setSquishFraction(mSquishinessFraction);
    }

    private void setAlphaAnimationProgress(float progress) {
+0 −86
Original line number Diff line number Diff line
package com.android.systemui.media

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}.
 */
@SmallTest
@RunWith(AndroidTestingRunner::class)
@TestableLooper.RunWithLooper
class MediaViewControllerTest : SysuiTestCase() {
    @Mock
    private lateinit var logger: MediaViewLogger

    private val configurationController =
            com.android.systemui.statusbar.phone.ConfigurationControllerImpl(context)
    private val mediaHostStatesManager = MediaHostStatesManager()
    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() {
        MockitoAnnotations.initMocks(this)
        mediaViewController = MediaViewController(
                context,
                configurationController,
                mediaHostStatesManager,
                logger
        )
        mediaViewController.attach(transitionLayout, MediaViewController.TYPE.PLAYER)
    }

    @Test
    fun testObtainViewState_applySquishFraction_toTransitionViewState_height() {
        transitionLayout.measureState = TransitionViewState().apply {
            this.height = 100
        }
        mediaHostStateHolder.expansion = 1f
        val widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY)
        val heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY)
        mediaHostStateHolder.measurementInput =
                MeasurementInput(widthMeasureSpec, heightMeasureSpec)

        // Test no squish
        mediaHostStateHolder.squishFraction = 1f
        assertTrue(mediaViewController.obtainViewState(mediaHostStateHolder)!!.height == 100)

        // Test half squish
        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