diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index 5c83846db834b..d946f18d0bbda 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd @@ -5069,6 +5069,21 @@ Some features are limited to increase battery life. <message name="IDS_ASH_NOTIFICATION_INLINE_SETTINGS_CANCEL_BUTTON_TEXT" desc="The text for cancel button in settings, return to the main UI."> Cancel </message> + <message name="IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_1_HOUR_TEXT" desc="The text for snooze notification for 1 hour in snooze settings."> + 1h + </message> + <message name="IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_15_MINUTES_TEXT" desc="The text for snooze notification for 15 minutes in snooze settings."> + 15min + </message> + <message name="IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_30_MINUTES_TEXT" desc="The text for snooze notification for 30 minutes in snooze settings."> + 30min + </message> + <message name="IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_2_HOURS_TEXT" desc="The text for snooze notification for 2 hours in snooze settings."> + 2h + </message> + <message name="IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_UNDO_SNOOZE_TEXT" desc="The text for undo snooze notification in snooze settings."> + Undo + </message> <message name="IDS_ASH_DIALOG_DONT_SHOW_AGAIN" desc="Label for checkbox dismissing show of a dialog."> Don't show again diff --git a/ash/ash_strings_grd/IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_15_MINUTES_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_15_MINUTES_TEXT.png.sha1 new file mode 100644 index 0000000000000..a6678fae81c7b --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_15_MINUTES_TEXT.png.sha1 @@ -0,0 +1 @@ +6e09cd4134e335fbd0a62ee08abc35ca66b02b13 \ No newline at end of file diff --git a/ash/ash_strings_grd/IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_1_HOUR_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_1_HOUR_TEXT.png.sha1 new file mode 100644 index 0000000000000..bc576608614cb --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_1_HOUR_TEXT.png.sha1 @@ -0,0 +1 @@ +2f380d4f1ee6bffc74ed70cc1862da97325b95cb \ No newline at end of file diff --git a/ash/ash_strings_grd/IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_2_HOURS_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_2_HOURS_TEXT.png.sha1 new file mode 100644 index 0000000000000..88444d21cca1a --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_2_HOURS_TEXT.png.sha1 @@ -0,0 +1 @@ +26b640c73129a8bce6f197b9d38f66f942d6e1d5 \ No newline at end of file diff --git a/ash/ash_strings_grd/IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_30_MINUTES_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_30_MINUTES_TEXT.png.sha1 new file mode 100644 index 0000000000000..1bbbd05d128d9 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_30_MINUTES_TEXT.png.sha1 @@ -0,0 +1 @@ +476dc9b114de6d81bb739ff2581c0d6603a81328 \ No newline at end of file diff --git a/ash/ash_strings_grd/IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_UNDO_SNOOZE_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_UNDO_SNOOZE_TEXT.png.sha1 new file mode 100644 index 0000000000000..1dd71c353d2d9 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_UNDO_SNOOZE_TEXT.png.sha1 @@ -0,0 +1 @@ +55946a75f44f3dcba4bf19215223b4ee0c23102b \ No newline at end of file diff --git a/ash/system/message_center/ash_notification_view.cc b/ash/system/message_center/ash_notification_view.cc index 3b731dcb5e3c7..9f06e6fda954c 100644 --- a/ash/system/message_center/ash_notification_view.cc +++ b/ash/system/message_center/ash_notification_view.cc @@ -593,6 +593,7 @@ AshNotificationView::AshNotificationView( // consider making changes to this code when the bug is fixed. .SetMaximumWidth(GetExpandedMessageLabelWidth())) .AddChild(CreateInlineSettingsBuilder()) + .AddChild(CreateSnoozeSettingsBuilder()) .AddChild(CreateImageContainerBuilder().SetProperty( views::kMarginsKey, kImageContainerPadding)); @@ -1375,6 +1376,58 @@ void AshNotificationView::CreateOrUpdateInlineSettingsViews( std::move(inline_settings_cancel_button)); } +void AshNotificationView::CreateOrUpdateSnoozeSettingsViews( + const message_center::Notification& notification) { + // TODO(b/298216201): Enable snooze settings after adding mojo callbacks in + // the snooze settings layout. + + if (!snooze_settings_enabled()) { + return; + } + + snooze_settings_row()->SetLayoutManager(std::make_unique<views::BoxLayout>( + views::BoxLayout::Orientation::kHorizontal)); + auto snooze_notification_1_hour_button = GenerateNotificationLabelButton( + base::BindRepeating(&AshNotificationView::DisableNotification, + base::Unretained(this)), + l10n_util::GetStringUTF16( + IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_1_HOUR_TEXT)); + snooze_settings_row()->AddChildView( + std::move(snooze_notification_1_hour_button)); + + auto snooze_notification_15_minutes_button = GenerateNotificationLabelButton( + base::BindRepeating(&AshNotificationView::DisableNotification, + base::Unretained(this)), + l10n_util::GetStringUTF16( + IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_15_MINUTES_TEXT)); + snooze_settings_row()->AddChildView( + std::move(snooze_notification_15_minutes_button)); + + auto snooze_notification_30_minutes_button = GenerateNotificationLabelButton( + base::BindRepeating(&AshNotificationView::DisableNotification, + base::Unretained(this)), + l10n_util::GetStringUTF16( + IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_30_MINUTES_TEXT)); + snooze_settings_row()->AddChildView( + std::move(snooze_notification_30_minutes_button)); + + auto snooze_notification_2_hours_button = GenerateNotificationLabelButton( + base::BindRepeating(&AshNotificationView::DisableNotification, + base::Unretained(this)), + l10n_util::GetStringUTF16( + IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_SNOOZE_2_HOURS_TEXT)); + snooze_settings_row()->AddChildView( + std::move(snooze_notification_2_hours_button)); + + auto undo_snooze_notification_button = GenerateNotificationLabelButton( + base::BindRepeating(&AshNotificationView::ToggleSnoozeSettings, + base::Unretained(this)), + l10n_util::GetStringUTF16( + IDS_ASH_NOTIFICATION_SNOOZE_SETTINGS_UNDO_SNOOZE_TEXT)); + snooze_settings_row()->AddChildView( + std::move(undo_snooze_notification_button)); +} + void AshNotificationView::CreateOrUpdateCompactTitleMessageView( const message_center::Notification& notification) { // No CompactTitleMessageView required. It is only used for progress @@ -1566,6 +1619,21 @@ void AshNotificationView::ToggleInlineSettings(const ui::Event& event) { PreferredSizeChanged(); } +void AshNotificationView::ToggleSnoozeSettings(const ui::Event& event) { + if (!snooze_settings_enabled()) { + return; + } + + bool should_show_snooze_settings = !snooze_settings_row()->GetVisible(); + + NotificationViewBase::ToggleSnoozeSettings(event); + + left_content()->SetVisible(!should_show_snooze_settings); + right_content()->SetVisible(!should_show_snooze_settings); + + PreferredSizeChanged(); +} + void AshNotificationView::OnInlineReplyUpdated() { DCHECK(inline_reply() && inline_reply()->GetVisible()); // Fade out actions button and then fade in inline reply. diff --git a/ash/system/message_center/ash_notification_view.h b/ash/system/message_center/ash_notification_view.h index c1f9dd45f25bc..aa15145fe4049 100644 --- a/ash/system/message_center/ash_notification_view.h +++ b/ash/system/message_center/ash_notification_view.h @@ -118,6 +118,8 @@ class ASH_EXPORT AshNotificationView const message_center::Notification& notification) override; void CreateOrUpdateInlineSettingsViews( const message_center::Notification& notification) override; + void CreateOrUpdateSnoozeSettingsViews( + const message_center::Notification& notification) override; void CreateOrUpdateCompactTitleMessageView( const message_center::Notification& notification) override; void CreateOrUpdateProgressViews( @@ -137,6 +139,7 @@ class ASH_EXPORT AshNotificationView gfx::Size GetIconViewSize() const override; int GetLargeImageViewMaxWidth() const override; void ToggleInlineSettings(const ui::Event& event) override; + void ToggleSnoozeSettings(const ui::Event& event) override; void OnInlineReplyUpdated() override; void set_is_animating(bool is_animating) { is_animating_ = is_animating; } diff --git a/ui/message_center/views/notification_view.cc b/ui/message_center/views/notification_view.cc index a15e1506a3eaf..6493513222633 100644 --- a/ui/message_center/views/notification_view.cc +++ b/ui/message_center/views/notification_view.cc @@ -303,6 +303,7 @@ NotificationView::NotificationView( .SetBorder(views::CreateEmptyBorder(kLargeImageContainerPadding)) .Build()); AddChildView(CreateInlineSettingsBuilder().Build()); + AddChildView(CreateSnoozeSettingsBuilder().Build()); AddChildView(CreateActionsRow()); CreateOrUpdateViews(notification); @@ -471,6 +472,11 @@ void NotificationView::CreateOrUpdateInlineSettingsViews( inline_settings_row()->AddChildView(std::move(settings_button_row)); } +void NotificationView::CreateOrUpdateSnoozeSettingsViews( + const Notification& notification) { + // Not implemented by default. +} + std::unique_ptr<views::LabelButton> NotificationView::GenerateNotificationLabelButton( views::Button::PressedCallback callback, @@ -561,6 +567,10 @@ void NotificationView::ToggleInlineSettings(const ui::Event& event) { MessageCenter::Get()->DisableNotification(notification_id()); } +void NotificationView::ToggleSnoozeSettings(const ui::Event& event) { + // Not implemented by default. +} + bool NotificationView::IsExpandable() const { // Inline settings can not be expanded. if (GetMode() == Mode::SETTING) diff --git a/ui/message_center/views/notification_view.h b/ui/message_center/views/notification_view.h index 98c42071c4beb..7819273fbd1ae 100644 --- a/ui/message_center/views/notification_view.h +++ b/ui/message_center/views/notification_view.h @@ -40,6 +40,8 @@ class MESSAGE_CENTER_EXPORT NotificationView : public NotificationViewBase { void CreateOrUpdateSmallIconView(const Notification& notification) override; void CreateOrUpdateInlineSettingsViews( const Notification& notification) override; + void CreateOrUpdateSnoozeSettingsViews( + const Notification& notification) override; std::unique_ptr<views::LabelButton> GenerateNotificationLabelButton( views::Button::PressedCallback callback, const std::u16string& label) override; @@ -49,6 +51,7 @@ class MESSAGE_CENTER_EXPORT NotificationView : public NotificationViewBase { void OnThemeChanged() override; void UpdateCornerRadius(int top_radius, int bottom_radius) override; void ToggleInlineSettings(const ui::Event& event) override; + void ToggleSnoozeSettings(const ui::Event& event) override; bool IsExpandable() const override; void AddLayerToRegion(ui::Layer* layer, views::LayerRegion region) override; void RemoveLayerFromRegions(ui::Layer* layer) override; diff --git a/ui/message_center/views/notification_view_base.cc b/ui/message_center/views/notification_view_base.cc index d706292670752..a113334926103 100644 --- a/ui/message_center/views/notification_view_base.cc +++ b/ui/message_center/views/notification_view_base.cc @@ -209,6 +209,7 @@ void NotificationViewBase::CreateOrUpdateViews( CreateOrUpdateSmallIconView(notification); CreateOrUpdateImageView(notification); CreateOrUpdateInlineSettingsViews(notification); + CreateOrUpdateSnoozeSettingsViews(notification); UpdateViewForExpandedState(expanded_); // Should be called at the last because SynthesizeMouseMoveEvent() requires // everything is in the right location when called. @@ -400,6 +401,14 @@ NotificationViewBase::CreateInlineSettingsBuilder() { .SetVisible(false); } +views::Builder<views::BoxLayoutView> +NotificationViewBase::CreateSnoozeSettingsBuilder() { + CHECK(!snooze_row_); + return views::Builder<views::BoxLayoutView>() + .CopyAddressTo(&snooze_row_) + .SetVisible(false); +} + views::Builder<views::View> NotificationViewBase::CreateImageContainerBuilder() { DCHECK(!image_container_view_); @@ -825,6 +834,24 @@ void NotificationViewBase::ToggleInlineSettings(const ui::Event& event) { } } +void NotificationViewBase::ToggleSnoozeSettings(const ui::Event& event) { + bool snooze_settings_visible = !snooze_row_->GetVisible(); + + snooze_row_->SetVisible(snooze_settings_visible); + + SetSettingMode(snooze_settings_visible); + + // Grab a weak pointer before calling SetExpanded() as it might cause |this| + // to be deleted. + { + auto weak_ptr = weak_ptr_factory_.GetWeakPtr(); + SetExpanded(!snooze_settings_visible); + if (!weak_ptr) { + return; + } + } +} + NotificationControlButtonsView* NotificationViewBase::GetControlButtonsView() const { return control_buttons_view_; @@ -863,6 +890,18 @@ void NotificationViewBase::OnSettingsButtonPressed(const ui::Event& event) { MessageView::OnSettingsButtonPressed(event); } +void NotificationViewBase::OnSnoozeButtonPressed(const ui::Event& event) { + for (auto& observer : *observers()) { + observer.OnSnoozeButtonPressed(notification_id()); + } + + if (snooze_settings_enabled_) { + ToggleSnoozeSettings(event); + } else { + MessageView::OnSnoozeButtonPressed(event); + } +} + void NotificationViewBase::Activate() { GetWidget()->widget_delegate()->SetCanActivate(true); GetWidget()->Activate(); diff --git a/ui/message_center/views/notification_view_base.h b/ui/message_center/views/notification_view_base.h index 0da8f2a38fa79..5351ef98c8daf 100644 --- a/ui/message_center/views/notification_view_base.h +++ b/ui/message_center/views/notification_view_base.h @@ -110,6 +110,7 @@ class MESSAGE_CENTER_EXPORT NotificationViewBase bool IsManuallyExpandedOrCollapsed() const override; void SetManuallyExpandedOrCollapsed(ExpandState state) override; void OnSettingsButtonPressed(const ui::Event& event) override; + void OnSnoozeButtonPressed(const ui::Event& event) override; // views::InkDropObserver: void InkDropAnimationStarted() override; @@ -149,6 +150,9 @@ class MESSAGE_CENTER_EXPORT NotificationViewBase // Inline settings view contains inline settings. views::Builder<views::BoxLayoutView> CreateInlineSettingsBuilder(); + // Snooze settings view contains snooze settings. + views::Builder<views::BoxLayoutView> CreateSnoozeSettingsBuilder(); + // Actions row contains inline action buttons and inline textfield. Use the // given layout manager for the actions row. std::unique_ptr<views::View> CreateActionsRow( @@ -191,6 +195,9 @@ class MESSAGE_CENTER_EXPORT NotificationViewBase virtual void CreateOrUpdateInlineSettingsViews( const Notification& notification) = 0; + virtual void CreateOrUpdateSnoozeSettingsViews( + const Notification& notification) = 0; + // Add view to `left_content_` in its appropriate position according to // `left_content_count_`. Return a pointer to added view. template <typename T> @@ -202,10 +209,14 @@ class MESSAGE_CENTER_EXPORT NotificationViewBase // Reorder the view in `left_content_` according to `left_content_count_`. void ReorderViewInLeftContent(views::View* view); - // Thic function is called when the UI changes from notification view to + // This function is called when the UI changes from notification view to // inline settings or vice versa. virtual void ToggleInlineSettings(const ui::Event& event); + // This function is called when the UI changes from notification view to + // snooze settings or vice versa. + virtual void ToggleSnoozeSettings(const ui::Event& event); + // Called when a user clicks on a notification action button, identified by // `index`. virtual void ActionButtonPressed(size_t index, const ui::Event& event); @@ -235,6 +246,9 @@ class MESSAGE_CENTER_EXPORT NotificationViewBase views::View* inline_settings_row() { return settings_row_; } const views::View* inline_settings_row() const { return settings_row_; } + views::View* snooze_settings_row() { return snooze_row_; } + const views::View* snooze_settings_row() const { return snooze_row_; } + views::View* image_container_view() { return image_container_view_; } const views::View* image_container_view() const { return image_container_view_; @@ -260,6 +274,11 @@ class MESSAGE_CENTER_EXPORT NotificationViewBase inline_settings_enabled_ = inline_settings_enabled; } + bool snooze_settings_enabled() const { return snooze_settings_enabled_; } + void set_snooze_settings_enabled(bool snooze_settings_enabled) { + snooze_settings_enabled_ = snooze_settings_enabled; + } + bool hide_icon_on_expanded() const { return hide_icon_on_expanded_; } virtual bool IsExpandable() const = 0; @@ -348,11 +367,15 @@ class MESSAGE_CENTER_EXPORT NotificationViewBase // Describes whether the view can display inline settings or not. bool inline_settings_enabled_ = false; + // Describes whether the view can display snooze settings or not. + bool snooze_settings_enabled_ = false; + // Container views directly attached to this view. raw_ptr<NotificationHeaderView> header_row_ = nullptr; raw_ptr<views::View> content_row_ = nullptr; raw_ptr<views::View> actions_row_ = nullptr; raw_ptr<views::View> settings_row_ = nullptr; + raw_ptr<views::View> snooze_row_ = nullptr; // Containers for left and right side on |content_row_| raw_ptr<views::View> left_content_ = nullptr; diff --git a/ui/message_center/views/notification_view_base_unittest.cc b/ui/message_center/views/notification_view_base_unittest.cc index 0745da00c629b..046cf1ef47478 100644 --- a/ui/message_center/views/notification_view_base_unittest.cc +++ b/ui/message_center/views/notification_view_base_unittest.cc @@ -96,6 +96,11 @@ class TestNotificationView : public NotificationViewBase { notification.rich_notification_data().settings_button_handler == message_center::SettingsButtonHandler::INLINE); } + void CreateOrUpdateSnoozeSettingsViews( + const Notification& notification) override { + set_snooze_settings_enabled(notification.notifier_id().type == + message_center::NotifierType::ARC_APPLICATION); + } bool IsExpandable() const override { return true; } std::unique_ptr<views::LabelButton> GenerateNotificationLabelButton( views::Button::PressedCallback callback,