Merge "Fix media having wrong expansion on QQS/landscape after fold/unfold" into tm-qpr-dev

This commit is contained in:
Christian Göllner
2022-08-19 10:46:04 +00:00
committed by Android (Google) Code Review
2 changed files with 67 additions and 49 deletions

View File

@@ -39,6 +39,7 @@ import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import javax.inject.Provider;
/** Controller for {@link QuickQSPanel}. */ /** Controller for {@link QuickQSPanel}. */
@QSScope @QSScope
@@ -52,20 +53,21 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel>
} }
}; };
private final boolean mUsingCollapsedLandscapeMedia; private final Provider<Boolean> mUsingCollapsedLandscapeMediaProvider;
@Inject @Inject
QuickQSPanelController(QuickQSPanel view, QSTileHost qsTileHost, QuickQSPanelController(QuickQSPanel view, QSTileHost qsTileHost,
QSCustomizerController qsCustomizerController, QSCustomizerController qsCustomizerController,
@Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer, @Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer,
@Named(QUICK_QS_PANEL) MediaHost mediaHost, @Named(QUICK_QS_PANEL) MediaHost mediaHost,
@Named(QS_USING_COLLAPSED_LANDSCAPE_MEDIA) boolean usingCollapsedLandscapeMedia, @Named(QS_USING_COLLAPSED_LANDSCAPE_MEDIA)
Provider<Boolean> usingCollapsedLandscapeMediaProvider,
MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger,
DumpManager dumpManager DumpManager dumpManager
) { ) {
super(view, qsTileHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger, super(view, qsTileHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger,
uiEventLogger, qsLogger, dumpManager); uiEventLogger, qsLogger, dumpManager);
mUsingCollapsedLandscapeMedia = usingCollapsedLandscapeMedia; mUsingCollapsedLandscapeMediaProvider = usingCollapsedLandscapeMediaProvider;
} }
@Override @Override
@@ -80,7 +82,8 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel>
int rotation = getRotation(); int rotation = getRotation();
boolean isLandscape = rotation == RotationUtils.ROTATION_LANDSCAPE boolean isLandscape = rotation == RotationUtils.ROTATION_LANDSCAPE
|| rotation == RotationUtils.ROTATION_SEASCAPE; || rotation == RotationUtils.ROTATION_SEASCAPE;
if (!mUsingCollapsedLandscapeMedia || !isLandscape) { boolean usingCollapsedLandscapeMedia = mUsingCollapsedLandscapeMediaProvider.get();
if (!usingCollapsedLandscapeMedia || !isLandscape) {
mMediaHost.setExpansion(MediaHost.EXPANDED); mMediaHost.setExpansion(MediaHost.EXPANDED);
} else { } else {
mMediaHost.setExpansion(MediaHost.COLLAPSED); mMediaHost.setExpansion(MediaHost.COLLAPSED);
@@ -126,7 +129,6 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel>
super.setTiles(tiles, /* collapsedView */ true); super.setTiles(tiles, /* collapsedView */ true);
} }
/** */
public void setContentMargins(int marginStart, int marginEnd) { public void setContentMargins(int marginStart, int marginEnd) {
mView.setContentMargins(marginStart, marginEnd, mMediaHost.getHostView()); mView.setContentMargins(marginStart, marginEnd, mMediaHost.getHostView());
} }

View File

