Loading packages/SystemUI/src/com/android/systemui/media/MediaHost.kt +0 −18 Original line number Diff line number Diff line Loading @@ -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)) { Loading Loading @@ -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 Loading @@ -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 } Loading @@ -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 Loading Loading @@ -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? */ Loading packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt +29 −56 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 } Loading @@ -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 } Loading packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +0 −1 Original line number Diff line number Diff line Loading @@ -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) { Loading packages/SystemUI/tests/src/com/android/systemui/media/MediaViewControllerTest.ktdeleted 100644 → 0 +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 Loading
packages/SystemUI/src/com/android/systemui/media/MediaHost.kt +0 −18 Original line number Diff line number Diff line Loading @@ -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)) { Loading Loading @@ -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 Loading @@ -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 } Loading @@ -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 Loading Loading @@ -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? */ Loading
packages/SystemUI/src/com/android/systemui/media/MediaViewController.kt +29 −56 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 } Loading @@ -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 } Loading
packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +0 −1 Original line number Diff line number Diff line Loading @@ -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) { Loading
packages/SystemUI/tests/src/com/android/systemui/media/MediaViewControllerTest.ktdeleted 100644 → 0 +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