diff options
9 files changed, 67 insertions, 8 deletions
diff --git a/packages/SystemUI/res/drawable/qs_background_primary.xml b/packages/SystemUI/res/drawable/qs_background_primary.xml new file mode 100644 index 000000000000..0a3afc575c4a --- /dev/null +++ b/packages/SystemUI/res/drawable/qs_background_primary.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2021 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<inset xmlns:android="http://schemas.android.com/apk/res/android"> + <shape> + <solid android:color="?android:attr/colorBackground"/> + <corners android:radius="@dimen/notification_corner_radius" /> + </shape> +</inset>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml index 387f2f2ccfc7..77f17439c487 100644 --- a/packages/SystemUI/res/layout/qs_panel.xml +++ b/packages/SystemUI/res/layout/qs_panel.xml @@ -25,7 +25,8 @@ <View android:id="@+id/quick_settings_background" android:layout_width="match_parent" - android:layout_height="0dp" /> + android:layout_height="0dp" + android:background="@drawable/qs_background_primary" /> <com.android.systemui.qs.NonInterceptingScrollView android:id="@+id/expanded_qs_scroll_view" diff --git a/packages/SystemUI/res/values/flags.xml b/packages/SystemUI/res/values/flags.xml index db8bfec2bac5..de2db9867de9 100644 --- a/packages/SystemUI/res/values/flags.xml +++ b/packages/SystemUI/res/values/flags.xml @@ -20,6 +20,7 @@ <bool name="flag_notification_pipeline2">false</bool> <bool name="flag_notification_pipeline2_rendering">false</bool> + <bool name="flag_shade_is_opaque">true</bool> <!-- b/171917882 --> <bool name="flag_notification_twocolumn">false</bool> diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java index 16e95900052f..e8976d379fef 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java @@ -67,6 +67,7 @@ public class QSContainerImpl extends FrameLayout { private int mSideMargins; private boolean mQsDisabled; + private boolean mBackgroundVisible; private int mContentPadding = -1; private boolean mAnimateBottomOnNextLayout; @@ -122,6 +123,14 @@ public class QSContainerImpl extends FrameLayout { return true; } + /** + * If QS should have a solid or transparent background. + */ + public void setBackgroundVisible(boolean visible) { + mBackgroundVisible = visible; + updateBackgroundVisibility(); + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // QSPanel will show as many rows as it can (up to TileLayout.MAX_ROWS) such that the @@ -174,7 +183,11 @@ public class QSContainerImpl extends FrameLayout { final boolean disabled = (state2 & DISABLE2_QUICK_SETTINGS) != 0; if (disabled == mQsDisabled) return; mQsDisabled = disabled; - mBackground.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE); + updateBackgroundVisibility(); + } + + private void updateBackgroundVisibility() { + mBackground.setVisibility(mQsDisabled || !mBackgroundVisible ? GONE : VISIBLE); } void updateResources(QSPanelController qsPanelController, diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index dbdd04a1e3ba..ed308ae1ac6c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -44,6 +44,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.customize.QSCustomizerController; import com.android.systemui.qs.dagger.QSFragmentComponent; import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer; @@ -105,6 +106,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca private QSPanelController mQSPanelController; private QuickQSPanelController mQuickQSPanelController; private QSCustomizerController mQSCustomizerController; + private FeatureFlags mFeatureFlags; @Inject public QSFragment(RemoteInputQuickSettingsDisabler remoteInputQsDisabler, @@ -112,7 +114,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca StatusBarStateController statusBarStateController, CommandQueue commandQueue, QSDetailDisplayer qsDetailDisplayer, @Named(QS_PANEL) MediaHost qsMediaHost, @Named(QUICK_QS_PANEL) MediaHost qqsMediaHost, - QSFragmentComponent.Factory qsComponentFactory) { + QSFragmentComponent.Factory qsComponentFactory, FeatureFlags featureFlags) { mRemoteInputQuickSettingsDisabler = remoteInputQsDisabler; mInjectionInflater = injectionInflater; mCommandQueue = commandQueue; @@ -122,6 +124,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca mQsComponentFactory = qsComponentFactory; commandQueue.observe(getLifecycle(), this); mHost = qsTileHost; + mFeatureFlags = featureFlags; mStatusBarStateController = statusBarStateController; } @@ -163,6 +166,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca mQSContainerImplController = qsFragmentComponent.getQSContainerImplController(); mQSContainerImplController.init(); mContainer = mQSContainerImplController.getView(); + mContainer.setBackgroundVisible(!mFeatureFlags.isShadeOpaque()); mQSDetail.setQsPanel(mQSPanelController, mHeader, mFooter); mQSAnimator = qsFragmentComponent.getQSAnimator(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java index 964c499e4b42..d6db7360fb21 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java @@ -44,6 +44,10 @@ public class FeatureFlags { return mFlagReader.isEnabled(R.bool.flag_notification_pipeline2_rendering); } + public boolean isShadeOpaque() { + return mFlagReader.isEnabled(R.bool.flag_shade_is_opaque); + } + /** b/171917882 */ public boolean isTwoColumnNotificationShadeEnabled() { return mFlagReader.isEnabled(R.bool.flag_notification_twocolumn); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index fc1811b11d73..146314877cb7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -49,6 +49,7 @@ import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dock.DockManager; import com.android.systemui.statusbar.BlurUtils; +import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.ScrimView; import com.android.systemui.statusbar.notification.stack.ViewState; import com.android.systemui.statusbar.policy.ConfigurationController; @@ -125,6 +126,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump */ public static final float BUSY_SCRIM_ALPHA = 1f; + /** + * Scrim opacity that can have text on top. + */ + public static final float GAR_SCRIM_ALPHA = 0.6f; + static final int TAG_KEY_ANIM = R.id.scrim; private static final int TAG_START_ALPHA = R.id.scrim_alpha_start; private static final int TAG_END_ALPHA = R.id.scrim_alpha_end; @@ -199,10 +205,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump AlarmManager alarmManager, KeyguardStateController keyguardStateController, DelayedWakeLock.Builder delayedWakeLockBuilder, Handler handler, KeyguardUpdateMonitor keyguardUpdateMonitor, DockManager dockManager, - BlurUtils blurUtils, ConfigurationController configurationController) { + BlurUtils blurUtils, ConfigurationController configurationController, + FeatureFlags featureFlags) { mScrimStateListener = lightBarController::setScrimState; - mDefaultScrimAlpha = BUSY_SCRIM_ALPHA; + mDefaultScrimAlpha = featureFlags.isShadeOpaque() ? BUSY_SCRIM_ALPHA : GAR_SCRIM_ALPHA; mBlurUtils = blurUtils; mKeyguardStateController = keyguardStateController; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java index a6b0330743b3..1260eaf23c52 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java @@ -51,6 +51,7 @@ import com.android.systemui.qs.tileimpl.QSFactoryImpl; import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.phone.AutoTileManager; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarIconController; @@ -87,6 +88,8 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { private MediaHost mQSMediaHost; @Mock private MediaHost mQQSMediaHost; + @Mock + private FeatureFlags mFeatureFlags; public QSFragmentTest() { super(QSFragment.class); @@ -175,6 +178,7 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { new QSDetailDisplayer(), mQSMediaHost, mQQSMediaHost, - mQsComponentFactory); + mQsComponentFactory, + mFeatureFlags); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index 342b2f57396e..30c3e6d85875 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -50,6 +50,7 @@ import com.android.systemui.DejankUtils; import com.android.systemui.SysuiTestCase; import com.android.systemui.dock.DockManager; import com.android.systemui.statusbar.BlurUtils; +import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.ScrimView; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -104,6 +105,8 @@ public class ScrimControllerTest extends SysuiTestCase { private BlurUtils mBlurUtils; @Mock private ConfigurationController mConfigurationController; + @Mock + private FeatureFlags mFeatureFlags; private static class AnimatorListener implements Animator.AnimatorListener { @@ -211,13 +214,13 @@ public class ScrimControllerTest extends SysuiTestCase { when(mDelayedWakeLockBuilder.setTag(any(String.class))) .thenReturn(mDelayedWakeLockBuilder); when(mDelayedWakeLockBuilder.build()).thenReturn(mWakeLock); - + when(mFeatureFlags.isShadeOpaque()).thenReturn(true); when(mDockManager.isDocked()).thenReturn(false); mScrimController = new ScrimController(mLightBarController, mDozeParamenters, mAlarmManager, mKeyguardStateController, mDelayedWakeLockBuilder, new FakeHandler(mLooper.getLooper()), mKeyguardUpdateMonitor, - mDockManager, mBlurUtils, mConfigurationController); + mDockManager, mBlurUtils, mConfigurationController, mFeatureFlags); mScrimController.setScrimVisibleListener(visible -> mScrimVisibility = visible); mScrimController.attachViews(mScrimBehind, mScrimInFront, mScrimForBubble); mScrimController.setAnimatorListener(mAnimatorListener); |