@@ -17,8 +17,8 @@
package com.android.systemui.qs package com.android.systemui.qs
import android.content.res.Configuration import android.content.res.Configuration
import android.test.suitebuilder.annotation.SmallTest
import android.testing.AndroidTestingRunner import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.internal.logging.MetricsLogger import com.android.internal.logging.MetricsLogger
import com.android.internal.logging.testing.UiEventLoggerFake import com.android.internal.logging.testing.UiEventLoggerFake
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
@@ -38,38 +38,32 @@ import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers.anyBoolean import org.mockito.ArgumentMatchers.anyBoolean
import org.mockito.Captor import org.mockito.Captor
import org.mockito.Mock import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.Mockito.any import org.mockito.Mockito.any
import org.mockito.Mockito.reset
import org.mockito.Mockito.times import org.mockito.Mockito.times
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations import org.mockito.MockitoAnnotations
@SmallTest @SmallTest
@RunWith(AndroidTestingRunner::class) @RunWith(AndroidTestingRunner::class)
class QuickQSPanelControllerTest : SysuiTestCase() { class QuickQSPanelControllerTest : SysuiTestCase() {
@Mock @Mock private lateinit var quickQSPanel: QuickQSPanel
private lateinit var quickQSPanel: QuickQSPanel @Mock private lateinit var qsTileHost: QSTileHost
@Mock @Mock private lateinit var qsCustomizerController: QSCustomizerController
private lateinit var qsTileHost: QSTileHost @Mock private lateinit var mediaHost: MediaHost
@Mock @Mock private lateinit var metricsLogger: MetricsLogger
private lateinit var qsCustomizerController: QSCustomizerController @Mock private lateinit var qsLogger: QSLogger
@Mock @Mock private lateinit var tile: QSTile
private lateinit var mediaHost: MediaHost @Mock private lateinit var tileLayout: TileLayout
@Mock @Mock private lateinit var tileView: QSTileView
private lateinit var metricsLogger: MetricsLogger @Captor private lateinit var captor: ArgumentCaptor<QSPanel.OnConfigurationChangedListener>
private val uiEventLogger = UiEventLoggerFake() private val uiEventLogger = UiEventLoggerFake()
@Mock
private lateinit var qsLogger: QSLogger
private val dumpManager = DumpManager() private val dumpManager = DumpManager()
@Mock
private lateinit var tile: QSTile private var usingCollapsedLandscapeMedia = true
@Mock
private lateinit var tileLayout: TileLayout
@Mock
private lateinit var tileView: QSTileView
@Captor
private lateinit var captor: ArgumentCaptor<QSPanel.OnConfigurationChangedListener>
private lateinit var controller: TestQuickQSPanelController private lateinit var controller: TestQuickQSPanelController
@@ -77,24 +71,24 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
fun setUp() { fun setUp() {
MockitoAnnotations.initMocks(this) MockitoAnnotations.initMocks(this)
`when`(quickQSPanel.tileLayout).thenReturn(tileLayout) whenever(quickQSPanel.tileLayout).thenReturn(tileLayout)
`when`(quickQSPanel.isAttachedToWindow).thenReturn(true) whenever(quickQSPanel.isAttachedToWindow).thenReturn(true)
`when`(quickQSPanel.dumpableTag).thenReturn("") whenever(quickQSPanel.dumpableTag).thenReturn("")
`when`(quickQSPanel.resources).thenReturn(mContext.resources) whenever(quickQSPanel.resources).thenReturn(mContext.resources)
`when`(qsTileHost.createTileView(any(), any(), anyBoolean())).thenReturn(tileView) whenever(qsTileHost.createTileView(any(), any(), anyBoolean())).thenReturn(tileView)
controller = TestQuickQSPanelController( controller =
TestQuickQSPanelController(
quickQSPanel, quickQSPanel,
qsTileHost, qsTileHost,
qsCustomizerController, qsCustomizerController,
false, /* usingMediaPlayer = */ false,
mediaHost, mediaHost,
true, { usingCollapsedLandscapeMedia },
metricsLogger, metricsLogger,
uiEventLogger, uiEventLogger,
qsLogger, qsLogger,
dumpManager dumpManager)
)
controller.init() controller.init()
} }
@@ -106,9 +100,9 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
@Test @Test
fun testTileSublistWithFewerTiles_noCrash() { fun testTileSublistWithFewerTiles_noCrash() {
`when`(quickQSPanel.numQuickTiles).thenReturn(3) whenever(quickQSPanel.numQuickTiles).thenReturn(3)
`when`(qsTileHost.tiles).thenReturn(listOf(tile, tile)) whenever(qsTileHost.tiles).thenReturn(listOf(tile, tile))
controller.setTiles() controller.setTiles()
} }
@@ -116,8 +110,8 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
@Test @Test
fun testTileSublistWithTooManyTiles() { fun testTileSublistWithTooManyTiles() {
val limit = 3 val limit = 3
`when`(quickQSPanel.numQuickTiles).thenReturn(limit) whenever(quickQSPanel.numQuickTiles).thenReturn(limit)
`when`(qsTileHost.tiles).thenReturn(listOf(tile, tile, tile, tile)) whenever(qsTileHost.tiles).thenReturn(listOf(tile, tile, tile, tile))
controller.setTiles() controller.setTiles()
@@ -125,39 +119,61 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
} }
@Test @Test
fun testMediaExpansionUpdatedWhenConfigurationChanged() { fun mediaExpansion_afterConfigChange_inLandscape_collapsedInLandscapeTrue_updatesToCollapsed() {
// times(2) because both controller and base controller are registering their listeners // times(2) because both controller and base controller are registering their listeners
verify(quickQSPanel, times(2)).addOnConfigurationChangedListener(captor.capture()) verify(quickQSPanel, times(2)).addOnConfigurationChangedListener(captor.capture())
// verify that media starts in the expanded state by default // verify that media starts in the expanded state by default
verify(mediaHost).expansion = MediaHostState.EXPANDED verify(mediaHost).expansion = MediaHostState.EXPANDED
// Rotate device, verify media size updated // Rotate device, verify media size updated to collapsed
usingCollapsedLandscapeMedia = true
controller.setRotation(RotationUtils.ROTATION_LANDSCAPE) controller.setRotation(RotationUtils.ROTATION_LANDSCAPE)
captor.allValues.forEach { it.onConfigurationChange(Configuration.EMPTY) } captor.allValues.forEach { it.onConfigurationChange(Configuration.EMPTY) }
verify(mediaHost).expansion = MediaHostState.COLLAPSED verify(mediaHost).expansion = MediaHostState.COLLAPSED
} }
@Test
fun mediaExpansion_afterConfigChange_landscape_collapsedInLandscapeFalse_remainsExpanded() {
// times(2) because both controller and base controller are registering their listeners
verify(quickQSPanel, times(2)).addOnConfigurationChangedListener(captor.capture())
reset(mediaHost)
usingCollapsedLandscapeMedia = false
controller.setRotation(RotationUtils.ROTATION_LANDSCAPE)
captor.allValues.forEach { it.onConfigurationChange(Configuration.EMPTY) }
verify(mediaHost).expansion = MediaHostState.EXPANDED
}
class TestQuickQSPanelController( class TestQuickQSPanelController(
view: QuickQSPanel, view: QuickQSPanel,
qsTileHost: QSTileHost, qsTileHost: QSTileHost,
qsCustomizerController: QSCustomizerController, qsCustomizerController: QSCustomizerController,
usingMediaPlayer: Boolean, usingMediaPlayer: Boolean,
mediaHost: MediaHost, mediaHost: MediaHost,
usingCollapsedLandscapeMedia: Boolean, usingCollapsedLandscapeMedia: () -> Boolean,
metricsLogger: MetricsLogger, metricsLogger: MetricsLogger,
uiEventLogger: UiEventLoggerFake, uiEventLogger: UiEventLoggerFake,
qsLogger: QSLogger, qsLogger: QSLogger,
dumpManager: DumpManager dumpManager: DumpManager
) : QuickQSPanelController(view, qsTileHost, qsCustomizerController, usingMediaPlayer, ) :
mediaHost, usingCollapsedLandscapeMedia, metricsLogger, uiEventLogger, qsLogger, QuickQSPanelController(
view,
qsTileHost,
qsCustomizerController,
usingMediaPlayer,
mediaHost,
usingCollapsedLandscapeMedia,
metricsLogger,
uiEventLogger,
qsLogger,
dumpManager) { dumpManager) {
private var rotation = RotationUtils.ROTATION_NONE private var rotation = RotationUtils.ROTATION_NONE
@Override @Override override fun getRotation(): Int = rotation
override fun getRotation(): Int = rotation
fun setRotation(newRotation: Int) { fun setRotation(newRotation: Int) {
rotation = newRotation rotation = newRotation