Chromium Code Reviews| Index: ash/common/system/tray/system_tray.cc |
| diff --git a/ash/common/system/tray/system_tray.cc b/ash/common/system/tray/system_tray.cc |
| index a530f0b62738bdf32f983228740d522d92acd94c..3694c35008b73cd05020112a6604d62128133d41 100644 |
| --- a/ash/common/system/tray/system_tray.cc |
| +++ b/ash/common/system/tray/system_tray.cc |
| @@ -43,6 +43,7 @@ |
| #include "ui/events/event_constants.h" |
| #include "ui/gfx/canvas.h" |
| #include "ui/gfx/skia_util.h" |
| +#include "ui/message_center/message_center_style.h" |
| #include "ui/views/border.h" |
| #include "ui/views/controls/label.h" |
| #include "ui/views/view.h" |
| @@ -127,15 +128,15 @@ class SystemBubbleWrapper { |
| // Initializes the bubble view and creates |bubble_wrapper_|. |
| void InitView(TrayBackgroundView* tray, |
| views::View* anchor, |
| + const gfx::Insets& anchor_insets, |
| TrayBubbleView::InitParams* init_params, |
|
msw
2016/11/15 02:59:38
should the other params to InitView be part of Ini
Evan Stade
2016/11/15 17:01:29
probably not |tray|. The others could be, I suppos
|
| bool is_persistent) { |
| DCHECK(anchor); |
| LoginStatus login_status = |
| WmShell::Get()->system_tray_delegate()->GetUserLoginStatus(); |
| bubble_->InitView(anchor, login_status, init_params); |
| + bubble_->bubble_view()->set_anchor_view_insets(anchor_insets); |
| bubble_wrapper_.reset(new TrayBubbleWrapper(tray, bubble_->bubble_view())); |
| - // The system bubble should not have an arrow. |
| - bubble_->bubble_view()->SetArrowPaintType(views::BubbleBorder::PAINT_NONE); |
| is_persistent_ = is_persistent; |
| // If ChromeVox is enabled, focus the default item if no item is focused and |
| @@ -347,13 +348,13 @@ const std::vector<SystemTrayItem*>& SystemTray::GetTrayItems() const { |
| } |
| void SystemTray::ShowDefaultView(BubbleCreationType creation_type) { |
| - ShowDefaultViewWithOffset( |
| - creation_type, TrayBubbleView::InitParams::kArrowDefaultOffset, false); |
| + if (creation_type != BUBBLE_USE_EXISTING) |
| + WmShell::Get()->RecordUserMetricsAction(UMA_STATUS_AREA_MENU_OPENED); |
| + ShowItems(items_.get(), false, true, creation_type, false); |
| } |
| void SystemTray::ShowPersistentDefaultView() { |
| - ShowItems(items_.get(), false, false, BUBBLE_CREATE_NEW, |
| - TrayBubbleView::InitParams::kArrowDefaultOffset, true); |
| + ShowItems(items_.get(), false, false, BUBBLE_CREATE_NEW, true); |
| } |
| void SystemTray::ShowDetailedView(SystemTrayItem* item, |
| @@ -367,8 +368,7 @@ void SystemTray::ShowDetailedView(SystemTrayItem* item, |
| bool persistent = |
| (!activate && close_delay > 0 && creation_type == BUBBLE_CREATE_NEW); |
| items.push_back(item); |
| - ShowItems(items, true, activate, creation_type, GetTrayXOffset(item), |
| - persistent); |
| + ShowItems(items, true, activate, creation_type, persistent); |
| if (system_bubble_) |
| system_bubble_->bubble()->StartAutoCloseTimer(close_delay); |
| } |
| @@ -529,41 +529,10 @@ base::string16 SystemTray::GetAccessibleNameForTray() { |
| time, battery); |
| } |
| -int SystemTray::GetTrayXOffset(SystemTrayItem* item) const { |
| - // Don't attempt to align the arrow if the shelf is on the left or right. |
| - if (!IsHorizontalAlignment(shelf_alignment())) |
| - return TrayBubbleView::InitParams::kArrowDefaultOffset; |
| - |
| - std::map<SystemTrayItem*, views::View*>::const_iterator it = |
| - tray_item_map_.find(item); |
| - if (it == tray_item_map_.end()) |
| - return TrayBubbleView::InitParams::kArrowDefaultOffset; |
| - |
| - const views::View* item_view = it->second; |
| - if (item_view->bounds().IsEmpty()) { |
| - // The bounds of item could be still empty if it does not have a visible |
| - // tray view. In that case, use the default (minimum) offset. |
| - return TrayBubbleView::InitParams::kArrowDefaultOffset; |
| - } |
| - |
| - gfx::Point point(item_view->width() / 2, 0); |
| - ConvertPointToWidget(item_view, &point); |
| - return point.x(); |
| -} |
| - |
| -void SystemTray::ShowDefaultViewWithOffset(BubbleCreationType creation_type, |
| - int arrow_offset, |
| - bool persistent) { |
| - if (creation_type != BUBBLE_USE_EXISTING) |
| - WmShell::Get()->RecordUserMetricsAction(UMA_STATUS_AREA_MENU_OPENED); |
| - ShowItems(items_.get(), false, true, creation_type, arrow_offset, persistent); |
| -} |
| - |
| void SystemTray::ShowItems(const std::vector<SystemTrayItem*>& items, |
| bool detailed, |
| bool can_activate, |
| BubbleCreationType creation_type, |
| - int arrow_offset, |
| bool persistent) { |
| // No system tray bubbles in kiosk mode. |
| if (WmShell::Get()->system_tray_delegate()->GetUserLoginStatus() == |
| @@ -603,32 +572,25 @@ void SystemTray::ShowItems(const std::vector<SystemTrayItem*>& items, |
| : kMinimumSystemTrayMenuWidth, |
| WmShell::Get()->system_tray_delegate()->GetSystemTrayMenuWidth()); |
| - TrayBubbleView::InitParams init_params(TrayBubbleView::ANCHOR_TYPE_TRAY, |
| - GetAnchorAlignment(), menu_width, |
| + TrayBubbleView::InitParams init_params(GetAnchorAlignment(), menu_width, |
| kTrayPopupMaxWidth); |
| // TODO(oshima): Change TrayBubbleView itself. |
| init_params.can_activate = false; |
| - init_params.first_item_has_no_margin = true; |
| if (detailed) { |
| // This is the case where a volume control or brightness control bubble |
| // is created. |
| init_params.max_height = default_bubble_height_; |
| - init_params.arrow_color = kBackgroundColor; |
| + init_params.bg_color = kBackgroundColor; |
| } else { |
| - init_params.arrow_color = kHeaderBackgroundColor; |
| + init_params.bg_color = kHeaderBackgroundColor; |
| } |
| - init_params.arrow_offset = arrow_offset; |
| if (bubble_type == SystemTrayBubble::BUBBLE_TYPE_DEFAULT) |
| init_params.close_on_deactivate = !persistent; |
| - // For Volume and Brightness we don't want to show an arrow when |
| - // they are shown in a bubble by themselves. |
| - init_params.arrow_paint_type = views::BubbleBorder::PAINT_NORMAL; |
| - if (items.size() == 1 && items[0]->ShouldHideArrow()) |
| - init_params.arrow_paint_type = views::BubbleBorder::PAINT_NONE; |
| SystemTrayBubble* bubble = new SystemTrayBubble(this, items, bubble_type); |
| system_bubble_.reset(new SystemBubbleWrapper(bubble)); |
| - system_bubble_->InitView(this, tray_container(), &init_params, persistent); |
| + system_bubble_->InitView(this, GetBubbleAnchor(), GetBubbleAnchorInsets(), |
| + &init_params, persistent); |
| activation_observer_.reset(persistent ? nullptr |
| : new ActivationObserver(this)); |
| @@ -661,6 +623,9 @@ void SystemTray::ShowItems(const std::vector<SystemTrayItem*>& items, |
| SetDrawBackgroundAsActive(true); |
| } |
| +// TODO(estade): there's only one thing that triggers a notification bubble, |
| +// and that's TraySms. We could delete a lot of code in SystemTray if that |
| +// used the message center notifications instead. See crbug.com/630641 |
| void SystemTray::UpdateNotificationBubble() { |
| // Only show the notification bubble if we have notifications. |
| if (notification_items_.empty()) { |
| @@ -673,27 +638,28 @@ void SystemTray::UpdateNotificationBubble() { |
| notification_bubble = new SystemTrayBubble( |
| this, notification_items_, SystemTrayBubble::BUBBLE_TYPE_NOTIFICATION); |
| views::View* anchor; |
|
msw
2016/11/15 02:59:38
nit: init to GetBubbleAnchor() (or nullptr)
Evan Stade
2016/11/15 17:01:29
Done.
|
| - TrayBubbleView::AnchorType anchor_type; |
| // Tray items might want to show notifications while we are creating and |
| // initializing the |system_bubble_| - but it might not be fully initialized |
| // when coming here - this would produce a crashed like crbug.com/247416. |
| // As such we check the existence of the widget here. |
| + TrayBubbleView::InitParams init_params( |
| + GetAnchorAlignment(), kTrayPopupMinWidth, kTrayPopupMaxWidth); |
| + gfx::Insets anchor_insets; |
|
msw
2016/11/15 02:59:38
optional nit: init to GetBubbleAnchorInsets() and
Evan Stade
2016/11/15 17:01:29
Done.
|
| if (system_bubble_.get() && system_bubble_->bubble_view() && |
| system_bubble_->bubble_view()->GetWidget()) { |
| + // Stack on top of an existing bubble. |
| anchor = system_bubble_->bubble_view(); |
| - anchor_type = TrayBubbleView::ANCHOR_TYPE_BUBBLE; |
| + anchor_insets.Set(-message_center::kMarginBetweenItems, 0, 0, 0); |
| + init_params.anchor_alignment = TrayBubbleView::ANCHOR_ALIGNMENT_BOTTOM; |
|
msw
2016/11/15 02:59:38
does this need to check the shelf alignment?
Evan Stade
2016/11/15 17:01:29
no, the notification bubble will go on top of the
|
| } else { |
| - anchor = tray_container(); |
| - anchor_type = TrayBubbleView::ANCHOR_TYPE_TRAY; |
| + // Position as a normal tray bubble. |
| + anchor = GetBubbleAnchor(); |
| + anchor_insets = GetBubbleAnchorInsets(); |
| } |
| - TrayBubbleView::InitParams init_params(anchor_type, GetAnchorAlignment(), |
| - kTrayPopupMinWidth, |
| - kTrayPopupMaxWidth); |
| - init_params.first_item_has_no_margin = true; |
| - init_params.arrow_color = kBackgroundColor; |
| - init_params.arrow_offset = GetTrayXOffset(notification_items_[0]); |
| + init_params.bg_color = kBackgroundColor; |
| notification_bubble_.reset(new SystemBubbleWrapper(notification_bubble)); |
| - notification_bubble_->InitView(this, anchor, &init_params, false); |
| + notification_bubble_->InitView(this, anchor, anchor_insets, &init_params, |
| + false); |
| if (notification_bubble->bubble_view()->child_count() == 0) { |
| // It is possible that none of the items generated actual notifications. |
| @@ -806,13 +772,6 @@ base::string16 SystemTray::GetAccessibleNameForBubble() { |
| return GetAccessibleNameForTray(); |
| } |
| -gfx::Rect SystemTray::GetAnchorRect( |
| - views::Widget* anchor_widget, |
| - TrayBubbleView::AnchorType anchor_type, |
| - TrayBubbleView::AnchorAlignment anchor_alignment) const { |
| - return GetBubbleAnchorRect(anchor_widget, anchor_type, anchor_alignment); |
| -} |
| - |
| void SystemTray::OnBeforeBubbleWidgetInit( |
| views::Widget* anchor_widget, |
| views::Widget* bubble_widget, |
| @@ -903,17 +862,7 @@ bool SystemTray::PerformAction(const ui::Event& event) { |
| if (HasSystemBubbleType(SystemTrayBubble::BUBBLE_TYPE_DEFAULT)) { |
| system_bubble_->bubble()->Close(); |
| } else { |
| - int arrow_offset = TrayBubbleView::InitParams::kArrowDefaultOffset; |
| - if (event.IsMouseEvent() || event.type() == ui::ET_GESTURE_TAP) { |
| - const ui::LocatedEvent& located_event = |
| - static_cast<const ui::LocatedEvent&>(event); |
| - if (IsHorizontalAlignment(shelf_alignment())) { |
| - gfx::Point point(located_event.x(), 0); |
| - ConvertPointToWidget(this, &point); |
| - arrow_offset = point.x(); |
| - } |
| - } |
| - ShowDefaultViewWithOffset(BUBBLE_CREATE_NEW, arrow_offset, false); |
| + ShowDefaultView(BUBBLE_CREATE_NEW); |
| if (event.IsKeyEvent() || (event.flags() & ui::EF_TOUCH_ACCESSIBILITY)) |
| ActivateBubble(); |
| } |