| Index: ui/arc/notification/arc_custom_notification_view.cc
|
| diff --git a/ui/arc/notification/arc_custom_notification_view.cc b/ui/arc/notification/arc_custom_notification_view.cc
|
| index a761c46d8d22a3bf1abec3f3c5511fe8a9c74b49..18467964004ed38ea4c83b221f766df96fb8f3b1 100644
|
| --- a/ui/arc/notification/arc_custom_notification_view.cc
|
| +++ b/ui/arc/notification/arc_custom_notification_view.cc
|
| @@ -26,6 +26,7 @@
|
| #include "ui/views/border.h"
|
| #include "ui/views/controls/button/image_button.h"
|
| #include "ui/views/focus/focus_manager.h"
|
| +#include "ui/views/layout/box_layout.h"
|
| #include "ui/views/painter.h"
|
| #include "ui/views/widget/root_view.h"
|
| #include "ui/views/widget/widget.h"
|
| @@ -43,8 +44,8 @@ class ArcCustomNotificationView::EventForwarder : public ui::EventHandler {
|
| void OnEvent(ui::Event* event) override {
|
| // Do not forward event targeted to the floating close button so that
|
| // keyboard press and tap are handled properly.
|
| - if (owner_->floating_close_button_widget_ && event->target() &&
|
| - owner_->floating_close_button_widget_->GetNativeWindow() ==
|
| + if (owner_->floating_control_buttons_widget_ && event->target() &&
|
| + owner_->floating_control_buttons_widget_->GetNativeWindow() ==
|
| event->target()) {
|
| return;
|
| }
|
| @@ -157,15 +158,15 @@ class ArcCustomNotificationView::ContentViewDelegate
|
| : owner_(owner) {}
|
|
|
| bool IsCloseButtonFocused() const override {
|
| - if (owner_->floating_close_button_ == nullptr)
|
| + if (owner_->close_button_ == nullptr)
|
| return false;
|
| - return owner_->floating_close_button_->HasFocus();
|
| + return owner_->close_button_->HasFocus();
|
| }
|
|
|
| void RequestFocusOnCloseButton() override {
|
| - if (owner_->floating_close_button_)
|
| - owner_->floating_close_button_->RequestFocus();
|
| - owner_->UpdateCloseButtonVisiblity();
|
| + if (owner_->close_button_)
|
| + owner_->close_button_->RequestFocus();
|
| + owner_->UpdateControlButtonsVisiblity();
|
| }
|
|
|
| bool IsPinned() const override {
|
| @@ -178,9 +179,9 @@ class ArcCustomNotificationView::ContentViewDelegate
|
| DISALLOW_COPY_AND_ASSIGN(ContentViewDelegate);
|
| };
|
|
|
| -class ArcCustomNotificationView::CloseButton : public views::ImageButton {
|
| +class ArcCustomNotificationView::ControlButton : public views::ImageButton {
|
| public:
|
| - explicit CloseButton(ArcCustomNotificationView* owner)
|
| + explicit ControlButton(ArcCustomNotificationView* owner)
|
| : views::ImageButton(owner), owner_(owner) {
|
| set_background(
|
| views::Background::CreateSolidBackground(SK_ColorTRANSPARENT));
|
| @@ -195,22 +196,17 @@ class ArcCustomNotificationView::CloseButton : public views::ImageButton {
|
| message_center::kControlButtonPaddingFromBorder,
|
| message_center::kControlButtonPaddingFromBorder));
|
|
|
| - SetImage(views::CustomButton::STATE_NORMAL, message_center::GetCloseIcon());
|
| set_animate_on_state_change(false);
|
| - SetAccessibleName(l10n_util::GetStringUTF16(
|
| - IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_ACCESSIBLE_NAME));
|
| - SetTooltipText(l10n_util::GetStringUTF16(
|
| - IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_TOOLTIP));
|
| }
|
|
|
| void OnFocus() override {
|
| views::ImageButton::OnFocus();
|
| - owner_->UpdateCloseButtonVisiblity();
|
| + owner_->UpdateControlButtonsVisiblity();
|
| }
|
|
|
| void OnBlur() override {
|
| views::ImageButton::OnBlur();
|
| - owner_->UpdateCloseButtonVisiblity();
|
| + owner_->UpdateControlButtonsVisiblity();
|
| }
|
|
|
| private:
|
| @@ -254,28 +250,50 @@ ArcCustomNotificationView::CreateContentViewDelegate() {
|
| return base::MakeUnique<ArcCustomNotificationView::ContentViewDelegate>(this);
|
| }
|
|
|
| -void ArcCustomNotificationView::CreateFloatingCloseButton() {
|
| +void ArcCustomNotificationView::CreateFloatingControlButtons() {
|
| // Floating close button is a transient child of |surface_| and also part
|
| // of the hosting widget's focus chain. It could only be created when both
|
| // are present.
|
| if (!surface_ || !GetWidget())
|
| return;
|
|
|
| - floating_close_button_ = new CloseButton(this);
|
| + // Creates the control_buttons_view_, which collects all control buttons into
|
| + // a horizontal box.
|
| + control_buttons_view_ = new views::View();
|
| + control_buttons_view_->SetLayoutManager(
|
| + new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0));
|
| +
|
| + settings_button_ = new ControlButton(this);
|
| + settings_button_->SetImage(views::CustomButton::STATE_NORMAL,
|
| + message_center::GetSettingsIcon());
|
| + settings_button_->SetAccessibleName(l10n_util::GetStringUTF16(
|
| + IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME));
|
| + settings_button_->SetTooltipText(l10n_util::GetStringUTF16(
|
| + IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME));
|
| + control_buttons_view_->AddChildView(settings_button_);
|
| +
|
| + close_button_ = new ControlButton(this);
|
| + close_button_->SetImage(views::CustomButton::STATE_NORMAL,
|
| + message_center::GetCloseIcon());
|
| + close_button_->SetAccessibleName(l10n_util::GetStringUTF16(
|
| + IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_ACCESSIBLE_NAME));
|
| + close_button_->SetTooltipText(l10n_util::GetStringUTF16(
|
| + IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_TOOLTIP));
|
| + control_buttons_view_->AddChildView(close_button_);
|
|
|
| views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL);
|
| params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
|
| params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
|
| params.parent = surface_->window();
|
|
|
| - floating_close_button_widget_.reset(new views::Widget);
|
| - floating_close_button_widget_->Init(params);
|
| - floating_close_button_widget_->SetContentsView(floating_close_button_);
|
| + floating_control_buttons_widget_.reset(new views::Widget);
|
| + floating_control_buttons_widget_->Init(params);
|
| + floating_control_buttons_widget_->SetContentsView(control_buttons_view_);
|
|
|
| // Put the close button into the focus chain.
|
| - floating_close_button_widget_->SetFocusTraversableParent(
|
| + floating_control_buttons_widget_->SetFocusTraversableParent(
|
| GetWidget()->GetFocusTraversable());
|
| - floating_close_button_widget_->SetFocusTraversableParentView(this);
|
| + floating_control_buttons_widget_->SetFocusTraversableParentView(this);
|
|
|
| Layout();
|
| }
|
| @@ -284,8 +302,8 @@ void ArcCustomNotificationView::SetSurface(exo::NotificationSurface* surface) {
|
| if (surface_ == surface)
|
| return;
|
|
|
| - // Reset |floating_close_button_widget_| when |surface_| is changed.
|
| - floating_close_button_widget_.reset();
|
| + // Reset |floating_control_buttons_widget_| when |surface_| is changed.
|
| + floating_control_buttons_widget_.reset();
|
|
|
| if (surface_ && surface_->window()) {
|
| surface_->window()->RemoveObserver(this);
|
| @@ -320,30 +338,30 @@ void ArcCustomNotificationView::UpdatePreferredSize() {
|
| SetPreferredSize(preferred_size);
|
| }
|
|
|
| -void ArcCustomNotificationView::UpdateCloseButtonVisiblity() {
|
| - if (!surface_ || !floating_close_button_widget_)
|
| +void ArcCustomNotificationView::UpdateControlButtonsVisiblity() {
|
| + if (!surface_ || !floating_control_buttons_widget_)
|
| return;
|
|
|
| const bool target_visiblity =
|
| surface_->window()->GetBoundsInScreen().Contains(
|
| display::Screen::GetScreen()->GetCursorScreenPoint()) ||
|
| - floating_close_button_->HasFocus();
|
| - if (target_visiblity == floating_close_button_widget_->IsVisible())
|
| + close_button_->HasFocus() || settings_button_->HasFocus();
|
| + if (target_visiblity == floating_control_buttons_widget_->IsVisible())
|
| return;
|
|
|
| if (target_visiblity)
|
| - floating_close_button_widget_->Show();
|
| + floating_control_buttons_widget_->Show();
|
| else
|
| - floating_close_button_widget_->Hide();
|
| + floating_control_buttons_widget_->Hide();
|
| }
|
|
|
| void ArcCustomNotificationView::UpdatePinnedState() {
|
| DCHECK(item_);
|
|
|
| - if (item_->pinned() && floating_close_button_widget_) {
|
| - floating_close_button_widget_.reset();
|
| - } else if (!item_->pinned() && !floating_close_button_widget_) {
|
| - CreateFloatingCloseButton();
|
| + if (item_->pinned() && floating_control_buttons_widget_) {
|
| + floating_control_buttons_widget_.reset();
|
| + } else if (!item_->pinned() && !floating_control_buttons_widget_) {
|
| + CreateFloatingControlButtons();
|
| }
|
| }
|
|
|
| @@ -429,16 +447,18 @@ void ArcCustomNotificationView::Layout() {
|
| // be positioned without the need to consider the transform.
|
| surface_->window()->children()[0]->SetTransform(transform);
|
|
|
| - if (!floating_close_button_widget_)
|
| + if (!floating_control_buttons_widget_)
|
| return;
|
|
|
| - gfx::Rect close_button_bounds(floating_close_button_->GetPreferredSize());
|
| - close_button_bounds.set_x(contents_bounds.right() -
|
| - close_button_bounds.width());
|
| - close_button_bounds.set_y(contents_bounds.y());
|
| - floating_close_button_widget_->SetBounds(close_button_bounds);
|
| + gfx::Rect control_buttons_bounds(contents_bounds);
|
| + const int buttons_width = close_button_->GetPreferredSize().width() +
|
| + settings_button_->GetPreferredSize().width();
|
| + control_buttons_bounds.set_x(control_buttons_bounds.right() - buttons_width);
|
| + control_buttons_bounds.set_height(close_button_->GetPreferredSize().height());
|
| + control_buttons_bounds.set_width(buttons_width);
|
| + floating_control_buttons_widget_->SetBounds(control_buttons_bounds);
|
|
|
| - UpdateCloseButtonVisiblity();
|
| + UpdateControlButtonsVisiblity();
|
|
|
| ash::wm::SnapWindowToPixelBoundary(surface_->window());
|
| }
|
| @@ -471,11 +491,11 @@ void ArcCustomNotificationView::OnGestureEvent(ui::GestureEvent* event) {
|
| }
|
|
|
| void ArcCustomNotificationView::OnMouseEntered(const ui::MouseEvent&) {
|
| - UpdateCloseButtonVisiblity();
|
| + UpdateControlButtonsVisiblity();
|
| }
|
|
|
| void ArcCustomNotificationView::OnMouseExited(const ui::MouseEvent&) {
|
| - UpdateCloseButtonVisiblity();
|
| + UpdateControlButtonsVisiblity();
|
| }
|
|
|
| void ArcCustomNotificationView::OnFocus() {
|
| @@ -491,17 +511,20 @@ void ArcCustomNotificationView::OnBlur() {
|
| }
|
|
|
| views::FocusTraversable* ArcCustomNotificationView::GetFocusTraversable() {
|
| - if (floating_close_button_widget_)
|
| + if (floating_control_buttons_widget_)
|
| return static_cast<views::internal::RootView*>(
|
| - floating_close_button_widget_->GetRootView());
|
| + floating_control_buttons_widget_->GetRootView());
|
| return nullptr;
|
| }
|
|
|
| void ArcCustomNotificationView::ButtonPressed(views::Button* sender,
|
| const ui::Event& event) {
|
| - if (item_ && !item_->pinned() && sender == floating_close_button_) {
|
| + if (item_ && !item_->pinned() && sender == close_button_) {
|
| item_->CloseFromCloseButton();
|
| }
|
| + if (item_ && settings_button_ && sender == settings_button_) {
|
| + item_->OpenSettings();
|
| + }
|
| }
|
|
|
| void ArcCustomNotificationView::OnWindowBoundsChanged(
|
|
|