[DO NOT MERGE] Use orientation value from config change event

Before, when the device was rotated we would get the new orientation value
from the event but then use the value from getResources() to decide
which layout to show. This discrepancy is a potential cause for an issue
where QS uses the landscape layout when the device was actually portrait

Fixes: 159737544
Test: atest QSPanelControllerBaseTest QSPanelControllerTest
Change-Id: Icd15712cd4821b7833a3373978a92f8b5959ac12
Merged-In: Icd15712cd4821b7833a3373978a92f8b5959ac12
(cherry picked from commit 917a11a54a)
This commit is contained in:
Beth Thibodeau
2021-09-22 19:25:47 -04:00
parent 9aff8397c8
commit a8e1bbf7c0
3 changed files with 42 additions and 5 deletions

View File

@@ -25,6 +25,7 @@ import android.content.ComponentName;
import android.content.res.Configuration;
import android.metrics.LogMaker;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.UiEventLogger;
import com.android.systemui.Dumpable;
@@ -80,7 +81,8 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
private final QSHost.Callback mQSHostCallback = this::setTiles;
private final QSPanel.OnConfigurationChangedListener mOnConfigurationChangedListener =
@VisibleForTesting
protected final QSPanel.OnConfigurationChangedListener mOnConfigurationChangedListener =
new QSPanel.OnConfigurationChangedListener() {
@Override
public void onConfigurationChange(Configuration newConfig) {
@@ -156,6 +158,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener);
mHost.addCallback(mQSHostCallback);
setTiles();
mLastOrientation = getResources().getConfiguration().orientation;
switchTileLayout(true);
mDumpManager.registerDumpable(mView.getDumpableTag(), this);
@@ -356,8 +359,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
return false;
}
return mUsingMediaPlayer && mMediaHost.getVisible()
&& getResources().getConfiguration().orientation
== Configuration.ORIENTATION_LANDSCAPE;
&& mLastOrientation == Configuration.ORIENTATION_LANDSCAPE;
}
private void logTiles() {

View File

@@ -27,6 +27,7 @@ import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -98,11 +99,11 @@ public class QSPanelControllerBaseTest extends SysuiTestCase {
Resources mResources;
@Mock
Configuration mConfiguration;
@Mock
Runnable mHorizontalLayoutListener;
private QSPanelControllerBase<QSPanel> mController;
/** Implementation needed to ensure we have a reflectively-available class name. */
private class TestableQSPanelControllerBase extends QSPanelControllerBase<QSPanel> {
protected TestableQSPanelControllerBase(QSPanel view, QSTileHost host,
@@ -242,18 +243,44 @@ public class QSPanelControllerBaseTest extends SysuiTestCase {
when(mMediaHost.getVisible()).thenReturn(true);
when(mFeatureFlags.isTwoColumnNotificationShadeEnabled()).thenReturn(false);
when(mQSPanel.getDumpableTag()).thenReturn("QSPanelLandscape");
mController = new TestableQSPanelControllerBase(mQSPanel, mQSTileHost,
mQSCustomizerController, mMediaHost,
mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager, mFeatureFlags);
mController.init();
assertThat(mController.shouldUseHorizontalLayout()).isTrue();
when(mFeatureFlags.isTwoColumnNotificationShadeEnabled()).thenReturn(true);
when(mResources.getBoolean(R.bool.config_use_split_notification_shade)).thenReturn(true);
when(mQSPanel.getDumpableTag()).thenReturn("QSPanelPortrait");
mController = new TestableQSPanelControllerBase(mQSPanel, mQSTileHost,
mQSCustomizerController, mMediaHost,
mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager, mFeatureFlags);
mController.init();
assertThat(mController.shouldUseHorizontalLayout()).isFalse();
}
@Test
public void testChangeConfiguration_shouldUseHorizontalLayout() {
when(mMediaHost.getVisible()).thenReturn(true);
mController.setUsingHorizontalLayoutChangeListener(mHorizontalLayoutListener);
// When device is rotated to landscape
mConfiguration.orientation = Configuration.ORIENTATION_LANDSCAPE;
mController.mOnConfigurationChangedListener.onConfigurationChange(mConfiguration);
// Then the layout changes
assertThat(mController.shouldUseHorizontalLayout()).isTrue();
verify(mHorizontalLayoutListener).run(); // not invoked
// When it is rotated back to portrait
mConfiguration.orientation = Configuration.ORIENTATION_PORTRAIT;
mController.mOnConfigurationChangedListener.onConfigurationChange(mConfiguration);
// Then the layout changes back
assertThat(mController.shouldUseHorizontalLayout()).isFalse();
verify(mHorizontalLayoutListener, times(2)).run();
}
}

View File

@@ -23,6 +23,8 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
@@ -98,6 +100,10 @@ public class QSPanelControllerTest extends SysuiTestCase {
FalsingManagerFake mFalsingManager = new FalsingManagerFake();
@Mock
FeatureFlags mFeatureFlags;
@Mock
Resources mResources;
@Mock
Configuration mConfiguration;
private QSPanelController mController;
@@ -109,6 +115,8 @@ public class QSPanelControllerTest extends SysuiTestCase {
when(mQSPanel.getDumpableTag()).thenReturn("QSPanel");
when(mQSPanel.getOrCreateTileLayout()).thenReturn(mPagedTileLayout);
when(mQSPanel.getTileLayout()).thenReturn(mPagedTileLayout);
when(mQSPanel.getResources()).thenReturn(mResources);
when(mResources.getConfiguration()).thenReturn(mConfiguration);
when(mQSTileHost.getTiles()).thenReturn(Collections.singleton(mQSTile));
when(mQSTileHost.createTileView(any(), eq(mQSTile), anyBoolean())).thenReturn(mQSTileView);
when(mToggleSliderViewControllerFactory.create(any(), any()))