From bc204efbe5602e130fbe666d6ea2b5185d42b0c4 Mon Sep 17 00:00:00 2001 From: Rohan Shah Date: Fri, 9 Mar 2018 15:11:58 -0800 Subject: [PATCH] [QS] Update landscape UI Shorten status bar height in landscape and update colors to use wallpaperTextColor when in landscape mode. Additionally modified scrim opacity for the QS panel to provide more contrast/focus on content. Test: Visually Bug: 73808887 Change-Id: I74713587ca426020cb15960800a4d2b6ac5f6466 --- core/res/res/values-land/dimens.xml | 5 +- core/res/res/values/symbols.xml | 1 + .../quick_status_bar_header_system_icons.xml | 21 +++---- .../android/systemui/BatteryMeterView.java | 56 +++++++++++++++---- .../android/systemui/qs/QSContainerImpl.java | 34 ++++++++++- .../systemui/qs/QuickStatusBarHeader.java | 40 ++++++++++--- .../statusbar/phone/ScrimController.java | 2 +- .../systemui/statusbar/policy/Clock.java | 37 +++++++++++- .../systemui/statusbar/policy/DateView.java | 32 +++++++++++ .../res/values-land/config.xml | 21 +++++++ .../res/values-land/config.xml | 21 +++++++ .../res/values-land/config.xml | 21 +++++++ .../res/values-land/config.xml | 21 +++++++ .../res/values-land/config.xml | 21 +++++++ 14 files changed, 298 insertions(+), 35 deletions(-) create mode 100644 packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-land/config.xml create mode 100644 packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-land/config.xml create mode 100644 packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-land/config.xml create mode 100644 packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-land/config.xml create mode 100644 packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-land/config.xml diff --git a/core/res/res/values-land/dimens.xml b/core/res/res/values-land/dimens.xml index 265eaaf397135..351bd818b09a8 100644 --- a/core/res/res/values-land/dimens.xml +++ b/core/res/res/values-land/dimens.xml @@ -29,7 +29,10 @@ @dimen/status_bar_height_landscape - + + @dimen/status_bar_height_landscape + + 152dp 40dip diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 75f80137da031..84955d37505c3 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1660,6 +1660,7 @@ + diff --git a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml index f38129f0dffad..388b6333c7190 100644 --- a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml +++ b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml @@ -31,25 +31,23 @@ + android:singleLine="true" + android:textAppearance="@style/TextAppearance.StatusBar.Clock" + systemui:showDark="false" /> + android:gravity="center_vertical|center_horizontal" /> - + android:gravity="center_vertical|end" /> diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java index 1ae06d7512555..0683514f6f2a4 100644 --- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java @@ -81,6 +81,14 @@ public class BatteryMeterView extends LinearLayout implements private float mDarkIntensity; private int mUser; + /** + * Whether we should use colors that adapt based on wallpaper/the scrim behind quick settings. + */ + private boolean mUseWallpaperTextColors; + + private int mNonAdaptedForegroundColor; + private int mNonAdaptedBackgroundColor; + public BatteryMeterView(Context context) { this(context, null, 0); } @@ -140,6 +148,29 @@ public class BatteryMeterView extends LinearLayout implements updateShowPercent(); } + /** + * Sets whether the battery meter view uses the wallpaperTextColor. If we're not using it, we'll + * revert back to dark-mode-based/tinted colors. + * + * @param shouldUseWallpaperTextColor whether we should use wallpaperTextColor for all + * components + */ + public void useWallpaperTextColor(boolean shouldUseWallpaperTextColor) { + if (shouldUseWallpaperTextColor == mUseWallpaperTextColors) { + return; + } + + mUseWallpaperTextColors = shouldUseWallpaperTextColor; + + if (mUseWallpaperTextColors) { + updateColors( + Utils.getColorAttr(mContext, R.attr.wallpaperTextColor), + Utils.getColorAttr(mContext, R.attr.wallpaperTextColorSecondary)); + } else { + updateColors(mNonAdaptedForegroundColor, mNonAdaptedBackgroundColor); + } + } + public void setColorsFromContext(Context context) { if (context == null) { return; @@ -179,7 +210,8 @@ public class BatteryMeterView extends LinearLayout implements getContext().getContentResolver().registerContentObserver( Settings.System.getUriFor(SHOW_BATTERY_PERCENT), false, mSettingObserver, mUser); updateShowPercent(); - Dependency.get(TunerService.class).addTunable(this, StatusBarIconController.ICON_BLACKLIST); + Dependency.get(TunerService.class) + .addTunable(this, StatusBarIconController.ICON_BLACKLIST); Dependency.get(ConfigurationController.class).addCallback(this); mUserTracker.startTracking(); } @@ -273,19 +305,23 @@ public class BatteryMeterView extends LinearLayout implements @Override public void onDarkChanged(Rect area, float darkIntensity, int tint) { mDarkIntensity = darkIntensity; + float intensity = DarkIconDispatcher.isInArea(area, this) ? darkIntensity : 0; - int foreground = getColorForDarkIntensity(intensity, mLightModeFillColor, - mDarkModeFillColor); - int background = getColorForDarkIntensity(intensity, mLightModeBackgroundColor, - mDarkModeBackgroundColor); - mDrawable.setColors(foreground, background); - setTextColor(foreground); + mNonAdaptedForegroundColor = getColorForDarkIntensity( + intensity, mLightModeFillColor, mDarkModeFillColor); + mNonAdaptedBackgroundColor = getColorForDarkIntensity( + intensity, mLightModeBackgroundColor,mDarkModeBackgroundColor); + + if (!mUseWallpaperTextColors) { + updateColors(mNonAdaptedForegroundColor, mNonAdaptedBackgroundColor); + } } - public void setTextColor(int color) { - mTextColor = color; + private void updateColors(int foregroundColor, int backgroundColor) { + mDrawable.setColors(foregroundColor, backgroundColor); + mTextColor = foregroundColor; if (mBatteryPercentView != null) { - mBatteryPercentView.setTextColor(color); + mBatteryPercentView.setTextColor(foregroundColor); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java index bfbfbf6fe8138..71614634cd005 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java @@ -18,17 +18,15 @@ package com.android.systemui.qs; import android.content.Context; import android.content.res.Configuration; -import android.graphics.Canvas; -import android.graphics.Path; import android.graphics.Point; import android.util.AttributeSet; +import android.util.Log; import android.view.View; import android.widget.FrameLayout; import com.android.settingslib.Utils; import com.android.systemui.R; import com.android.systemui.qs.customize.QSCustomizer; -import com.android.systemui.statusbar.ExpandableOutlineView; /** * Wrapper view with background which contains {@link QSPanel} and {@link BaseStatusBarHeader} @@ -44,7 +42,11 @@ public class QSContainerImpl extends FrameLayout { protected float mQsExpansion; private QSCustomizer mQSCustomizer; private View mQSFooter; + private View mBackground; + private View mBackgroundGradient; + private View mStatusBarBackground; + private int mSideMargins; public QSContainerImpl(Context context, AttributeSet attrs) { @@ -60,6 +62,8 @@ public class QSContainerImpl extends FrameLayout { mQSCustomizer = findViewById(R.id.qs_customize); mQSFooter = findViewById(R.id.qs_footer); mBackground = findViewById(R.id.quick_settings_background); + mStatusBarBackground = findViewById(R.id.quick_settings_status_bar_background); + mBackgroundGradient = findViewById(R.id.quick_settings_gradient_view); mSideMargins = getResources().getDimensionPixelSize(R.dimen.notification_side_paddings); setClickable(true); @@ -67,6 +71,22 @@ public class QSContainerImpl extends FrameLayout { setMargins(); } + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + + // Hide the backgrounds when in landscape mode. + if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { + mBackgroundGradient.setVisibility(View.INVISIBLE); + mStatusBarBackground.setVisibility(View.INVISIBLE); + } else { + mBackgroundGradient.setVisibility(View.VISIBLE); + mStatusBarBackground.setVisibility(View.VISIBLE); + } + + updateResources(); + } + @Override public boolean performClick() { // Want to receive clicks so missing QQS tiles doesn't cause collapse, but @@ -101,6 +121,14 @@ public class QSContainerImpl extends FrameLayout { updateExpansion(); } + private void updateResources() { + LayoutParams layoutParams = (LayoutParams) mQSPanel.getLayoutParams(); + layoutParams.topMargin = mContext.getResources().getDimensionPixelSize( + com.android.internal.R.dimen.quick_qs_offset_height); + + mQSPanel.setLayoutParams(layoutParams); + } + /** * Overrides the height of this view (post-layout), so that the content is clipped to that * height and the background is set to that height. diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index 9792e4102d798..eb779a5253f10 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -24,6 +24,7 @@ import android.app.AlarmManager; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.Color; import android.graphics.Rect; import android.os.Handler; @@ -52,8 +53,10 @@ import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.PhoneStatusBarView; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager; +import com.android.systemui.statusbar.policy.Clock; import com.android.systemui.statusbar.policy.DarkIconDispatcher; import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver; +import com.android.systemui.statusbar.policy.DateView; import com.android.systemui.statusbar.policy.NextAlarmController; import java.util.Locale; @@ -88,6 +91,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements CommandQueue private TouchAnimator mStatusIconsAlphaAnimator; private TouchAnimator mHeaderTextContainerAlphaAnimator; + private View mSystemIconsView; private View mQuickQsStatusIcons; private View mDate; private View mHeaderTextContainerView; @@ -97,6 +101,9 @@ public class QuickStatusBarHeader extends RelativeLayout implements CommandQueue private View mLongPressTooltipView; /** {@link TextView} containing the actual text indicating when the next alarm will go off. */ private TextView mNextAlarmTextView; + private BatteryMeterView mBatteryMeterView; + private Clock mClockView; + private DateView mDateView; private NextAlarmController mAlarmController; private String mNextAlarmText; @@ -122,6 +129,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements CommandQueue mHeaderQsPanel = findViewById(R.id.quick_qs_panel); mDate = findViewById(R.id.date); mDate.setOnClickListener(this); + mSystemIconsView = findViewById(R.id.quick_status_bar_system_icons); mQuickQsStatusIcons = findViewById(R.id.quick_qs_status_icons); mIconManager = new TintedIconManager(findViewById(R.id.statusIcons)); @@ -145,8 +153,10 @@ public class QuickStatusBarHeader extends RelativeLayout implements CommandQueue // Set the correct tint for the status icons so they contrast mIconManager.setTint(fillColor); - BatteryMeterView battery = findViewById(R.id.battery); - battery.setForceShowPercent(true); + mBatteryMeterView = findViewById(R.id.battery); + mBatteryMeterView.setForceShowPercent(true); + mClockView = findViewById(R.id.clock); + mDateView = findViewById(R.id.date); } private void applyDarkness(int id, Rect tintArea, float intensity, int color) { @@ -167,6 +177,13 @@ public class QuickStatusBarHeader extends RelativeLayout implements CommandQueue protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); updateResources(); + + // Update color schemes in landscape to use wallpaperTextColor + boolean shouldUseWallpaperTextColor = + newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE; + mBatteryMeterView.useWallpaperTextColor(shouldUseWallpaperTextColor); + mClockView.useWallpaperTextColor(shouldUseWallpaperTextColor); + mDateView.useWallpaperTextColor(shouldUseWallpaperTextColor); } @Override @@ -176,11 +193,21 @@ public class QuickStatusBarHeader extends RelativeLayout implements CommandQueue } private void updateResources() { - // Update height, especially due to landscape mode restricting space. + Resources resources = mContext.getResources(); + + // Update height for a few views, especially due to landscape mode restricting space. mHeaderTextContainerView.getLayoutParams().height = - mContext.getResources().getDimensionPixelSize(R.dimen.qs_header_tooltip_height); + resources.getDimensionPixelSize(R.dimen.qs_header_tooltip_height); mHeaderTextContainerView.setLayoutParams(mHeaderTextContainerView.getLayoutParams()); + mSystemIconsView.getLayoutParams().height = resources.getDimensionPixelSize( + com.android.internal.R.dimen.quick_qs_offset_height); + mSystemIconsView.setLayoutParams(mSystemIconsView.getLayoutParams()); + + getLayoutParams().height = + resources.getDimensionPixelSize(com.android.internal.R.dimen.quick_qs_total_height); + setLayoutParams(getLayoutParams()); + updateStatusIconAlphaAnimator(); updateHeaderTextContainerAlphaAnimator(); } @@ -449,9 +476,8 @@ public class QuickStatusBarHeader extends RelativeLayout implements CommandQueue mHeaderQsPanel.setHost(host, null /* No customization in header */); // Use SystemUI context to get battery meter colors, and let it use the default tint (white) - BatteryMeterView battery = findViewById(R.id.battery); - battery.setColorsFromContext(mHost.getContext()); - battery.onDarkChanged(new Rect(), 0, DarkIconDispatcher.DEFAULT_ICON_TINT); + mBatteryMeterView.setColorsFromContext(mHost.getContext()); + mBatteryMeterView.onDarkChanged(new Rect(), 0, DarkIconDispatcher.DEFAULT_ICON_TINT); } public void setCallback(Callback qsPanelCallback) { 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 cfc0cc6207c37..edec101dfbed8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -85,7 +85,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo /** * Default alpha value for most scrims. */ - public static final float GRADIENT_SCRIM_ALPHA = 0.45f; + public static final float GRADIENT_SCRIM_ALPHA = 0.70f; /** * A scrim varies its opacity based on a busyness factor, for example * how many notifications are currently visible. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java index 4c92d01eae4c9..baeaaadf419fb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java @@ -40,6 +40,7 @@ import android.view.Display; import android.view.View; import android.widget.TextView; +import com.android.settingslib.Utils; import com.android.systemui.DemoMode; import com.android.systemui.Dependency; import com.android.systemui.FontSizeUtils; @@ -84,6 +85,17 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C private boolean mShowSeconds; private Handler mSecondsHandler; + /** + * Whether we should use colors that adapt based on wallpaper/the scrim behind quick settings + * for text. + */ + private boolean mUseWallpaperTextColor; + + /** + * Color to be set on this {@link TextView}, when wallpaperTextColor is not utilized. + */ + private int mNonAdaptedColor; + public Clock(Context context) { this(context, null); } @@ -101,6 +113,7 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C try { mAmPmStyle = a.getInt(R.styleable.Clock_amPmStyle, AM_PM_STYLE_GONE); mShowDark = a.getBoolean(R.styleable.Clock_showDark, true); + mNonAdaptedColor = getCurrentTextColor(); } finally { a.recycle(); } @@ -227,7 +240,10 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C @Override public void onDarkChanged(Rect area, float darkIntensity, int tint) { - setTextColor(DarkIconDispatcher.getTint(area, this, tint)); + mNonAdaptedColor = DarkIconDispatcher.getTint(area, this, tint); + if (!mUseWallpaperTextColor) { + setTextColor(mNonAdaptedColor); + } } @Override @@ -242,6 +258,25 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C 0); } + /** + * Sets whether the clock uses the wallpaperTextColor. If we're not using it, we'll revert back + * to dark-mode-based/tinted colors. + * + * @param shouldUseWallpaperTextColor whether we should use wallpaperTextColor for text color + */ + public void useWallpaperTextColor(boolean shouldUseWallpaperTextColor) { + if (shouldUseWallpaperTextColor == mUseWallpaperTextColor) { + return; + } + mUseWallpaperTextColor = shouldUseWallpaperTextColor; + + if (mUseWallpaperTextColor) { + setTextColor(Utils.getColorAttr(mContext, R.attr.wallpaperTextColor)); + } else { + setTextColor(mNonAdaptedColor); + } + } + private void updateShowSeconds() { if (mShowSeconds) { // Wait until we have a display to start trying to show seconds. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java index 74a30fa8094f6..ef630c7205e17 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java @@ -27,6 +27,7 @@ import android.text.TextUtils; import android.util.AttributeSet; import android.widget.TextView; +import com.android.settingslib.Utils; import com.android.systemui.Dependency; import com.android.systemui.R; @@ -42,6 +43,17 @@ public class DateView extends TextView { private String mLastText; private String mDatePattern; + /** + * Whether we should use colors that adapt based on wallpaper/the scrim behind quick settings + * for text. + */ + private boolean mUseWallpaperTextColor; + + /** + * Color to be set on this {@link TextView}, when wallpaperTextColor is not utilized. + */ + private int mNonAdaptedTextColor; + private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -62,6 +74,7 @@ public class DateView extends TextView { public DateView(Context context, AttributeSet attrs) { super(context, attrs); + mNonAdaptedTextColor = getCurrentTextColor(); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.DateView, @@ -117,6 +130,25 @@ public class DateView extends TextView { } } + /** + * Sets whether the date view uses the wallpaperTextColor. If we're not using it, we'll revert + * back to dark-mode-based/tinted colors. + * + * @param shouldUseWallpaperTextColor whether we should use wallpaperTextColor for text color + */ + public void useWallpaperTextColor(boolean shouldUseWallpaperTextColor) { + if (shouldUseWallpaperTextColor == mUseWallpaperTextColor) { + return; + } + mUseWallpaperTextColor = shouldUseWallpaperTextColor; + + if (mUseWallpaperTextColor) { + setTextColor(Utils.getColorAttr(mContext, R.attr.wallpaperTextColor)); + } else { + setTextColor(mNonAdaptedTextColor); + } + } + public void setDatePattern(String pattern) { if (TextUtils.equals(pattern, mDatePattern)) { return; diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-land/config.xml new file mode 100644 index 0000000000000..1aa1af3b76fc4 --- /dev/null +++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-land/config.xml @@ -0,0 +1,21 @@ + + + + @dimen/status_bar_height_landscape + + 156dp + \ No newline at end of file diff --git a/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-land/config.xml new file mode 100644 index 0000000000000..1aa1af3b76fc4 --- /dev/null +++ b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-land/config.xml @@ -0,0 +1,21 @@ + + + + @dimen/status_bar_height_landscape + + 156dp + \ No newline at end of file diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-land/config.xml new file mode 100644 index 0000000000000..1aa1af3b76fc4 --- /dev/null +++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-land/config.xml @@ -0,0 +1,21 @@ + + + + @dimen/status_bar_height_landscape + + 156dp + \ No newline at end of file diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-land/config.xml new file mode 100644 index 0000000000000..1aa1af3b76fc4 --- /dev/null +++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-land/config.xml @@ -0,0 +1,21 @@ + + + + @dimen/status_bar_height_landscape + + 156dp + \ No newline at end of file diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-land/config.xml new file mode 100644 index 0000000000000..1aa1af3b76fc4 --- /dev/null +++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-land/config.xml @@ -0,0 +1,21 @@ + + + + @dimen/status_bar_height_landscape + + 156dp + \ No newline at end of file