Don't use horizontal layout for quicksettings when using 2-column shade
Bug: 171917882 Test: atest SystemUITests + manual Change-Id: Ic059840244585a1f2989bdcd09d792d0968e53d1
This commit is contained in:
@@ -40,6 +40,7 @@ import com.android.systemui.qs.dagger.QSScope;
|
||||
import com.android.systemui.qs.logging.QSLogger;
|
||||
import com.android.systemui.settings.brightness.BrightnessController;
|
||||
import com.android.systemui.settings.brightness.BrightnessSlider;
|
||||
import com.android.systemui.statusbar.FeatureFlags;
|
||||
import com.android.systemui.statusbar.policy.BrightnessMirrorController;
|
||||
import com.android.systemui.tuner.TunerService;
|
||||
|
||||
@@ -92,9 +93,10 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
|
||||
DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger,
|
||||
QSLogger qsLogger, BrightnessController.Factory brightnessControllerFactory,
|
||||
BrightnessSlider.Factory brightnessSliderFactory,
|
||||
@Named(QS_LABELS_FLAG) boolean qsLabelsFlag) {
|
||||
@Named(QS_LABELS_FLAG) boolean qsLabelsFlag,
|
||||
FeatureFlags featureFlags) {
|
||||
super(view, qstileHost, qsCustomizerController, usingMediaPlayer, mediaHost,
|
||||
metricsLogger, uiEventLogger, qsLogger, dumpManager);
|
||||
metricsLogger, uiEventLogger, qsLogger, dumpManager, featureFlags);
|
||||
mQsSecurityFooter = qsSecurityFooter;
|
||||
mTunerService = tunerService;
|
||||
mQsCustomizerController = qsCustomizerController;
|
||||
|
||||
@@ -34,6 +34,8 @@ import com.android.systemui.plugins.qs.QSTileView;
|
||||
import com.android.systemui.qs.customize.QSCustomizerController;
|
||||
import com.android.systemui.qs.external.CustomTile;
|
||||
import com.android.systemui.qs.logging.QSLogger;
|
||||
import com.android.systemui.statusbar.FeatureFlags;
|
||||
import com.android.systemui.util.Utils;
|
||||
import com.android.systemui.util.ViewController;
|
||||
import com.android.systemui.util.animation.DisappearParameters;
|
||||
|
||||
@@ -63,6 +65,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
|
||||
private final UiEventLogger mUiEventLogger;
|
||||
private final QSLogger mQSLogger;
|
||||
private final DumpManager mDumpManager;
|
||||
private final FeatureFlags mFeatureFlags;
|
||||
protected final ArrayList<TileRecord> mRecords = new ArrayList<>();
|
||||
|
||||
private int mLastOrientation;
|
||||
@@ -93,11 +96,18 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
|
||||
|
||||
private boolean mUsingHorizontalLayout;
|
||||
|
||||
protected QSPanelControllerBase(T view, QSTileHost host,
|
||||
protected QSPanelControllerBase(
|
||||
T view,
|
||||
QSTileHost host,
|
||||
QSCustomizerController qsCustomizerController,
|
||||
@Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer, MediaHost mediaHost,
|
||||
MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger,
|
||||
DumpManager dumpManager) {
|
||||
@Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer,
|
||||
MediaHost mediaHost,
|
||||
MetricsLogger metricsLogger,
|
||||
UiEventLogger uiEventLogger,
|
||||
QSLogger qsLogger,
|
||||
DumpManager dumpManager,
|
||||
FeatureFlags featureFlags
|
||||
) {
|
||||
super(view);
|
||||
mHost = host;
|
||||
mQsCustomizerController = qsCustomizerController;
|
||||
@@ -107,6 +117,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
|
||||
mUiEventLogger = uiEventLogger;
|
||||
mQSLogger = qsLogger;
|
||||
mDumpManager = dumpManager;
|
||||
mFeatureFlags = featureFlags;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -334,9 +345,12 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
|
||||
}
|
||||
|
||||
boolean shouldUseHorizontalLayout() {
|
||||
if (Utils.shouldUseSplitNotificationShade(mFeatureFlags, getResources())) {
|
||||
return false;
|
||||
}
|
||||
return mUsingMediaPlayer && mMediaHost.getVisible()
|
||||
&& getResources().getConfiguration().orientation
|
||||
== Configuration.ORIENTATION_LANDSCAPE;
|
||||
&& getResources().getConfiguration().orientation
|
||||
== Configuration.ORIENTATION_LANDSCAPE;
|
||||
}
|
||||
|
||||
private void logTiles() {
|
||||
|
||||
@@ -30,6 +30,7 @@ import com.android.systemui.plugins.qs.QSTile;
|
||||
import com.android.systemui.qs.customize.QSCustomizerController;
|
||||
import com.android.systemui.qs.dagger.QSScope;
|
||||
import com.android.systemui.qs.logging.QSLogger;
|
||||
import com.android.systemui.statusbar.FeatureFlags;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -57,9 +58,11 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel>
|
||||
@Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer,
|
||||
@Named(QUICK_QS_PANEL) MediaHost mediaHost,
|
||||
MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger,
|
||||
DumpManager dumpManager, @Named(QS_LABELS_FLAG) boolean qsLabelsFlag) {
|
||||
DumpManager dumpManager, @Named(QS_LABELS_FLAG) boolean qsLabelsFlag,
|
||||
FeatureFlags featureFlags
|
||||
) {
|
||||
super(view, qsTileHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger,
|
||||
uiEventLogger, qsLogger, dumpManager);
|
||||
uiEventLogger, qsLogger, dumpManager, featureFlags);
|
||||
mUseSideLabels = qsLabelsFlag;
|
||||
}
|
||||
|
||||
|
||||
@@ -134,6 +134,7 @@ import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||
import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
|
||||
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
|
||||
import com.android.systemui.util.Utils;
|
||||
import com.android.wm.shell.animation.FlingAnimationUtils;
|
||||
|
||||
import java.io.FileDescriptor;
|
||||
@@ -783,18 +784,13 @@ public class NotificationPanelViewController extends PanelViewController {
|
||||
mNotificationStackScrollLayoutController.setLayoutParams(lp);
|
||||
}
|
||||
|
||||
if (shouldUseSplitNotificationShade()) {
|
||||
if (Utils.shouldUseSplitNotificationShade(mFeatureFlags, mResources)) {
|
||||
// In order to change the constraints at runtime, all children of the Constraint Layout
|
||||
// must have ids.
|
||||
ensureAllViewsHaveIds(mNotificationContainerParent);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean shouldUseSplitNotificationShade() {
|
||||
return mFeatureFlags.isTwoColumnNotificationShadeEnabled()
|
||||
&& mResources.getBoolean(R.bool.config_use_split_notification_shade);
|
||||
}
|
||||
|
||||
private static void ensureAllViewsHaveIds(ViewGroup parentView) {
|
||||
for (int i = 0; i < parentView.getChildCount(); i++) {
|
||||
View childView = parentView.getChildAt(i);
|
||||
|
||||
@@ -20,12 +20,15 @@ import android.Manifest;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.Resources;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.shared.system.QuickStepContract;
|
||||
import com.android.systemui.statusbar.CommandQueue;
|
||||
import com.android.systemui.statusbar.FeatureFlags;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
@@ -163,4 +166,15 @@ public class Utils {
|
||||
}
|
||||
return apps;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the device should use the split notification shade, based on feature flags,
|
||||
* orientation and screen width.
|
||||
*/
|
||||
public static boolean shouldUseSplitNotificationShade(FeatureFlags featureFlags,
|
||||
Resources resources) {
|
||||
return featureFlags.isTwoColumnNotificationShadeEnabled()
|
||||
&& resources.getBoolean(R.bool.config_use_split_notification_shade);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.systemui.qs;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
@@ -28,6 +30,8 @@ import static org.mockito.Mockito.reset;
|
||||
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;
|
||||
|
||||
@@ -37,6 +41,7 @@ import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.internal.logging.UiEventLogger;
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.internal.logging.testing.UiEventLoggerFake;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.dump.DumpManager;
|
||||
import com.android.systemui.media.MediaHost;
|
||||
@@ -44,6 +49,7 @@ import com.android.systemui.plugins.qs.QSTileView;
|
||||
import com.android.systemui.qs.customize.QSCustomizerController;
|
||||
import com.android.systemui.qs.logging.QSLogger;
|
||||
import com.android.systemui.qs.tileimpl.QSTileImpl;
|
||||
import com.android.systemui.statusbar.FeatureFlags;
|
||||
import com.android.systemui.util.animation.DisappearParameters;
|
||||
|
||||
import org.junit.Before;
|
||||
@@ -86,17 +92,25 @@ public class QSPanelControllerBaseTest extends SysuiTestCase {
|
||||
QSTileView mQSTileView;
|
||||
@Mock
|
||||
PagedTileLayout mPagedTileLayout;
|
||||
@Mock
|
||||
FeatureFlags mFeatureFlags;
|
||||
@Mock
|
||||
Resources mResources;
|
||||
@Mock
|
||||
Configuration mConfiguration;
|
||||
|
||||
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,
|
||||
QSCustomizerController qsCustomizerController, MediaHost mediaHost,
|
||||
MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger,
|
||||
DumpManager dumpManager) {
|
||||
DumpManager dumpManager, FeatureFlags featureFlags) {
|
||||
super(view, host, qsCustomizerController, true, mediaHost, metricsLogger, uiEventLogger,
|
||||
qsLogger, dumpManager);
|
||||
qsLogger, dumpManager, featureFlags);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -121,10 +135,12 @@ public class QSPanelControllerBaseTest extends SysuiTestCase {
|
||||
when(mQSTileRevealControllerFactory.create(any(), any()))
|
||||
.thenReturn(mQSTileRevealController);
|
||||
when(mMediaHost.getDisappearParameters()).thenReturn(new DisappearParameters());
|
||||
when(mQSPanel.getResources()).thenReturn(mResources);
|
||||
when(mResources.getConfiguration()).thenReturn(mConfiguration);
|
||||
|
||||
mController = new TestableQSPanelControllerBase(mQSPanel, mQSTileHost,
|
||||
mQSCustomizerController, mMediaHost,
|
||||
mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager);
|
||||
mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager, mFeatureFlags);
|
||||
|
||||
mController.init();
|
||||
reset(mQSTileRevealController);
|
||||
@@ -136,7 +152,7 @@ public class QSPanelControllerBaseTest extends SysuiTestCase {
|
||||
|
||||
QSPanelControllerBase<QSPanel> controller = new TestableQSPanelControllerBase(mQSPanel,
|
||||
mQSTileHost, mQSCustomizerController, mMediaHost,
|
||||
mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager) {
|
||||
mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager, mFeatureFlags) {
|
||||
@Override
|
||||
protected QSTileRevealController createTileRevealController() {
|
||||
return mQSTileRevealController;
|
||||
@@ -218,4 +234,18 @@ public class QSPanelControllerBaseTest extends SysuiTestCase {
|
||||
verify(mQSLogger).logAllTilesChangeListening(false, "QSPanel", "dnd");
|
||||
verify(mPagedTileLayout).setListening(false, mUiEventLogger);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testShouldUzeHorizontalLayout_falseForSplitShade() {
|
||||
mConfiguration.orientation = Configuration.ORIENTATION_LANDSCAPE;
|
||||
when(mMediaHost.getVisible()).thenReturn(true);
|
||||
|
||||
when(mFeatureFlags.isTwoColumnNotificationShadeEnabled()).thenReturn(false);
|
||||
assertThat(mController.shouldUseHorizontalLayout()).isTrue();
|
||||
|
||||
when(mFeatureFlags.isTwoColumnNotificationShadeEnabled()).thenReturn(true);
|
||||
when(mResources.getBoolean(R.bool.config_use_split_notification_shade)).thenReturn(true);
|
||||
assertThat(mController.shouldUseHorizontalLayout()).isFalse();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ import com.android.systemui.qs.tileimpl.QSTileImpl;
|
||||
import com.android.systemui.settings.brightness.BrightnessController;
|
||||
import com.android.systemui.settings.brightness.BrightnessSlider;
|
||||
import com.android.systemui.settings.brightness.ToggleSlider;
|
||||
import com.android.systemui.statusbar.FeatureFlags;
|
||||
import com.android.systemui.tuner.TunerService;
|
||||
import com.android.systemui.util.animation.DisappearParameters;
|
||||
|
||||
@@ -93,6 +94,8 @@ public class QSPanelControllerTest extends SysuiTestCase {
|
||||
QSTileView mQSTileView;
|
||||
@Mock
|
||||
PagedTileLayout mPagedTileLayout;
|
||||
@Mock
|
||||
FeatureFlags mFeatureFlags;
|
||||
|
||||
private QSPanelController mController;
|
||||
|
||||
@@ -118,7 +121,9 @@ public class QSPanelControllerTest extends SysuiTestCase {
|
||||
mQSTileHost, mQSCustomizerController, true, mMediaHost,
|
||||
mQSTileRevealControllerFactory, mDumpManager, mMetricsLogger, mUiEventLogger,
|
||||
mQSLogger, mBrightnessControllerFactory, mToggleSliderViewControllerFactory,
|
||||
/* labelsFlag */ false);
|
||||
/* labelsFlag */ false,
|
||||
mFeatureFlags
|
||||
);
|
||||
|
||||
mController.init();
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ import com.android.systemui.plugins.qs.QSTile
|
||||
import com.android.systemui.plugins.qs.QSTileView
|
||||
import com.android.systemui.qs.customize.QSCustomizerController
|
||||
import com.android.systemui.qs.logging.QSLogger
|
||||
import com.android.systemui.statusbar.FeatureFlags
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
@@ -63,6 +64,8 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
|
||||
private lateinit var tileLayout: TileLayout
|
||||
@Mock
|
||||
private lateinit var tileView: QSTileView
|
||||
@Mock
|
||||
private lateinit var featureFlags: FeatureFlags
|
||||
|
||||
private lateinit var controller: QuickQSPanelController
|
||||
|
||||
@@ -84,7 +87,8 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
|
||||
uiEventLogger,
|
||||
qsLogger,
|
||||
dumpManager,
|
||||
false
|
||||
false,
|
||||
featureFlags
|
||||
)
|
||||
|
||||
controller.init()
|
||||
|
||||
Reference in New Issue
Block a user