diff options
| author | 2019-01-03 17:50:52 -0800 | |
|---|---|---|
| committer | 2019-01-18 13:57:04 -0800 | |
| commit | 00be88f1fddecd4c477139b3f25b0cb1bf7e15b6 (patch) | |
| tree | 5dc9dd47560c6a3fdf7dcfe36965b26657fafa09 | |
| parent | 3d36dd83a9c107b98455a0e00b0a6614f6a8ee1d (diff) | |
New pulsing notification layout
Test: wake up with power
Test: look at shelf on lock screen
Test: lock device w/ notifications from home screen
Test: receive notification on AOD
Test: atest KeyguardClockPositionAlgorithmTest
Test: atest NotificationRoundnessManagerTest
Test: atest ScrimControllerTest
Test: atest NotificationContentViewTest
Bug: 111405682
Change-Id: I9b4f2febd56a62256124567bffebc9f5f8255847
34 files changed, 203 insertions, 572 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 72819cb1493b..b8d748dce9e6 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -384,9 +384,7 @@ public class Notification implements Parcelable STANDARD_LAYOUTS.add(R.layout.notification_template_material_messaging); STANDARD_LAYOUTS.add(R.layout.notification_template_material_media); STANDARD_LAYOUTS.add(R.layout.notification_template_material_big_media); - STANDARD_LAYOUTS.add(R.layout.notification_template_ambient_header); STANDARD_LAYOUTS.add(R.layout.notification_template_header); - STANDARD_LAYOUTS.add(R.layout.notification_template_material_ambient); } /** @@ -4570,9 +4568,7 @@ public class Notification implements Parcelable if (p.title != null) { contentView.setViewVisibility(R.id.title, View.VISIBLE); contentView.setTextViewText(R.id.title, processTextSpans(p.title)); - if (!p.ambient) { - setTextViewColorPrimary(contentView, R.id.title, p); - } + setTextViewColorPrimary(contentView, R.id.title, p); contentView.setViewLayoutWidth(R.id.title, showProgress ? ViewGroup.LayoutParams.WRAP_CONTENT : ViewGroup.LayoutParams.MATCH_PARENT); @@ -4581,9 +4577,7 @@ public class Notification implements Parcelable int textId = showProgress ? com.android.internal.R.id.text_line_1 : com.android.internal.R.id.text; contentView.setTextViewText(textId, processTextSpans(p.text)); - if (!p.ambient) { - setTextViewColorSecondary(contentView, textId, p); - } + setTextViewColorSecondary(contentView, textId, p); contentView.setViewVisibility(textId, View.VISIBLE); } @@ -4842,7 +4836,7 @@ public class Notification implements Parcelable if (mN.mLargeIcon == null && mN.largeIcon != null) { mN.mLargeIcon = Icon.createWithBitmap(mN.largeIcon); } - boolean showLargeIcon = mN.mLargeIcon != null && !p.hideLargeIcon && !p.ambient; + boolean showLargeIcon = mN.mLargeIcon != null && !p.hideLargeIcon; if (showLargeIcon) { contentView.setViewVisibility(R.id.right_icon, View.VISIBLE); contentView.setImageViewIcon(R.id.right_icon, mN.mLargeIcon); @@ -4856,7 +4850,7 @@ public class Notification implements Parcelable * @return if the reply icon is visible */ private boolean bindReplyIcon(RemoteViews contentView, StandardTemplateParams p) { - boolean actionVisible = !p.hideReplyIcon && !p.ambient; + boolean actionVisible = !p.hideReplyIcon; Action action = null; if (actionVisible) { action = findReplyAction(); @@ -4896,21 +4890,18 @@ public class Notification implements Parcelable private void bindNotificationHeader(RemoteViews contentView, StandardTemplateParams p) { bindSmallIcon(contentView, p); bindHeaderAppName(contentView, p); - if (!p.ambient) { - // Ambient view does not have these - bindHeaderText(contentView, p); - bindHeaderTextSecondary(contentView, p); - bindHeaderChronometerAndTime(contentView, p); - bindProfileBadge(contentView, p); - bindAlertedIcon(contentView, p); - } + bindHeaderText(contentView, p); + bindHeaderTextSecondary(contentView, p); + bindHeaderChronometerAndTime(contentView, p); + bindProfileBadge(contentView, p); + bindAlertedIcon(contentView, p); bindActivePermissions(contentView, p); bindExpandButton(contentView, p); mN.mUsesStandardHeader = true; } private void bindActivePermissions(RemoteViews contentView, StandardTemplateParams p) { - int color = p.ambient ? resolveAmbientColor(p) : getNeutralColor(p); + int color = getNeutralColor(p); contentView.setDrawableTint(R.id.camera, false, color, PorterDuff.Mode.SRC_ATOP); contentView.setDrawableTint(R.id.mic, false, color, PorterDuff.Mode.SRC_ATOP); contentView.setDrawableTint(R.id.overlay, false, color, PorterDuff.Mode.SRC_ATOP); @@ -5021,13 +5012,12 @@ public class Notification implements Parcelable if (isColorized(p)) { setTextViewColorPrimary(contentView, R.id.app_name_text, p); } else { - contentView.setTextColor(R.id.app_name_text, - p.ambient ? resolveAmbientColor(p) : getSecondaryTextColor(p)); + contentView.setTextColor(R.id.app_name_text, getSecondaryTextColor(p)); } } private boolean isColorized(StandardTemplateParams p) { - return p.allowColorization && !p.ambient && mN.isColorized(); + return p.allowColorization && mN.isColorized(); } private void bindSmallIcon(RemoteViews contentView, StandardTemplateParams p) { @@ -5097,7 +5087,7 @@ public class Notification implements Parcelable List<Notification.Action> nonContextualActions = filterOutContextualActions(mActions); int N = nonContextualActions.size(); - boolean emphazisedMode = mN.fullScreenIntent != null && !p.ambient; + boolean emphazisedMode = mN.fullScreenIntent != null; big.setBoolean(R.id.actions, "setEmphasizedMode", emphazisedMode); if (N > 0) { big.setViewVisibility(R.id.actions_container, View.VISIBLE); @@ -5122,7 +5112,7 @@ public class Notification implements Parcelable } CharSequence[] replyText = mN.extras.getCharSequenceArray(EXTRA_REMOTE_INPUT_HISTORY); - if (!p.ambient && validRemoteInput && replyText != null + if (validRemoteInput && replyText != null && replyText.length > 0 && !TextUtils.isEmpty(replyText[0]) && p.maxRemoteInputHistory > 0) { boolean showSpinner = mN.extras.getBoolean(EXTRA_SHOW_REMOTE_INPUT_SPINNER); @@ -5239,11 +5229,10 @@ public class Notification implements Parcelable * Construct a RemoteViews for the final notification header only. This will not be * colorized. * - * @param ambient if true, generate the header for the ambient display layout. * @hide */ - public RemoteViews makeNotificationHeader(boolean ambient) { - return makeNotificationHeader(mParams.reset().ambient(ambient).fillTextsFrom(this)); + public RemoteViews makeNotificationHeader() { + return makeNotificationHeader(mParams.reset().fillTextsFrom(this)); } /** @@ -5256,8 +5245,7 @@ public class Notification implements Parcelable // Headers on their own are never colorized p.disallowColorization(); RemoteViews header = new BuilderRemoteViews(mContext.getApplicationInfo(), - p.ambient ? R.layout.notification_template_ambient_header - : R.layout.notification_template_header); + R.layout.notification_template_header); resetNotificationHeader(header); bindNotificationHeader(header, p); return header; @@ -5269,11 +5257,7 @@ public class Notification implements Parcelable * @hide */ public RemoteViews makeAmbientNotification() { - RemoteViews ambient = applyStandardTemplateWithActions( - R.layout.notification_template_material_ambient, - mParams.reset().ambient(true).fillTextsFrom(this).hasProgress(false), - null /* result */); - return ambient; + return createHeadsUpContentView(false /* increasedHeight */); } private void hideLine1Text(RemoteViews result) { @@ -5377,14 +5361,8 @@ public class Notification implements Parcelable } mN.extras = publicExtras; RemoteViews view; - if (ambient) { - publicExtras.putCharSequence(EXTRA_TITLE, - mContext.getString(com.android.internal.R.string.notification_hidden_text)); - view = makeAmbientNotification(); - } else{ - view = makeNotificationHeader(false /* ambient */); - view.setBoolean(R.id.notification_header, "setExpandOnlyOnButton", true); - } + view = makeNotificationHeader(); + view.setBoolean(R.id.notification_header, "setExpandOnlyOnButton", true); mN.extras = savedBundle; mN.mLargeIcon = largeIcon; mN.largeIcon = largeIconLegacy; @@ -5404,7 +5382,6 @@ public class Notification implements Parcelable public RemoteViews makeLowPriorityContentView(boolean useRegularSubtext) { StandardTemplateParams p = mParams.reset() .forceDefaultColor() - .ambient(false) .fillTextsFrom(this); if (!useRegularSubtext || TextUtils.isEmpty(mParams.summaryText)) { p.summaryText(createSummaryText()); @@ -5495,8 +5472,7 @@ public class Notification implements Parcelable if (isColorized(p)) { setTextViewColorPrimary(button, R.id.action0, p); } else if (getRawColor(p) != COLOR_DEFAULT && mTintActionButtons) { - button.setTextColor(R.id.action0, - p.ambient ? resolveAmbientColor(p) : resolveContrastColor(p)); + button.setTextColor(R.id.action0, resolveContrastColor(p)); } } button.setIntTag(R.id.action0, R.id.notification_action_index_tag, @@ -5589,13 +5565,8 @@ public class Notification implements Parcelable } private CharSequence processLegacyText(CharSequence charSequence) { - return processLegacyText(charSequence, false /* ambient */); - } - - private CharSequence processLegacyText(CharSequence charSequence, boolean ambient) { boolean isAlreadyLightText = isLegacy() || textColorsNeedInversion(); - boolean wantLightText = ambient; - if (isAlreadyLightText != wantLightText) { + if (isAlreadyLightText) { return getColorUtil().invertCharSequenceColors(charSequence); } else { return charSequence; @@ -5609,9 +5580,7 @@ public class Notification implements Parcelable StandardTemplateParams p) { boolean colorable = !isLegacy() || getColorUtil().isGrayscaleIcon(mContext, smallIcon); int color; - if (p.ambient) { - color = resolveAmbientColor(p); - } else if (isColorized(p)) { + if (isColorized(p)) { color = getPrimaryTextColor(p); } else { color = resolveContrastColor(p); @@ -5698,17 +5667,6 @@ public class Notification implements Parcelable return mNeutralColor; } - int resolveAmbientColor(StandardTemplateParams p) { - int rawColor = getRawColor(p); - if (mCachedAmbientColorIsFor == rawColor && mCachedAmbientColorIsFor != COLOR_INVALID) { - return mCachedAmbientColor; - } - final int contrasted = ContrastColorUtil.resolveAmbientColor(mContext, rawColor); - - mCachedAmbientColorIsFor = rawColor; - return mCachedAmbientColor = contrasted; - } - /** * Apply the unstyled operations and return a new {@link Notification} object. * @hide @@ -10144,7 +10102,6 @@ public class Notification implements Parcelable private static class StandardTemplateParams { boolean hasProgress = true; - boolean ambient = false; CharSequence title; CharSequence text; CharSequence headerTextSecondary; @@ -10157,7 +10114,6 @@ public class Notification implements Parcelable final StandardTemplateParams reset() { hasProgress = true; - ambient = false; title = null; text = null; summaryText = null; @@ -10213,22 +10169,15 @@ public class Notification implements Parcelable return this; } - final StandardTemplateParams ambient(boolean ambient) { - Preconditions.checkState(title == null && text == null, "must set ambient before text"); - this.ambient = ambient; - return this; - } - final StandardTemplateParams fillTextsFrom(Builder b) { Bundle extras = b.mN.extras; - this.title = b.processLegacyText(extras.getCharSequence(EXTRA_TITLE), ambient); + this.title = b.processLegacyText(extras.getCharSequence(EXTRA_TITLE)); - // Big text notifications should contain their content when viewed in ambient mode. CharSequence text = extras.getCharSequence(EXTRA_BIG_TEXT); - if (!ambient || TextUtils.isEmpty(text)) { + if (TextUtils.isEmpty(text)) { text = extras.getCharSequence(EXTRA_TEXT); } - this.text = b.processLegacyText(text, ambient); + this.text = b.processLegacyText(text); this.summaryText = extras.getCharSequence(EXTRA_SUB_TEXT); return this; } diff --git a/core/res/res/layout/notification_template_ambient_header.xml b/core/res/res/layout/notification_template_ambient_header.xml deleted file mode 100644 index be5d9b436b79..000000000000 --- a/core/res/res/layout/notification_template_ambient_header.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (C) 2017 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. - --> - -<!-- hack to work around <include /> not being supported at the top level --> -<FrameLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:paddingStart="@dimen/notification_extra_margin_ambient" - android:paddingEnd="@dimen/notification_extra_margin_ambient" - android:layout_width="wrap_content" - android:layout_height="wrap_content"> - <include - layout="@layout/notification_template_header" - android:theme="@style/Theme.DeviceDefault.Notification.Ambient"/> -</FrameLayout> diff --git a/core/res/res/layout/notification_template_material_ambient.xml b/core/res/res/layout/notification_template_material_ambient.xml deleted file mode 100644 index 2c6064ea6243..000000000000 --- a/core/res/res/layout/notification_template_material_ambient.xml +++ /dev/null @@ -1,94 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (C) 2017 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. - --> - -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/status_bar_latest_event_content" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:tag="ambient" - android:paddingStart="@dimen/notification_extra_margin_ambient" - android:paddingEnd="@dimen/notification_extra_margin_ambient" - > - <include layout="@layout/notification_template_ambient_header" - android:theme="@style/Theme.DeviceDefault.Notification.Ambient" /> - - <LinearLayout - android:id="@+id/notification_action_list_margin_target" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_gravity="top" - android:layout_marginTop="@dimen/notification_content_margin_top" - android:layout_marginBottom="@dimen/notification_action_list_height" - android:paddingTop="4dp" - android:paddingBottom="6dp" - android:clipToPadding="false" - android:orientation="vertical"> - - <LinearLayout - android:id="@+id/notification_main_column" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="top" - android:layout_weight="1" - android:paddingStart="@dimen/notification_content_margin_start" - android:paddingEnd="@dimen/notification_content_margin_end" - android:clipToPadding="false" - android:minHeight="@dimen/notification_min_content_height" - android:orientation="vertical" - > - <TextView android:id="@+id/title" - android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:gravity="top|center_horizontal" - android:singleLine="true" - android:ellipsize="marquee" - android:fadingEdge="horizontal" - android:textSize="@dimen/notification_ambient_title_text_size" - android:textColor="#ffffffff" - /> - <TextView android:id="@+id/text" - android:layout_width="match_parent" - android:layout_height="0dp" - android:textAppearance="@style/TextAppearance.DeviceDefault.Notification" - android:singleLine="false" - android:layout_weight="1" - android:gravity="top|center_horizontal" - android:visibility="gone" - android:textSize="@dimen/notification_ambient_text_size" - android:textColor="#eeffffff" - android:layout_marginTop="4dp" - android:ellipsize="end" - android:maxLines="3" - /> - </LinearLayout> - <FrameLayout android:id="@+id/actions_container" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="bottom"> - <com.android.internal.widget.NotificationActionListLayout - android:id="@+id/actions" - android:layout_width="match_parent" - android:layout_height="@dimen/notification_action_list_height" - android:paddingEnd="4dp" - android:orientation="horizontal" - android:gravity="center" - android:visibility="gone" - /> - </FrameLayout> - </LinearLayout> -</FrameLayout> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 05a156b69371..c8706838df57 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -194,9 +194,6 @@ <!-- The margin for text at the end of the image view for media notifications --> <dimen name="notification_media_image_margin_end">72dp</dimen> - <!-- The additional margin on the sides of the ambient view. --> - <dimen name="notification_extra_margin_ambient">16dp</dimen> - <!-- The height of the notification action list --> <dimen name="notification_action_list_height">60dp</dimen> @@ -233,9 +230,6 @@ <!-- The bottom padding for the notification header --> <dimen name="notification_header_padding_bottom">16dp</dimen> - <!-- The margin at the top of the notification header when dozing. --> - <dimen name="notification_header_margin_top_ambient">3dp</dimen> - <!-- The margin at the bottom of the notification header. --> <dimen name="notification_header_margin_bottom">0dp</dimen> @@ -400,11 +394,6 @@ <dimen name="notification_title_text_size">14sp</dimen> <!-- Size of smaller notification text (see TextAppearance.StatusBar.EventContent.Line2, Info, Time) --> <dimen name="notification_subtext_size">12sp</dimen> - <!-- Size of notification text (see TextAppearance.StatusBar.EventContent) --> - <dimen name="notification_ambient_text_size">16sp</dimen> - <!-- Size of notification text titles (see TextAppearance.StatusBar.EventContent.Title) --> - <dimen name="notification_ambient_title_text_size">24sp</dimen> - <!-- Top padding for notifications in the standard layout. --> <dimen name="notification_top_pad">10dp</dimen> diff --git a/core/res/res/values/styles_device_defaults.xml b/core/res/res/values/styles_device_defaults.xml index 200ef2f56f51..79afe697c504 100644 --- a/core/res/res/values/styles_device_defaults.xml +++ b/core/res/res/values/styles_device_defaults.xml @@ -271,9 +271,6 @@ easier. <style name="TextAppearance.DeviceDefault.Notification.Info" parent="TextAppearance.Material.Notification.Info"> <item name="fontFamily">@string/config_bodyFontFamily</item> </style> - <style name="TextAppearance.DeviceDefault.Notification.Info.Ambient" parent="TextAppearance.Material.Notification.Info.Ambient"> - <item name="fontFamily">@string/config_bodyFontFamily</item> - </style> <style name="TextAppearance.DeviceDefault.Widget" parent="TextAppearance.Material.Widget"> <item name="fontFamily">@string/config_bodyFontFamily</item> </style> diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml index 5a7199d6f445..63ac0e6bfc3e 100644 --- a/core/res/res/values/styles_material.xml +++ b/core/res/res/values/styles_material.xml @@ -487,10 +487,6 @@ please see styles_device_defaults.xml. <style name="TextAppearance.Material.Notification.Time" parent="TextAppearance.Material.Notification.Info" /> - <style name="TextAppearance.Material.Notification.Info.Ambient"> - <item name="textSize">@dimen/notification_text_size</item> - </style> - <style name="TextAppearance.Material.Notification.Emphasis"> <item name="textColor">#66000000</item> </style> @@ -1308,10 +1304,5 @@ please see styles_device_defaults.xml. <item name="gravity">top</item> </style> - <style name="Notification.Header.Ambient"> - <item name="layout_marginTop">@dimen/notification_header_margin_top_ambient</item> - <item name="gravity">top|center_horizontal</item> - </style> - </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index a7c8c1e4af00..5da802f46903 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3076,8 +3076,6 @@ <java-symbol type="dimen" name="config_appTransitionAnimationDurationScaleDefault" /> - <java-symbol type="layout" name="notification_template_material_ambient" /> - <!-- Network Recommendation --> <java-symbol type="string" name="config_defaultNetworkRecommendationProviderPackage" /> @@ -3237,8 +3235,6 @@ <java-symbol type="string" name="time_picker_text_input_mode_description"/> <java-symbol type="string" name="time_picker_radial_mode_description"/> - <java-symbol type="layout" name="notification_template_ambient_header" /> - <!-- resolver activity --> <java-symbol type="drawable" name="resolver_icon_placeholder" /> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index d60313a4402c..75a727bdcfdf 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -1711,8 +1711,4 @@ easier. <item name="notificationHeaderTextAppearance">@style/TextAppearance.DeviceDefault.Notification.Info</item> </style> - <style name="Theme.DeviceDefault.Notification.Ambient" parent="@style/Theme.Material.Notification.Ambient"> - <item name="notificationHeaderTextAppearance">@style/TextAppearance.DeviceDefault.Notification.Info.Ambient</item> - </style> - </resources> diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml index ccaf04160dc5..6b7698e344ad 100644 --- a/core/res/res/values/themes_material.xml +++ b/core/res/res/values/themes_material.xml @@ -1341,14 +1341,6 @@ please see themes_device_defaults.xml. <item name="notificationHeaderIconSize">@dimen/notification_header_icon_size</item> </style> - <!-- Theme for inflating ambient notification --> - <style name="Theme.Material.Notification.Ambient"> - <item name="notificationHeaderStyle">@style/Notification.Header.Ambient</item> - <item name="notificationHeaderTextAppearance">@style/TextAppearance.Material.Notification.Info.Ambient</item> - <item name="notificationHeaderAppNameVisibility">gone</item> - <item name="notificationHeaderIconSize">@dimen/notification_header_icon_size_ambient</item> - </style> - <!-- Default theme for Settings and activities launched from Settings. --> <style name="Theme.Material.Settings" parent="Theme.Material.Light.LightStatusBar"> <item name="homeAsUpIndicator">@drawable/ic_ab_back_material_settings</item> diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml index 9245c300acf5..e2ba23ec898c 100644 --- a/packages/SystemUI/res-keyguard/values/dimens.xml +++ b/packages/SystemUI/res-keyguard/values/dimens.xml @@ -47,8 +47,6 @@ <dimen name="bottom_text_spacing_digital">0dp</dimen> <!-- Slice subtitle --> <dimen name="widget_label_font_size">16dp</dimen> - <!-- Slice offset when pulsing --> - <dimen name="widget_pulsing_bottom_padding">48dp</dimen> <!-- Clock without header --> <dimen name="widget_big_font_size">64dp</dimen> <!-- Clock with header --> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 5a00b4526c32..ab0bbe10c37c 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -66,9 +66,7 @@ <item name="status_bar_icon_scale_factor" format="float" type="dimen">1.0</item> <dimen name="group_overflow_number_size">@*android:dimen/notification_text_size</dimen> - <dimen name="group_overflow_number_size_dark">16sp</dimen> <dimen name="group_overflow_number_padding">@*android:dimen/notification_content_margin_end</dimen> - <dimen name="group_overflow_number_extra_padding_dark">@*android:dimen/notification_extra_margin_ambient</dimen> <!-- max height of a notification such that the content can still fade out when closing --> <dimen name="max_notification_fadeout_height">100dp</dimen> @@ -94,9 +92,6 @@ <!-- Height of a large notification in the status bar --> <dimen name="notification_max_height">294dp</dimen> - <!-- Height of an ambient notification on ambient display --> - <dimen name="notification_ambient_height">400dp</dimen> - <!-- Height of a heads up notification in the status bar for legacy custom views --> <dimen name="notification_max_heads_up_height_legacy">128dp</dimen> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 22a0b3642a35..fa675b75d85d 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -64,48 +64,16 @@ <item name="hybridNotificationTextStyle">@style/hybrid_notification_text</item> </style> - <style name="HybridNotification.Ambient"> - <item name="hybridNotificationStyle">@style/hybrid_notification_ambient</item> - <item name="hybridNotificationTitleStyle">@style/hybrid_notification_title_ambient</item> - <item name="hybridNotificationTextStyle">@style/hybrid_notification_text_ambient</item> - </style> - - <style name="hybrid_notification_ambient"> - <item name="android:paddingStart">@*android:dimen/notification_extra_margin_ambient</item> - <item name="android:paddingEnd">@*android:dimen/notification_extra_margin_ambient</item> - <item name="android:orientation">vertical</item> - </style> - <style name="hybrid_notification"> <item name="android:paddingStart">@*android:dimen/notification_content_margin_start</item> <item name="android:paddingEnd">12dp</item> </style> - <style name="hybrid_notification_title_ambient"> - <item name="android:layout_marginTop">@*android:dimen/notification_header_margin_top_ambient</item> - <item name="android:paddingStart">@*android:dimen/notification_content_margin_start</item> - <item name="android:paddingEnd">@*android:dimen/notification_content_margin_end</item> - <item name="android:textAppearance">@*android:style/Notification.Header.Ambient</item> - <item name="android:layout_gravity">top|center_horizontal</item> - <item name="android:textSize">@*android:dimen/notification_ambient_title_text_size</item> - <item name="android:textColor">#ffffffff</item> - </style> - <style name="hybrid_notification_title"> <item name="android:paddingEnd">4dp</item> <item name="android:textAppearance">@*android:style/TextAppearance.Material.Notification.Title</item> </style> - <style name="hybrid_notification_text_ambient"> - <item name="android:paddingStart">@*android:dimen/notification_content_margin_start</item> - <item name="android:paddingEnd">@*android:dimen/notification_content_margin_end</item> - <item name="android:textSize">@*android:dimen/notification_ambient_text_size</item> - <item name="android:textColor">#eeffffff</item> - <item name="android:gravity">top|center_horizontal</item> - <item name="android:ellipsize">end</item> - <item name="android:maxLines">3</item> - </style> - <style name="hybrid_notification_text" parent="@*android:style/Widget.Material.Notification.Text"> <item name="android:paddingEnd">4dp</item> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java index 669e6fff525b..bac7844c024b 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java @@ -90,7 +90,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe */ private Runnable mContentChangeListener; private Slice mSlice; - private boolean mPulsing; + private boolean mHasHeader; public KeyguardSliceView(Context context) { this(context, null, 0); @@ -150,10 +150,18 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe Dependency.get(ConfigurationController.class).removeCallback(this); } + /** + * Returns whether the current visible slice has a title/header. + */ + public boolean hasHeader() { + return mHasHeader; + } + private void showSlice() { Trace.beginSection("KeyguardSliceView#showSlice"); - if (mPulsing || mSlice == null) { + if (mSlice == null) { mRow.setVisibility(GONE); + mHasHeader = false; if (mContentChangeListener != null) { mContentChangeListener.run(); } @@ -162,7 +170,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe ListContent lc = new ListContent(getContext(), mSlice); SliceContent headerContent = lc.getHeader(); - boolean hasHeader = headerContent != null + mHasHeader = headerContent != null && !headerContent.getSliceItem().hasHint(HINT_LIST_ITEM); List<SliceContent> subItems = new ArrayList<>(); for (int i = 0; i < lc.getRowItems().size(); i++) { @@ -177,7 +185,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe mClickActions.clear(); final int subItemsCount = subItems.size(); final int blendedColor = getTextColor(); - final int startIndex = hasHeader ? 1 : 0; // First item is header; skip it + final int startIndex = mHasHeader ? 1 : 0; // First item is header; skip it mRow.setVisibility(subItemsCount > 0 ? VISIBLE : GONE); for (int i = startIndex; i < subItemsCount; i++) { RowContent rc = (RowContent) subItems.get(i); @@ -189,7 +197,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe button = new KeyguardSliceButton(mContext); button.setTextColor(blendedColor); button.setTag(itemTag); - final int viewIndex = i - (hasHeader ? 1 : 0); + final int viewIndex = i - (mHasHeader ? 1 : 0); mRow.addView(button, viewIndex); } @@ -234,18 +242,6 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe Trace.endSection(); } - public void setPulsing(boolean pulsing, boolean animate) { - mPulsing = pulsing; - LayoutTransition transition = getLayoutTransition(); - if (!animate) { - setLayoutTransition(null); - } - showSlice(); - if (!animate) { - setLayoutTransition(transition); - } - } - public void setDarkAmount(float darkAmount) { mDarkAmount = darkAmount; mRow.setDarkAmount(darkAmount); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java index 7ae4c41d318f..bb549ada6830 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java @@ -72,7 +72,6 @@ public class KeyguardStatusView extends GridLayout implements private ArraySet<View> mVisibleInDoze; private boolean mPulsing; - private boolean mWasPulsing; private float mDarkAmount = 0; private int mTextColor; private int mLastLayoutHeight; @@ -210,7 +209,7 @@ public class KeyguardStatusView extends GridLayout implements private void onSliceContentChanged() { LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) mClockView.getLayoutParams(); - layoutParams.bottomMargin = mPulsing ? mSmallClockPadding : 0; + layoutParams.bottomMargin = mKeyguardSlice.hasHeader() ? mSmallClockPadding : 0; mClockView.setLayoutParams(layoutParams); } @@ -220,16 +219,16 @@ public class KeyguardStatusView extends GridLayout implements @Override public void onLayoutChange(View view, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { - int heightOffset = mPulsing || mWasPulsing ? 0 : getHeight() - mLastLayoutHeight; + boolean smallClock = mKeyguardSlice.hasHeader(); + int heightOffset = smallClock ? 0 : getHeight() - mLastLayoutHeight; long duration = KeyguardSliceView.DEFAULT_ANIM_DURATION; - long delay = mPulsing || mWasPulsing ? 0 : duration / 4; - mWasPulsing = false; + long delay = smallClock ? 0 : duration / 4; boolean shouldAnimate = mKeyguardSlice.getLayoutTransition() != null && mKeyguardSlice.getLayoutTransition().isRunning(); if (view == mClockView) { - float clockScale = mPulsing ? mSmallClockScale : 1; - Paint.Style style = mPulsing ? Paint.Style.FILL_AND_STROKE : Paint.Style.FILL; + float clockScale = smallClock ? mSmallClockScale : 1; + Paint.Style style = smallClock ? Paint.Style.FILL_AND_STROKE : Paint.Style.FILL; mClockView.animate().cancel(); if (shouldAnimate) { mClockView.setY(oldTop + heightOffset); @@ -434,15 +433,11 @@ public class KeyguardStatusView extends GridLayout implements } } - public void setPulsing(boolean pulsing, boolean animate) { + public void setPulsing(boolean pulsing) { if (mPulsing == pulsing) { return; } - if (mPulsing) { - mWasPulsing = true; - } mPulsing = pulsing; - mKeyguardSlice.setPulsing(pulsing, animate); updateDozeVisibleViews(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index bd9ca1aa32f8..9ef9c94d7cdc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -65,12 +65,12 @@ public class NotificationShelf extends ActivatableNotificationView implements private static final String TAG = "NotificationShelf"; private static final long SHELF_IN_TRANSLATION_DURATION = 200; - private boolean mDark; private NotificationIconContainer mShelfIcons; private int[] mTmp = new int[2]; private boolean mHideBackground; private int mIconAppearTopPadding; private int mShelfAppearTranslation; + private float mDarkShelfPadding; private int mStatusBarHeight; private int mStatusBarPaddingStart; private AmbientState mAmbientState; @@ -140,6 +140,7 @@ public class NotificationShelf extends ActivatableNotificationView implements mStatusBarPaddingStart = res.getDimensionPixelOffset(R.dimen.status_bar_padding_start); mPaddingBetweenElements = res.getDimensionPixelSize(R.dimen.notification_divider_height); mShelfAppearTranslation = res.getDimensionPixelSize(R.dimen.shelf_appear_translation); + mDarkShelfPadding = res.getDimensionPixelSize(R.dimen.widget_bottom_separator_padding); ViewGroup.LayoutParams layoutParams = getLayoutParams(); layoutParams.height = res.getDimensionPixelOffset(R.dimen.notification_shelf_height); @@ -165,11 +166,11 @@ public class NotificationShelf extends ActivatableNotificationView implements @Override public void setDark(boolean dark, boolean fade, long delay) { - super.setDark(dark, fade, delay); if (mDark == dark) return; - mDark = dark; + super.setDark(dark, fade, delay); mShelfIcons.setDark(dark, fade, delay); updateInteractiveness(); + updateOutline(); } /** @@ -218,10 +219,9 @@ public class NotificationShelf extends ActivatableNotificationView implements float awakenTranslation = Math.max(Math.min(viewEnd, maxShelfEnd) - viewState.height, getFullyClosedTranslation()); - float darkTranslation = mAmbientState.getDarkTopPadding(); float yRatio = mAmbientState.hasPulsingNotifications() ? 0 : mAmbientState.getDarkAmount(); - viewState.yTranslation = MathUtils.lerp(awakenTranslation, darkTranslation, yRatio); + viewState.yTranslation = awakenTranslation + mDarkShelfPadding * yRatio; viewState.zTranslation = ambientState.getBaseZHeight(); // For the small display size, it's not enough to make the icon not covered by // the top cutout so the denominator add the height of cutout. @@ -763,18 +763,14 @@ public class NotificationShelf extends ActivatableNotificationView implements } } - public boolean hidesBackground() { - return mHideBackground; - } - @Override protected boolean needsOutline() { - return !mHideBackground && super.needsOutline(); + return !mHideBackground && !mDark && super.needsOutline(); } @Override protected boolean shouldHideBackground() { - return super.shouldHideBackground() || mHideBackground; + return super.shouldHideBackground() || mHideBackground || mDark; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java index 8b0a6828205d..c34d567da0be 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java @@ -105,7 +105,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView private final DoubleTapHelper mDoubleTapHelper; private boolean mDimmed; - private boolean mDark; + protected boolean mDark; protected int mBgTint = NO_COLOR; private float mBgAlpha = 1f; @@ -140,7 +140,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView private FalsingManager mFalsingManager; private float mNormalBackgroundVisibilityAmount; - private ValueAnimator mFadeInFromDarkAnimator; private float mDimmedBackgroundFadeInAmount = -1; private ValueAnimator.AnimatorUpdateListener mBackgroundVisibilityUpdater = new ValueAnimator.AnimatorUpdateListener() { @@ -150,22 +149,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView mDimmedBackgroundFadeInAmount = mBackgroundDimmed.getAlpha(); } }; - private AnimatorListenerAdapter mFadeInEndListener = new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); - mFadeInFromDarkAnimator = null; - mDimmedBackgroundFadeInAmount = -1; - updateBackground(); - } - }; - private ValueAnimator.AnimatorUpdateListener mUpdateOutlineListener - = new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - updateOutlineAlpha(); - } - }; private FakeShadowView mFakeShadow; private int mCurrentBackgroundTint; private int mTargetTint; @@ -465,22 +448,11 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView mDark = dark; updateBackground(); updateBackgroundTint(false); - if (!dark && fade && !shouldHideBackground()) { - fadeInFromDark(delay); - } - updateOutlineAlpha(); } private void updateOutlineAlpha() { - if (mDark) { - setOutlineAlpha(0f); - return; - } float alpha = NotificationStackScrollLayout.BACKGROUND_ALPHA_DIMMED; alpha = (alpha + (1.0f - alpha) * mNormalBackgroundVisibilityAmount); - if (mFadeInFromDarkAnimator != null) { - alpha *= mFadeInFromDarkAnimator.getAnimatedFraction(); - } setOutlineAlpha(alpha); } @@ -638,36 +610,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView } /** - * Fades in the background when exiting dark mode. - */ - private void fadeInFromDark(long delay) { - final View background = mDimmed ? mBackgroundDimmed : mBackgroundNormal; - background.setAlpha(0f); - mBackgroundVisibilityUpdater.onAnimationUpdate(null); - background.animate() - .alpha(1f) - .setDuration(DARK_ANIMATION_LENGTH) - .setStartDelay(delay) - .setInterpolator(Interpolators.ALPHA_IN) - .setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationCancel(Animator animation) { - // Jump state if we are cancelled - background.setAlpha(1f); - } - }) - .setUpdateListener(mBackgroundVisibilityUpdater) - .start(); - mFadeInFromDarkAnimator = TimeAnimator.ofFloat(0.0f, 1.0f); - mFadeInFromDarkAnimator.setDuration(DARK_ANIMATION_LENGTH); - mFadeInFromDarkAnimator.setStartDelay(delay); - mFadeInFromDarkAnimator.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN); - mFadeInFromDarkAnimator.addListener(mFadeInEndListener); - mFadeInFromDarkAnimator.addUpdateListener(mUpdateOutlineListener); - mFadeInFromDarkAnimator.start(); - } - - /** * Fades the background when the dimmed state changes. */ private void fadeDimmedBackground() { @@ -708,9 +650,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView public void onAnimationEnd(Animator animation) { updateBackground(); mBackgroundAnimator = null; - if (mFadeInFromDarkAnimator == null) { - mDimmedBackgroundFadeInAmount = -1; - } + mDimmedBackgroundFadeInAmount = -1; } }); mBackgroundAnimator.addUpdateListener(mBackgroundVisibilityUpdater); @@ -736,7 +676,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView mBackgroundNormal.setVisibility(mActivated ? VISIBLE : INVISIBLE); } else if (mDimmed) { // When groups are animating to the expanded state from the lockscreen, show the - // normal background instead of the dimmed background + // normal background instead of the dimmed background. final boolean dontShowDimmed = isGroupExpansionChanging() && isChildInGroup(); mBackgroundDimmed.setVisibility(dontShowDimmed ? View.INVISIBLE : View.VISIBLE); mBackgroundNormal.setVisibility((mActivated || dontShowDimmed) @@ -760,7 +700,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView } protected boolean shouldHideBackground() { - return mDark; + return false; } private void cancelFadeAnimations() { @@ -1023,14 +963,11 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView /** * @param withTint should a possible tint be factored in? - * @param withOverRide should the value be interpolated with {@link #mOverrideTint} + * @param withOverride should the value be interpolated with {@link #mOverrideTint} * @return the calculated background color */ - private int calculateBgColor(boolean withTint, boolean withOverRide) { - if (withTint && mDark) { - return getContext().getColor(R.color.notification_material_background_dark_color); - } - if (withOverRide && mOverrideTint != NO_COLOR) { + private int calculateBgColor(boolean withTint, boolean withOverride) { + if (withOverride && mOverrideTint != NO_COLOR) { int defaultTint = calculateBgColor(withTint, false); return NotificationUtils.interpolateColors(defaultTint, mOverrideTint, mOverrideAmount); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index df0189fc4c4a..296c061459bc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -132,7 +132,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } private LayoutListener mLayoutListener; - private boolean mDark; private boolean mLowPriorityStateUpdated; private final NotificationInflater mNotificationInflater; private int mIconTransformContentShift; @@ -146,7 +145,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView private int mNotificationMinHeight; private int mNotificationMinHeightLarge; private int mNotificationMaxHeight; - private int mNotificationAmbientHeight; private int mIncreasedPaddingBetweenElements; private int mNotificationLaunchHeight; private boolean mMustStayOnScreen; @@ -677,8 +675,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView if (headsUpWrapper != null) { headsUpHeight = Math.max(headsUpHeight, headsUpWrapper.getMinLayoutHeight()); } - layout.setHeights(minHeight, headsUpHeight, mNotificationMaxHeight, - mNotificationAmbientHeight); + layout.setHeights(minHeight, headsUpHeight, mNotificationMaxHeight, headsUpHeight); } public StatusBarNotification getStatusBarNotification() { @@ -1647,8 +1644,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView R.dimen.notification_min_height_increased); mNotificationMaxHeight = NotificationUtils.getFontScaledHeight(mContext, R.dimen.notification_max_height); - mNotificationAmbientHeight = NotificationUtils.getFontScaledHeight(mContext, - R.dimen.notification_ambient_height); mMaxHeadsUpHeightBeforeN = NotificationUtils.getFontScaledHeight(mContext, R.dimen.notification_max_heads_up_height_legacy); mMaxHeadsUpHeightBeforeP = NotificationUtils.getFontScaledHeight(mContext, @@ -2008,8 +2003,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView @Override public void setDark(boolean dark, boolean fade, long delay) { + if (mDark == dark) { + return; + } super.setDark(dark, fade, delay); - mDark = dark; if (!mIsAmbientPulsing) { // Only fade the showing view of the pulsing notification. fade = false; @@ -2018,9 +2015,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView if (showing != null) { showing.setDark(dark, fade, delay); } - if (mIsSummaryWithChildren) { - mChildrenContainer.setDark(dark, fade, delay); - } updateShelfIconColor(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java index 33badafd5488..90ff4a728915 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridGroupManager.java @@ -39,14 +39,10 @@ public class HybridGroupManager { private final NotificationDozeHelper mDozer; private final ViewGroup mParent; - private float mOverflowNumberSizeDark; - private int mOverflowNumberPaddingDark; private float mOverflowNumberSize; private int mOverflowNumberPadding; private int mOverflowNumberColor; - private int mOverflowNumberColorDark; - private float mDarkAmount = 0f; public HybridGroupManager(Context ctx, ViewGroup parent) { mContext = ctx; @@ -59,12 +55,8 @@ public class HybridGroupManager { Resources res = mContext.getResources(); mOverflowNumberSize = res.getDimensionPixelSize( R.dimen.group_overflow_number_size); - mOverflowNumberSizeDark = res.getDimensionPixelSize( - R.dimen.group_overflow_number_size_dark); mOverflowNumberPadding = res.getDimensionPixelSize( R.dimen.group_overflow_number_padding); - mOverflowNumberPaddingDark = mOverflowNumberPadding + res.getDimensionPixelSize( - R.dimen.group_overflow_number_extra_padding_dark); } private HybridNotificationView inflateHybridViewWithStyle(int style) { @@ -86,13 +78,11 @@ public class HybridGroupManager { } private void updateOverFlowNumberColor(TextView numberView) { - numberView.setTextColor(NotificationUtils.interpolateColors( - mOverflowNumberColor, mOverflowNumberColorDark, mDarkAmount)); + numberView.setTextColor(mOverflowNumberColor); } - public void setOverflowNumberColor(TextView numberView, int colorRegular, int colorDark) { + public void setOverflowNumberColor(TextView numberView, int colorRegular) { mOverflowNumberColor = colorRegular; - mOverflowNumberColorDark = colorDark; if (numberView != null) { updateOverFlowNumberColor(numberView); } @@ -107,7 +97,7 @@ public class HybridGroupManager { public HybridNotificationView bindAmbientFromNotification(HybridNotificationView reusableView, Notification notification) { return bindFromNotificationWithStyle(reusableView, notification, - R.style.HybridNotification_Ambient); + R.style.HybridNotification); } private HybridNotificationView bindFromNotificationWithStyle( @@ -150,6 +140,11 @@ public class HybridGroupManager { R.plurals.notification_group_overflow_description, number), number); reusableView.setContentDescription(contentDescription); + reusableView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mOverflowNumberSize); + reusableView.setPaddingRelative(reusableView.getPaddingStart(), + reusableView.getPaddingTop(), mOverflowNumberPadding, + reusableView.getPaddingBottom()); + updateOverFlowNumberColor(reusableView); return reusableView; } @@ -163,16 +158,4 @@ public class HybridGroupManager { } return titleView; } - - public void setOverflowNumberDark(TextView view, boolean dark, boolean fade, long delay) { - mDozer.setIntensityDark((f)->{ - mDarkAmount = f; - updateOverFlowNumberColor(view); - }, dark, fade, delay, view); - view.setTextSize(TypedValue.COMPLEX_UNIT_PX, - dark ? mOverflowNumberSizeDark : mOverflowNumberSize); - int paddingEnd = dark ? mOverflowNumberPaddingDark : mOverflowNumberPadding; - view.setPaddingRelative(view.getPaddingStart(), view.getPaddingTop(), paddingEnd, - view.getPaddingBottom()); - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java index cbec37effe18..1b5013dedb0e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java @@ -75,7 +75,6 @@ public class AmbientState { private int mIntrinsicPadding; private int mExpandAnimationTopChange; private ExpandableNotificationRow mExpandingNotification; - private int mDarkTopPadding; private float mDarkAmount; private boolean mAppearing; @@ -351,7 +350,8 @@ public class AmbientState { } public boolean hasPulsingNotifications() { - return mPulsing; + return mPulsing && mAmbientPulseManager != null + && mAmbientPulseManager.hasNotifications(); } public void setPulsing(boolean hasPulsing) { @@ -458,14 +458,6 @@ public class AmbientState { return mDarkAmount != 0; } - public void setDarkTopPadding(int darkTopPadding) { - mDarkTopPadding = darkTopPadding; - } - - public int getDarkTopPadding() { - return mDarkTopPadding; - } - public void setAppearing(boolean appearing) { mAppearing = appearing; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java index 51180361806b..8ffada43c53f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java @@ -316,7 +316,7 @@ public class NotificationChildrenContainer extends ViewGroup { StatusBarNotification notification = mContainingNotification.getStatusBarNotification(); final Notification.Builder builder = Notification.Builder.recoverBuilder(getContext(), notification.getNotification()); - RemoteViews header = builder.makeNotificationHeader(false /* ambient */); + RemoteViews header = builder.makeNotificationHeader(); if (mNotificationHeader == null) { mNotificationHeader = (NotificationHeaderView) header.apply(getContext(), this); final View expandButton = mNotificationHeader.findViewById( @@ -344,7 +344,7 @@ public class NotificationChildrenContainer extends ViewGroup { builder = Notification.Builder.recoverBuilder(getContext(), notification.getNotification()); } - header = builder.makeNotificationHeader(true /* ambient */); + header = builder.makeNotificationHeader(); if (mNotificationHeaderAmbient == null) { mNotificationHeaderAmbient = (ViewGroup) header.apply(getContext(), this); mNotificationHeaderWrapperAmbient = NotificationViewWrapper.wrap(getContext(), @@ -1171,12 +1171,6 @@ public class NotificationChildrenContainer extends ViewGroup { return mIsLowPriority && !mContainingNotification.isExpanded(); } - public void setDark(boolean dark, boolean fade, long delay) { - if (mOverflowNumber != null) { - mHybridGroupManager.setOverflowNumberDark(mOverflowNumber, dark, fade, delay); - } - } - public void reInflateViews(OnClickListener listener, StatusBarNotification notification) { if (mNotificationHeader != null) { removeView(mNotificationHeader); @@ -1227,8 +1221,7 @@ public class NotificationChildrenContainer extends ViewGroup { public void onNotificationUpdated() { mHybridGroupManager.setOverflowNumberColor(mOverflowNumber, - mContainingNotification.getNotificationColor(), - mContainingNotification.getNotificationColorAmbient()); + mContainingNotification.getNotificationColor()); } public int getPositionInLinearLayout(View childInGroup) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java index 941860177d1b..c5ab9f6049c6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.notification.stack; import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.NUM_SECTIONS; +import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; @@ -26,26 +27,34 @@ import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import java.util.HashSet; +import javax.inject.Inject; +import javax.inject.Singleton; + /** * A class that manages the roundness for notification views */ -class NotificationRoundnessManager implements OnHeadsUpChangedListener { - +@Singleton +class NotificationRoundnessManager implements OnHeadsUpChangedListener, + AmbientPulseManager.OnAmbientChangedListener { + + private final ActivatableNotificationView[] mFirstInSectionViews; + private final ActivatableNotificationView[] mLastInSectionViews; + private final ActivatableNotificationView[] mTmpFirstInSectionViews; + private final ActivatableNotificationView[] mTmpLastInSectionViews; private boolean mExpanded; - private ActivatableNotificationView[] mFirstInSectionViews; - private ActivatableNotificationView[] mLastInSectionViews; - private ActivatableNotificationView[] mTmpFirstInSectionViews; - private ActivatableNotificationView[] mTmpLastInSectionViews; private HashSet<ExpandableView> mAnimatedChildren; private Runnable mRoundingChangedCallback; private ExpandableNotificationRow mTrackedHeadsUp; + private ActivatableNotificationView mTrackedAmbient; private float mAppearFraction; - NotificationRoundnessManager() { + @Inject + NotificationRoundnessManager(AmbientPulseManager ambientPulseManager) { mFirstInSectionViews = new ActivatableNotificationView[NUM_SECTIONS]; mLastInSectionViews = new ActivatableNotificationView[NUM_SECTIONS]; mTmpFirstInSectionViews = new ActivatableNotificationView[NUM_SECTIONS]; mTmpLastInSectionViews = new ActivatableNotificationView[NUM_SECTIONS]; + ambientPulseManager.addListener(this); } @Override @@ -63,6 +72,17 @@ class NotificationRoundnessManager implements OnHeadsUpChangedListener { updateView(row, false /* animate */); } + @Override + public void onAmbientStateChanged(NotificationEntry entry, boolean isPulsing) { + ActivatableNotificationView row = entry.getRow(); + if (isPulsing) { + mTrackedAmbient = row; + } else if (mTrackedAmbient == row) { + mTrackedAmbient = null; + } + updateView(row, false /* animate */); + } + private void updateView(ActivatableNotificationView view, boolean animate) { boolean changed = updateViewWithoutCallback(view, animate); if (changed) { @@ -125,6 +145,9 @@ class NotificationRoundnessManager implements OnHeadsUpChangedListener { // rounded. return 1.0f; } + if (view == mTrackedAmbient) { + return 1.0f; + } return 0.0f; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index a9b7972e50b6..c896d1238fc1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -201,12 +201,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private int mPaddingBetweenElements; private int mIncreasedPaddingBetweenElements; private int mMaxTopPadding; - private int mRegularTopPadding; - private int mDarkTopPadding; - // Current padding, will be either mRegularTopPadding or mDarkTopPadding private int mTopPadding; - // Distance between AOD separator and shelf - private int mDarkShelfPadding; private int mBottomMargin; private int mBottomInset = 0; private float mQsExpansionFraction; @@ -318,7 +313,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private HashSet<Pair<ExpandableNotificationRow, Boolean>> mHeadsUpChangeAnimations = new HashSet<>(); private HeadsUpManagerPhone mHeadsUpManager; - private NotificationRoundnessManager mRoundnessManager = new NotificationRoundnessManager(); + private final NotificationRoundnessManager mRoundnessManager; private boolean mTrackingHeadsUp; private ScrimController mScrimController; private boolean mForceNoOverlappingRendering; @@ -469,7 +464,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd public NotificationStackScrollLayout( @Named(VIEW_CONTEXT) Context context, AttributeSet attrs, - @Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) boolean allowLongPress) { + @Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) boolean allowLongPress, + NotificationRoundnessManager notificationRoundnessManager) { super(context, attrs, 0, 0); Resources res = getResources(); @@ -480,6 +476,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } mAmbientState = new AmbientState(context); + mRoundnessManager = notificationRoundnessManager; mBgColor = context.getColor(R.color.notification_shade_background_color); int minHeight = res.getDimensionPixelSize(R.dimen.notification_min_height); int maxHeight = res.getDimensionPixelSize(R.dimen.notification_max_height); @@ -496,7 +493,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd res.getBoolean(R.bool.config_drawNotificationBackground); mFadeNotificationsOnDismiss = res.getBoolean(R.bool.config_fadeNotificationsOnDismiss); - mDarkShelfPadding = res.getDimensionPixelSize(R.dimen.widget_bottom_separator_padding); mRoundnessManager.setAnimatedChildren(mChildrenToAddAnimated); mRoundnessManager.setOnRoundingChangedCallback(this::invalidate); addOnExpandedHeightListener(mRoundnessManager::setExpanded); @@ -685,7 +681,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd int lockScreenTop = mSections[0].getCurrentBounds().top; int lockScreenBottom = mSections[NUM_SECTIONS - 1].getCurrentBounds().bottom; int darkLeft = getWidth() / 2; - int darkTop = mRegularTopPadding; + int darkTop = mTopPadding; float yProgress = 1 - mInterpolatedDarkAmount; float xProgress = mDarkXInterpolator.getInterpolation( @@ -953,8 +949,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd @ShadeViewRefactor(RefactorComponent.LAYOUT_ALGORITHM) private void updateAlgorithmHeightAndPadding() { - mTopPadding = (int) MathUtils.lerp(mRegularTopPadding, mDarkTopPadding, - mInterpolatedDarkAmount); mAmbientState.setLayoutHeight(getLayoutHeight()); updateAlgorithmLayoutMinHeight(); mAmbientState.setTopPadding(mTopPadding); @@ -1092,10 +1086,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) private void setTopPadding(int topPadding, boolean animate) { - if (mRegularTopPadding != topPadding) { - mRegularTopPadding = topPadding; - mDarkTopPadding = topPadding + mDarkShelfPadding; - mAmbientState.setDarkTopPadding(mDarkTopPadding); + if (mTopPadding != topPadding) { + mTopPadding = topPadding; updateAlgorithmHeightAndPadding(); updateContentHeight(); if (animate && mAnimationsEnabled && mIsExpanded) { @@ -2060,10 +2052,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } mIntrinsicContentHeight = height; - // We don't want to use the toppadding since that might be interpolated and we want - // to take the final value of the animation. - int topPadding = mAmbientState.isFullyDark() ? mDarkTopPadding : mRegularTopPadding; - mContentHeight = height + topPadding + mBottomMargin; + mContentHeight = height + mTopPadding + mBottomMargin; updateScrollability(); clampScrollPosition(); mAmbientState.setLayoutMaxHeight(mContentHeight); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java index 19fce485b0c7..b4c205ab980c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java @@ -426,6 +426,9 @@ public class StackStateAnimator { mTmpState.yTranslation += mPulsingAppearingTranslation; mTmpState.alpha = 0; mTmpState.applyToView(changingView); + + mTmpState.copyFrom(mShelf.getViewState()); + mTmpState.applyToView(mShelf); } } else if (event.animationType == NotificationStackScrollLayout .AnimationEvent.ANIMATION_TYPE_PULSE_DISAPPEAR) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java index 6f2b63d2e64d..10497734d0b1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java @@ -158,8 +158,7 @@ public class DozeParameters implements TunerService.Tunable { * @return duration in millis. */ public long getWallpaperAodDuration() { - if (mAmbientDisplayConfiguration.wakeLockScreenGestureEnabled(UserHandle.USER_CURRENT) - || shouldControlScreenOff()) { + if (shouldControlScreenOff()) { return DozeScreenState.ENTER_DOZE_HIDE_WALLPAPER_DELAY; } return mAlwaysOnPolicy.wallpaperVisibilityDuration; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java index 577e8d614acb..280dda0cd1dc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java @@ -84,14 +84,6 @@ public class DozeScrimController implements StateListener { public void onCancelled() { pulseFinished(); } - - /** - * Whether to fade out wallpaper. - */ - @Override - public boolean isFadeOutWallpaper() { - return mPulseReason == DozeLog.PULSE_REASON_DOCKING; - } }; public DozeScrimController(DozeParameters dozeParameters) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java index a81b7e572a79..c68fdd4ec4a7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java @@ -91,11 +91,6 @@ public class KeyguardClockPositionAlgorithm { private int mBurnInPreventionOffsetY; /** - * Clock vertical padding when pulsing. - */ - private int mPulsingPadding; - - /** * Doze/AOD transition amount. */ private float mDarkAmount; @@ -105,10 +100,6 @@ public class KeyguardClockPositionAlgorithm { */ private boolean mCurrentlySecure; - /** - * Dozing and receiving a notification (AOD notification.) - */ - private boolean mPulsing; private float mEmptyDragAmount; /** @@ -123,13 +114,11 @@ public class KeyguardClockPositionAlgorithm { R.dimen.burn_in_prevention_offset_x); mBurnInPreventionOffsetY = res.getDimensionPixelSize( R.dimen.burn_in_prevention_offset_y); - mPulsingPadding = res.getDimensionPixelSize( - R.dimen.widget_pulsing_bottom_padding); } public void setup(int minTopMargin, int maxShadeBottom, int notificationStackHeight, float panelExpansion, int parentHeight, int keyguardStatusHeight, float dark, - boolean secure, boolean pulsing, float emptyDragAmount) { + boolean secure, float emptyDragAmount) { mMinTopMargin = minTopMargin + mContainerTopPadding; mMaxShadeBottom = maxShadeBottom; mNotificationStackHeight = notificationStackHeight; @@ -138,7 +127,6 @@ public class KeyguardClockPositionAlgorithm { mKeyguardStatusHeight = keyguardStatusHeight; mDarkAmount = dark; mCurrentlySecure = secure; - mPulsing = pulsing; mEmptyDragAmount = emptyDragAmount; } @@ -146,7 +134,7 @@ public class KeyguardClockPositionAlgorithm { final int y = getClockY(); result.clockY = y; result.clockAlpha = getClockAlpha(y); - result.stackScrollerPadding = y + (mPulsing ? mPulsingPadding : mKeyguardStatusHeight); + result.stackScrollerPadding = y + mKeyguardStatusHeight; result.clockX = (int) interpolate(0, burnInPreventionOffsetX(), mDarkAmount); } @@ -185,9 +173,6 @@ public class KeyguardClockPositionAlgorithm { private int getClockY() { // Dark: Align the bottom edge of the clock at about half of the screen: float clockYDark = getMaxClockY() + burnInPreventionOffsetY(); - if (mPulsing) { - clockYDark -= mPulsingPadding; - } clockYDark = MathUtils.max(0, clockYDark); float clockYRegular = getExpandedClockPosition(); @@ -230,11 +215,6 @@ public class KeyguardClockPositionAlgorithm { - mBurnInPreventionOffsetX; } - @VisibleForTesting - void setPulsingPadding(int padding) { - mPulsingPadding = padding; - } - public static class Result { /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 32cc0e6d303a..0d5ebb9b6578 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -579,7 +579,6 @@ public class NotificationPanelView extends PanelView implements mKeyguardStatusView.getHeight(), mInterpolatedDarkAmount, mStatusBar.isKeyguardCurrentlySecure(), - mPulsing, mEmptyDragAmount); mClockPositionAlgorithm.run(mClockPositionResult); PropertyAnimator.setProperty(mKeyguardStatusView, AnimatableProperty.X, @@ -595,7 +594,8 @@ public class NotificationPanelView extends PanelView implements stackScrollerPadding = mClockPositionResult.stackScrollerPadding; } mNotificationStackScroller.setIntrinsicPadding(stackScrollerPadding); - mNotificationStackScroller.setAntiBurnInOffsetX(mClockPositionResult.clockX); + int burnInXOffset = mPulsing ? 0 : mClockPositionResult.clockX; + mNotificationStackScroller.setAntiBurnInOffsetX(burnInXOffset); mStackScrollerMeasuringPass++; requestScrollerTopPaddingUpdate(animate); @@ -2830,7 +2830,7 @@ public class NotificationPanelView extends PanelView implements mAnimateNextPositionUpdate = false; } mNotificationStackScroller.setPulsing(pulsing, animatePulse); - mKeyguardStatusView.setPulsing(pulsing, animatePulse); + mKeyguardStatusView.setPulsing(pulsing); mKeyguardBottomArea.setPulsing(pulsing, animatePulse); } 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 6deff82d845d..bf143c8940e5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -274,8 +274,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo // Docking pulses may take a long time, wallpapers should also fade away after a while. if (mWallpaperSupportsAmbientMode && ( mDozeParameters.getAlwaysOn() && mState == ScrimState.AOD - || mState == ScrimState.PULSING && mCallback != null - && mCallback.isFadeOutWallpaper())) { + || mState == ScrimState.PULSING && mCallback != null)) { if (!mWallpaperVisibilityTimedOut) { mTimeTicker.schedule(mDozeParameters.getWallpaperAodDuration(), AlarmTimeout.MODE_IGNORE_IF_SCHEDULED); @@ -900,6 +899,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo } } + public void setPulseReason(int pulseReason) { + ScrimState.PULSING.setPulseReason(pulseReason); + } + public interface Callback { default void onStart() { } @@ -909,9 +912,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo } default void onCancelled() { } - default boolean isFadeOutWallpaper() { - return false; - } } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java index a68c7513b9d0..11a2d32c9dd6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.phone; import android.graphics.Color; import android.os.Trace; +import com.android.systemui.doze.DozeLog; import com.android.systemui.statusbar.ScrimView; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; @@ -125,8 +126,15 @@ public enum ScrimState { PULSING(5) { @Override public void prepare(ScrimState previousState) { - mCurrentInFrontAlpha = 0; - mCurrentBehindAlpha = mScrimBehindAlphaKeyguard; + mCurrentInFrontAlpha = 0f; + if (mPulseReason == DozeLog.PULSE_REASON_NOTIFICATION + || mPulseReason == DozeLog.PULSE_REASON_DOCKING) { + mCurrentBehindAlpha = previousState.getBehindAlpha(); + mCurrentBehindTint = Color.BLACK; + } else { + mCurrentBehindAlpha = mScrimBehindAlphaKeyguard; + mCurrentBehindTint = Color.TRANSPARENT; + } mBlankScreen = mDisplayRequiresBlanking; } }, @@ -189,6 +197,7 @@ public enum ScrimState { int mIndex; boolean mHasBackdrop; boolean mLaunchingAffordanceWithPreview; + int mPulseReason; ScrimState(int index) { mIndex = index; @@ -261,6 +270,10 @@ public enum ScrimState { mAodFrontScrimAlpha = aodFrontScrimAlpha; } + public void setPulseReason(int pulseReason) { + mPulseReason = pulseReason; + } + public void setScrimBehindAlphaKeyguard(float scrimBehindAlphaKeyguard) { mScrimBehindAlphaKeyguard = scrimBehindAlphaKeyguard; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index ed71598e22ce..1470d0f44266 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -3883,6 +3883,7 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void pulseWhileDozing(@NonNull PulseCallback callback, int reason) { + mScrimController.setPulseReason(reason); if (reason == DozeLog.PULSE_REASON_SENSOR_LONG_PRESS) { mPowerManager.wakeUp(SystemClock.uptimeMillis(), "com.android.systemui:NODOZE"); startAssist(new Bundle()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java index 8ae7d52a5da5..ff30a4d6761d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java @@ -29,7 +29,10 @@ import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; import com.android.systemui.SysuiTestCase; +import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.NotificationTestHelper; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.ExpandableView; @@ -37,6 +40,8 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import java.util.HashSet; @@ -45,14 +50,18 @@ import java.util.HashSet; @RunWithLooper public class NotificationRoundnessManagerTest extends SysuiTestCase { - private NotificationRoundnessManager mRoundnessManager = new NotificationRoundnessManager(); + private NotificationRoundnessManager mRoundnessManager; private HashSet<ExpandableView> mAnimatedChildren = new HashSet<>(); private Runnable mRoundnessCallback = mock(Runnable.class); private ExpandableNotificationRow mFirst; private ExpandableNotificationRow mSecond; + @Mock + private AmbientPulseManager mAmbientPulseManager; @Before public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + mRoundnessManager = new NotificationRoundnessManager(mAmbientPulseManager); com.android.systemui.util.Assert.sMainLooper = TestableLooper.get(this).getLooper(); NotificationTestHelper testHelper = new NotificationTestHelper(getContext()); mFirst = testHelper.createRow(); @@ -127,6 +136,27 @@ public class NotificationRoundnessManagerTest extends SysuiTestCase { } @Test + public void testRoundnessPulsing() throws Exception { + // Let's create a notification that's neither the first or last item of the stack, + // this way we'll ensure that it won't have any rounded corners by default. + mRoundnessManager.updateRoundedChildren(new NotificationSection[]{ + createSection(mFirst, mSecond), + createSection(null, null) + }); + ExpandableNotificationRow row = new NotificationTestHelper(getContext()).createRow(); + NotificationEntry entry = mock(NotificationEntry.class); + when(entry.getRow()).thenReturn(row); + + mRoundnessManager.onAmbientStateChanged(entry, true); + Assert.assertEquals(1f, row.getCurrentBottomRoundness(), 0.0f); + Assert.assertEquals(1f, row.getCurrentTopRoundness(), 0.0f); + + mRoundnessManager.onAmbientStateChanged(entry, false); + Assert.assertEquals(0f, row.getCurrentBottomRoundness(), 0.0f); + Assert.assertEquals(0f, row.getCurrentTopRoundness(), 0.0f); + } + + @Test public void testRoundnessSetOnSecondSectionLast() { mRoundnessManager.updateRoundedChildren(new NotificationSection[]{ createSection(mFirst, mFirst), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index 37814f06b9bc..736f3840b91a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -107,6 +107,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Mock private NotificationRemoteInputManager mRemoteInputManager; @Mock private RemoteInputController mRemoteInputController; @Mock private MetricsLogger mMetricsLogger; + @Mock private NotificationRoundnessManager mNotificationRoundnessManager; private TestableNotificationEntryManager mEntryManager; private int mOriginalInterruptionModelSetting; @@ -140,7 +141,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { // holds a copy of the CUT's instances of these classes, so they still refer to the CUT's // member variables, not the spy's member variables. mStackScrollerInternal = new NotificationStackScrollLayout(getContext(), null, - true /* allowLongPress */); + true /* allowLongPress */, mNotificationRoundnessManager); mStackScroller = spy(mStackScrollerInternal); mStackScroller.setShelf(notificationShelf); mStackScroller.setStatusBar(mBar); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java index 27ed9c5a14c8..cd52e8792cfd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java @@ -47,7 +47,6 @@ public class KeyguardClockPositionAlgorithmTest extends SysuiTestCase { private float mPanelExpansion; private int mKeyguardStatusHeight; private float mDark; - private boolean mPulsing; @Before public void setUp() { @@ -208,20 +207,6 @@ public class KeyguardClockPositionAlgorithmTest extends SysuiTestCase { } @Test - public void notifPositionWhilePulsingOnAOD() { - // GIVEN on AOD and pulsing - givenAOD(); - mNotificationStackHeight = EMPTY_HEIGHT; - mKeyguardStatusHeight = EMPTY_HEIGHT; - mPulsing = true; - mClockPositionAlgorithm.setPulsingPadding(200); - // WHEN the clock position algorithm is run - positionClock(); - // THEN the notif padding doesn't adjust for pulsing. - assertThat(mClockPosition.stackScrollerPadding).isEqualTo(1000); - } - - @Test public void notifPositionMiddleOfScreenOnLockScreen() { // GIVEN on lock screen and both stack scroll and clock have 0 height givenLockScreen(); @@ -307,20 +292,6 @@ public class KeyguardClockPositionAlgorithmTest extends SysuiTestCase { assertThat(mClockPosition.stackScrollerPadding).isEqualTo(0); } - @Test - public void notifPositionWhilePulsingOnLockScreen() { - // GIVEN on lock screen and pulsing - givenLockScreen(); - mNotificationStackHeight = EMPTY_HEIGHT; - mKeyguardStatusHeight = EMPTY_HEIGHT; - mPulsing = true; - mClockPositionAlgorithm.setPulsingPadding(200); - // WHEN the clock position algorithm is run - positionClock(); - // THEN the notif padding adjusts for pulsing. - assertThat(mClockPosition.stackScrollerPadding).isEqualTo(1200); - } - private void givenAOD() { mPanelExpansion = 1.f; mDark = 1.f; @@ -334,7 +305,7 @@ public class KeyguardClockPositionAlgorithmTest extends SysuiTestCase { private void positionClock() { mClockPositionAlgorithm.setup(EMPTY_MARGIN, SCREEN_HEIGHT, mNotificationStackHeight, mPanelExpansion, SCREEN_HEIGHT, mKeyguardStatusHeight, mDark, SECURE_LOCKED, - mPulsing, ZERO_DRAG); + ZERO_DRAG); mClockPositionAlgorithm.run(mClockPosition); } } 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 0471d7622cb6..c20d37f123b1 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 @@ -45,6 +45,7 @@ import android.view.View; import com.android.internal.colorextraction.ColorExtractor.GradientColors; import com.android.internal.util.function.TriConsumer; import com.android.systemui.SysuiTestCase; +import com.android.systemui.doze.DozeLog; import com.android.systemui.statusbar.ScrimView; import com.android.systemui.util.wakelock.WakeLock; import com.android.systemui.utils.os.FakeHandler; @@ -133,10 +134,11 @@ public class ScrimControllerTest extends SysuiTestCase { // Back scrim should be transparent assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_TRANSPARENT); - // Move on to PULSING and check if the back scrim was updated + // Pulsing notification should conserve AOD wallpaper. + mScrimController.setPulseReason(DozeLog.PULSE_REASON_NOTIFICATION); mScrimController.transitionTo(ScrimState.PULSING); mScrimController.finishAnimationsImmediately(); - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_SEMI_TRANSPARENT); + assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_TRANSPARENT); } @Test @@ -218,6 +220,7 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.finishAnimationsImmediately(); assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE); + mScrimController.setPulseReason(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN); mScrimController.transitionTo(ScrimState.PULSING); mScrimController.finishAnimationsImmediately(); // Front scrim should be transparent @@ -477,12 +480,8 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void testHoldsPulsingWallpaperAnimationLock() { // Pre-conditions - mScrimController.transitionTo(ScrimState.PULSING, new ScrimController.Callback() { - @Override - public boolean isFadeOutWallpaper() { - return true; - } - }); + mScrimController.setPulseReason(DozeLog.PULSE_REASON_NOTIFICATION); + mScrimController.transitionTo(ScrimState.PULSING); mScrimController.finishAnimationsImmediately(); reset(mWakeLock); @@ -491,7 +490,6 @@ public class ScrimControllerTest extends SysuiTestCase { verify(mWakeLock, never()).release(); mScrimController.finishAnimationsImmediately(); verify(mWakeLock).release(); - assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE); } @Test @@ -504,31 +502,27 @@ public class ScrimControllerTest extends SysuiTestCase { } @Test - public void testWillHidePulsingWallpaper_withRequestFadeOut() { - mScrimController.setWallpaperSupportsAmbientMode(true); - mScrimController.transitionTo(ScrimState.PULSING, new ScrimController.Callback() { - @Override - public boolean isFadeOutWallpaper() { - return true; - } - }); - verify(mAlarmManager).setExact(anyInt(), anyLong(), any(), any(), any()); - mScrimController.transitionTo(ScrimState.KEYGUARD); - verify(mAlarmManager).cancel(any(AlarmManager.OnAlarmListener.class)); - } - - @Test - public void testDoesNotHidePulsingWallpaper_withoutRequestFadeOut() { - mScrimController.setWallpaperSupportsAmbientMode(true); - mScrimController.transitionTo(ScrimState.PULSING, new ScrimController.Callback() {}); - verify(mAlarmManager, never()).setExact(anyInt(), anyLong(), any(), any(), any()); + public void testWillHidePulsingWallpaper_whenNotification() { + mScrimController.setWallpaperSupportsAmbientMode(false); + mScrimController.transitionTo(ScrimState.AOD); + mScrimController.finishAnimationsImmediately(); + mScrimController.setPulseReason(DozeLog.PULSE_REASON_NOTIFICATION); + mScrimController.transitionTo(ScrimState.PULSING); + mScrimController.finishAnimationsImmediately(); + assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE); + assertScrimTint(mScrimBehind, true); } @Test - public void testDoesNotHidePulsingWallpaper_withoutCallback() { - mScrimController.setWallpaperSupportsAmbientMode(true); + public void testWillHidePulsingWallpaper_whenDocking() { + mScrimController.setWallpaperSupportsAmbientMode(false); + mScrimController.transitionTo(ScrimState.AOD); + mScrimController.finishAnimationsImmediately(); + mScrimController.setPulseReason(DozeLog.PULSE_REASON_DOCKING); mScrimController.transitionTo(ScrimState.PULSING); - verify(mAlarmManager, never()).setExact(anyInt(), anyLong(), any(), any(), any()); + mScrimController.finishAnimationsImmediately(); + assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE); + assertScrimTint(mScrimBehind, true); } @Test |