diff --git a/packages/SystemUI/res-keyguard/layout/new_footer_actions.xml b/packages/SystemUI/res-keyguard/layout/new_footer_actions.xml index 95bdd8948c7cb..175e45c12afa8 100644 --- a/packages/SystemUI/res-keyguard/layout/new_footer_actions.xml +++ b/packages/SystemUI/res-keyguard/layout/new_footer_actions.xml @@ -20,7 +20,11 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:layout_width="match_parent" - android:layout_height="@dimen/qs_footer_height" + android:layout_height="@dimen/new_footer_height" + android:elevation="@dimen/qs_panel_elevation" + android:paddingTop="8dp" + android:paddingBottom="4dp" + android:background="@drawable/qs_footer_actions_background" android:gravity="center_vertical" android:layout_gravity="bottom" > @@ -31,23 +35,24 @@ android:layout_weight="1" /> + @@ -56,19 +61,17 @@ android:id="@+id/settings_button_container" android:layout_width="@dimen/qs_footer_action_button_size" android:layout_height="@dimen/qs_footer_action_button_size" - android:layout_marginEnd="@dimen/qs_tile_margin_horizontal" android:background="@drawable/qs_footer_action_circle" android:clipChildren="false" android:clipToPadding="false"> diff --git a/packages/SystemUI/res/drawable/qs_footer_action_circle.xml b/packages/SystemUI/res/drawable/qs_footer_action_circle.xml index f54c30f2e7949..d057f5f32dc4a 100644 --- a/packages/SystemUI/res/drawable/qs_footer_action_circle.xml +++ b/packages/SystemUI/res/drawable/qs_footer_action_circle.xml @@ -15,10 +15,7 @@ ~ limitations under the License. --> + android:inset="@dimen/new_qs_footer_action_inset"> diff --git a/packages/SystemUI/res/drawable/qs_footer_action_circle_color.xml b/packages/SystemUI/res/drawable/qs_footer_action_circle_color.xml index 1a323bccfa654..944061cc8e701 100644 --- a/packages/SystemUI/res/drawable/qs_footer_action_circle_color.xml +++ b/packages/SystemUI/res/drawable/qs_footer_action_circle_color.xml @@ -15,10 +15,7 @@ ~ limitations under the License. --> + android:inset="@dimen/new_qs_footer_action_inset"> diff --git a/packages/SystemUI/res/drawable/qs_footer_actions_background.xml b/packages/SystemUI/res/drawable/qs_footer_actions_background.xml new file mode 100644 index 0000000000000..c9517cd905dc9 --- /dev/null +++ b/packages/SystemUI/res/drawable/qs_footer_actions_background.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml index 22abd0c2f0346..85b33cc4cc257 100644 --- a/packages/SystemUI/res/layout/qs_panel.xml +++ b/packages/SystemUI/res/layout/qs_panel.xml @@ -25,7 +25,7 @@ android:id="@+id/expanded_qs_scroll_view" android:layout_width="match_parent" android:layout_height="wrap_content" - android:elevation="4dp" + android:elevation="@dimen/qs_panel_elevation" android:importantForAccessibility="no" android:scrollbars="none" android:clipChildren="false" @@ -55,7 +55,7 @@ android:id="@+id/container_stub" android:inflatedId="@+id/qs_footer_actions" android:layout="@layout/new_footer_actions" - android:layout_height="@dimen/qs_footer_height" + android:layout_height="@dimen/new_footer_height" android:layout_width="match_parent" android:layout_gravity="bottom" /> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index dba7290dba09c..fe418cf9d75ca 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -329,6 +329,9 @@ etc. --> 48dp + + 60dp + 48dp @@ -336,6 +339,9 @@ 2dp + + 4dp + -4dp 2dp @@ -491,7 +497,8 @@ 14sp 16dp 6dp - @dimen/qs_footer_height + 4dp + @dimen/new_footer_height 48dp 0dp 56dp diff --git a/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt b/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt index 4aedbc983d9c2..92e3c3cc4106e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/FooterActionsController.kt @@ -29,7 +29,6 @@ import com.android.internal.logging.MetricsLogger import com.android.internal.logging.UiEventLogger import com.android.internal.logging.nano.MetricsProto import com.android.keyguard.KeyguardUpdateMonitor -import com.android.settingslib.Utils import com.android.systemui.R import com.android.systemui.animation.ActivityLaunchAnimator import com.android.systemui.flags.FeatureFlags @@ -90,11 +89,6 @@ class FooterActionsController @Inject constructor( updateVisibility() } - init { - view.elevation = resources.displayMetrics.density * 4f - view.setBackgroundColor(Utils.getColorAttrDefaultColor(context, R.attr.underSurfaceColor)) - } - private val settingsButton: SettingsButton = view.findViewById(R.id.settings_button) private val settingsButtonContainer: View? = view.findViewById(R.id.settings_button_container) private val powerMenuLite: View = view.findViewById(R.id.pm_lite) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java index 7800027ea967f..707313f08af60 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java @@ -211,9 +211,13 @@ public class QSContainerImpl extends FrameLayout implements Dumpable { // Some views are always full width or have dependent padding continue; } - LayoutParams lp = (LayoutParams) view.getLayoutParams(); - lp.rightMargin = mSideMargins; - lp.leftMargin = mSideMargins; + if (!(view instanceof FooterActionsView)) { + // Only padding for FooterActionsView, no margin. That way, the background goes + // all the way to the edge. + LayoutParams lp = (LayoutParams) view.getLayoutParams(); + lp.rightMargin = mSideMargins; + lp.leftMargin = mSideMargins; + } if (view == mQSPanelContainer) { // QS panel lays out some of its content full width qsPanelController.setContentMargins(mContentPadding, mContentPadding); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 6b515c85dc9f2..7c04cd4dcb059 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -110,6 +110,7 @@ public class QSPanel extends LinearLayout implements Tunable { private float mSquishinessFraction = 1f; private final ArrayMap mChildrenLayoutTop = new ArrayMap<>(); private final Rect mClippingRect = new Rect(); + private boolean mUseNewFooter = false; public QSPanel(Context context, AttributeSet attrs) { super(context, attrs); @@ -151,6 +152,10 @@ public class QSPanel extends LinearLayout implements Tunable { } } + void setUseNewFooter(boolean useNewFooter) { + mUseNewFooter = useNewFooter; + } + protected void setHorizontalContentContainerClipping() { mHorizontalContentContainer.setClipChildren(true); mHorizontalContentContainer.setClipToPadding(false); @@ -368,11 +373,12 @@ public class QSPanel extends LinearLayout implements Tunable { protected void updatePadding() { final Resources res = mContext.getResources(); - int padding = res.getDimensionPixelSize(R.dimen.qs_panel_padding_top); + int paddingTop = res.getDimensionPixelSize(R.dimen.qs_panel_padding_top); + // Bottom padding only when there's a new footer with its height. setPaddingRelative(getPaddingStart(), - padding, + paddingTop, getPaddingEnd(), - res.getDimensionPixelSize(R.dimen.qs_panel_padding_bottom)); + mUseNewFooter ? res.getDimensionPixelSize(R.dimen.qs_panel_padding_bottom) : 0); } void addOnConfigurationChangedListener(OnConfigurationChangedListener listener) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java index 8f268b5cffe4c..03149e34a6896 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java @@ -31,6 +31,8 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.dump.DumpManager; +import com.android.systemui.flags.FeatureFlags; +import com.android.systemui.flags.Flags; import com.android.systemui.media.MediaHierarchyManager; import com.android.systemui.media.MediaHost; import com.android.systemui.plugins.FalsingManager; @@ -104,7 +106,7 @@ public class QSPanelController extends QSPanelControllerBase { DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger, BrightnessController.Factory brightnessControllerFactory, BrightnessSliderController.Factory brightnessSliderFactory, - FalsingManager falsingManager, CommandQueue commandQueue) { + FalsingManager falsingManager, CommandQueue commandQueue, FeatureFlags featureFlags) { super(view, qstileHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger, uiEventLogger, qsLogger, dumpManager); mQSFgsManagerFooter = qsFgsManagerFooter; @@ -121,6 +123,7 @@ public class QSPanelController extends QSPanelControllerBase { mBrightnessController = brightnessControllerFactory.create(mBrightnessSliderController); mBrightnessMirrorHandler = new BrightnessMirrorHandler(mBrightnessController); + view.setUseNewFooter(featureFlags.isEnabled(Flags.NEW_FOOTER)); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQSContainerController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQSContainerController.kt index b457ebf60c716..7c9e597e74a13 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQSContainerController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQSContainerController.kt @@ -102,17 +102,21 @@ class NotificationsQSContainerController @Inject constructor( private fun updateBottomSpacing() { val (containerPadding, notificationsMargin) = calculateBottomSpacing() var qsScrollPaddingBottom = 0 - if (!(splitShadeEnabled || isQSCustomizing || isQSDetailShowing || isGestureNavigation || - taskbarVisible)) { + val newFooter = featureFlags.isEnabled(Flags.NEW_FOOTER) + if (!newFooter && !(splitShadeEnabled || isQSCustomizing || isQSDetailShowing || + isGestureNavigation || taskbarVisible)) { // no taskbar, portrait, navigation buttons enabled: // padding is needed so QS can scroll up over bottom insets - to reach the point when // the whole QS is above bottom insets qsScrollPaddingBottom = bottomStableInsets + } else if (newFooter && !(isQSCustomizing || isQSDetailShowing)) { + // With the new footer, we also want this padding in the bottom in these cases + qsScrollPaddingBottom = bottomStableInsets } mView.setPadding(0, 0, 0, containerPadding) mView.setNotificationsMarginBottom(notificationsMargin) - if (featureFlags.isEnabled(Flags.NEW_FOOTER)) { - mView.setQSContainerPaddingBottom(notificationsMargin) + if (newFooter) { + mView.setQSContainerPaddingBottom(qsScrollPaddingBottom) } else { mView.setQSScrollPaddingBottom(qsScrollPaddingBottom) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java index b5ce7066f5529..b2ca62f18f27c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java @@ -36,6 +36,7 @@ import com.android.internal.logging.testing.UiEventLoggerFake; import com.android.systemui.SysuiTestCase; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.dump.DumpManager; +import com.android.systemui.flags.FeatureFlags; import com.android.systemui.media.MediaHost; import com.android.systemui.plugins.qs.QSTileView; import com.android.systemui.qs.customize.QSCustomizerController; @@ -106,6 +107,8 @@ public class QSPanelControllerTest extends SysuiTestCase { Resources mResources; @Mock Configuration mConfiguration; + @Mock + FeatureFlags mFeatureFlags; private QSPanelController mController; @@ -133,7 +136,7 @@ public class QSPanelControllerTest extends SysuiTestCase { mTunerService, mQSTileHost, mQSCustomizerController, true, mMediaHost, mQSTileRevealControllerFactory, mDumpManager, mMetricsLogger, mUiEventLogger, mQSLogger, mBrightnessControllerFactory, mToggleSliderViewControllerFactory, - mFalsingManager, mCommandQueue + mFalsingManager, mCommandQueue, mFeatureFlags ); mController.init(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt index 3500c183de394..4ae193327b7bc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.kt @@ -162,6 +162,20 @@ class QSPanelTest : SysuiTestCase() { assertThat(mQsPanel.indexOfChild(mQsPanel.mSecurityFooter)).isEqualTo(-1) } + @Test + fun testBottomPadding() { + mQsPanel.setUseNewFooter(false) + + mQsPanel.updatePadding() + assertThat(mQsPanel.paddingBottom).isEqualTo(0) + + mQsPanel.setUseNewFooter(true) + + mQsPanel.updatePadding() + assertThat(mQsPanel.paddingBottom) + .isEqualTo(mContext.resources.getDimensionPixelSize(R.dimen.new_footer_height)) + } + private fun getNewOrientationConfig(@Configuration.Orientation newOrientation: Int) = context.resources.configuration.apply { orientation = newOrientation } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationQSContainerControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationQSContainerControllerTest.kt index bbb2346797b98..00af446ded3d1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationQSContainerControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationQSContainerControllerTest.kt @@ -114,13 +114,15 @@ class NotificationQSContainerControllerTest : SysuiTestCase() { navigationMode = GESTURES_NAVIGATION, insets = windowInsets().withStableBottom()) then(expectedContainerPadding = 0, // taskbar should disappear when shade is expanded - expectedNotificationsMargin = NOTIFICATIONS_MARGIN) + expectedNotificationsMargin = NOTIFICATIONS_MARGIN, + expectedQsPadding = STABLE_INSET_BOTTOM) given(taskbarVisible = true, navigationMode = BUTTONS_NAVIGATION, insets = windowInsets().withStableBottom()) then(expectedContainerPadding = STABLE_INSET_BOTTOM, - expectedNotificationsMargin = NOTIFICATIONS_MARGIN) + expectedNotificationsMargin = NOTIFICATIONS_MARGIN, + expectedQsPadding = STABLE_INSET_BOTTOM) } @Test @@ -150,13 +152,15 @@ class NotificationQSContainerControllerTest : SysuiTestCase() { given(taskbarVisible = false, navigationMode = GESTURES_NAVIGATION, insets = windowInsets().withStableBottom()) - then(expectedContainerPadding = 0) + then(expectedContainerPadding = 0, + expectedQsPadding = STABLE_INSET_BOTTOM) given(taskbarVisible = false, navigationMode = BUTTONS_NAVIGATION, insets = windowInsets().withStableBottom()) then(expectedContainerPadding = 0, // qs goes full height as it's not obscuring nav buttons - expectedNotificationsMargin = STABLE_INSET_BOTTOM + NOTIFICATIONS_MARGIN) + expectedNotificationsMargin = STABLE_INSET_BOTTOM + NOTIFICATIONS_MARGIN, + expectedQsPadding = STABLE_INSET_BOTTOM) } @Test @@ -190,7 +194,8 @@ class NotificationQSContainerControllerTest : SysuiTestCase() { navigationMode = BUTTONS_NAVIGATION, insets = windowInsets().withCutout().withStableBottom()) then(expectedContainerPadding = 0, - expectedNotificationsMargin = STABLE_INSET_BOTTOM + NOTIFICATIONS_MARGIN) + expectedNotificationsMargin = STABLE_INSET_BOTTOM + NOTIFICATIONS_MARGIN, + expectedQsPadding = STABLE_INSET_BOTTOM) } @Test @@ -217,12 +222,14 @@ class NotificationQSContainerControllerTest : SysuiTestCase() { given(taskbarVisible = true, navigationMode = GESTURES_NAVIGATION, insets = windowInsets().withStableBottom()) - then(expectedContainerPadding = 0) + then(expectedContainerPadding = 0, + expectedQsPadding = STABLE_INSET_BOTTOM) given(taskbarVisible = true, navigationMode = BUTTONS_NAVIGATION, insets = windowInsets().withStableBottom()) - then(expectedContainerPadding = STABLE_INSET_BOTTOM) + then(expectedContainerPadding = STABLE_INSET_BOTTOM, + expectedQsPadding = STABLE_INSET_BOTTOM) } @Test @@ -259,7 +266,7 @@ class NotificationQSContainerControllerTest : SysuiTestCase() { given(taskbarVisible = false, navigationMode = GESTURES_NAVIGATION, insets = windowInsets().withCutout().withStableBottom()) - then(expectedContainerPadding = CUTOUT_HEIGHT) + then(expectedContainerPadding = CUTOUT_HEIGHT, expectedQsPadding = STABLE_INSET_BOTTOM) given(taskbarVisible = false, navigationMode = BUTTONS_NAVIGATION, @@ -350,6 +357,7 @@ class NotificationQSContainerControllerTest : SysuiTestCase() { @Test fun testDetailShowingInSplitShade() { notificationsQSContainerController.splitShadeEnabled = true + notificationsQSContainerController.setDetailShowing(true) useNewFooter(false) given(taskbarVisible = false, @@ -357,7 +365,6 @@ class NotificationQSContainerControllerTest : SysuiTestCase() { insets = windowInsets().withStableBottom()) then(expectedContainerPadding = 0) - notificationsQSContainerController.setDetailShowing(true) // should not influence spacing given(taskbarVisible = false, navigationMode = BUTTONS_NAVIGATION, @@ -368,6 +375,7 @@ class NotificationQSContainerControllerTest : SysuiTestCase() { @Test fun testDetailShowingInSplitShade_newFooter() { notificationsQSContainerController.splitShadeEnabled = true + notificationsQSContainerController.setDetailShowing(true) useNewFooter(true) given(taskbarVisible = false, @@ -375,7 +383,6 @@ class NotificationQSContainerControllerTest : SysuiTestCase() { insets = windowInsets().withStableBottom()) then(expectedContainerPadding = 0) - notificationsQSContainerController.setDetailShowing(true) // should not influence spacing given(taskbarVisible = false, navigationMode = BUTTONS_NAVIGATION, @@ -417,7 +424,7 @@ class NotificationQSContainerControllerTest : SysuiTestCase() { val newFooter = featureFlags.isEnabled(Flags.NEW_FOOTER) if (newFooter) { verify(notificationsQSContainer) - .setQSContainerPaddingBottom(expectedNotificationsMargin) + .setQSContainerPaddingBottom(expectedQsPadding) } else { verify(notificationsQSContainer).setQSScrollPaddingBottom(expectedQsPadding) }