Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(340)

Side by Side Diff: ash/common/system/tray/system_tray.cc

Issue 2491033006: Adjust positioning of cros tray bubbles. (Closed)
Patch Set: rebase Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ash/common/system/tray/system_tray.h ('k') | ash/common/system/tray/system_tray_bubble.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/common/system/tray/system_tray.h" 5 #include "ash/common/system/tray/system_tray.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 29 matching lines...) Expand all
40 #include "base/timer/timer.h" 40 #include "base/timer/timer.h"
41 #include "grit/ash_strings.h" 41 #include "grit/ash_strings.h"
42 #include "ui/base/accelerators/accelerator.h" 42 #include "ui/base/accelerators/accelerator.h"
43 #include "ui/base/l10n/l10n_util.h" 43 #include "ui/base/l10n/l10n_util.h"
44 #include "ui/compositor/layer.h" 44 #include "ui/compositor/layer.h"
45 #include "ui/display/display.h" 45 #include "ui/display/display.h"
46 #include "ui/display/screen.h" 46 #include "ui/display/screen.h"
47 #include "ui/events/event_constants.h" 47 #include "ui/events/event_constants.h"
48 #include "ui/gfx/canvas.h" 48 #include "ui/gfx/canvas.h"
49 #include "ui/gfx/skia_util.h" 49 #include "ui/gfx/skia_util.h"
50 #include "ui/message_center/message_center_style.h"
50 #include "ui/views/border.h" 51 #include "ui/views/border.h"
51 #include "ui/views/controls/label.h" 52 #include "ui/views/controls/label.h"
52 #include "ui/views/view.h" 53 #include "ui/views/view.h"
53 #include "ui/views/widget/widget.h" 54 #include "ui/views/widget/widget.h"
54 55
55 #if defined(OS_CHROMEOS) 56 #if defined(OS_CHROMEOS)
56 #include "ash/common/system/chromeos/audio/tray_audio.h" 57 #include "ash/common/system/chromeos/audio/tray_audio.h"
57 #include "ash/common/system/chromeos/bluetooth/tray_bluetooth.h" 58 #include "ash/common/system/chromeos/bluetooth/tray_bluetooth.h"
58 #include "ash/common/system/chromeos/brightness/tray_brightness.h" 59 #include "ash/common/system/chromeos/brightness/tray_brightness.h"
59 #include "ash/common/system/chromeos/cast/tray_cast.h" 60 #include "ash/common/system/chromeos/cast/tray_cast.h"
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 125
125 class SystemBubbleWrapper { 126 class SystemBubbleWrapper {
126 public: 127 public:
127 // Takes ownership of |bubble|. 128 // Takes ownership of |bubble|.
128 explicit SystemBubbleWrapper(SystemTrayBubble* bubble) 129 explicit SystemBubbleWrapper(SystemTrayBubble* bubble)
129 : bubble_(bubble), is_persistent_(false) {} 130 : bubble_(bubble), is_persistent_(false) {}
130 131
131 // Initializes the bubble view and creates |bubble_wrapper_|. 132 // Initializes the bubble view and creates |bubble_wrapper_|.
132 void InitView(TrayBackgroundView* tray, 133 void InitView(TrayBackgroundView* tray,
133 views::View* anchor, 134 views::View* anchor,
135 const gfx::Insets& anchor_insets,
134 TrayBubbleView::InitParams* init_params, 136 TrayBubbleView::InitParams* init_params,
135 bool is_persistent) { 137 bool is_persistent) {
136 DCHECK(anchor); 138 DCHECK(anchor);
137 LoginStatus login_status = 139 LoginStatus login_status =
138 WmShell::Get()->system_tray_delegate()->GetUserLoginStatus(); 140 WmShell::Get()->system_tray_delegate()->GetUserLoginStatus();
139 bubble_->InitView(anchor, login_status, init_params); 141 bubble_->InitView(anchor, login_status, init_params);
142 bubble_->bubble_view()->set_anchor_view_insets(anchor_insets);
140 bubble_wrapper_.reset(new TrayBubbleWrapper(tray, bubble_->bubble_view())); 143 bubble_wrapper_.reset(new TrayBubbleWrapper(tray, bubble_->bubble_view()));
141 // The system bubble should not have an arrow.
142 bubble_->bubble_view()->SetArrowPaintType(views::BubbleBorder::PAINT_NONE);
143 is_persistent_ = is_persistent; 144 is_persistent_ = is_persistent;
144 145
145 // If ChromeVox is enabled, focus the default item if no item is focused and 146 // If ChromeVox is enabled, focus the default item if no item is focused and
146 // there isn't a delayed close. 147 // there isn't a delayed close.
147 if (WmShell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled() && 148 if (WmShell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled() &&
148 !is_persistent) { 149 !is_persistent) {
149 bubble_->FocusDefaultIfNeeded(); 150 bubble_->FocusDefaultIfNeeded();
150 } 151 }
151 } 152 }
152 153
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 PreferredSizeChanged(); 345 PreferredSizeChanged();
345 tray_item_map_[item] = tray_item; 346 tray_item_map_[item] = tray_item;
346 } 347 }
347 } 348 }
348 349
349 const std::vector<SystemTrayItem*>& SystemTray::GetTrayItems() const { 350 const std::vector<SystemTrayItem*>& SystemTray::GetTrayItems() const {
350 return items_.get(); 351 return items_.get();
351 } 352 }
352 353
353 void SystemTray::ShowDefaultView(BubbleCreationType creation_type) { 354 void SystemTray::ShowDefaultView(BubbleCreationType creation_type) {
354 ShowDefaultViewWithOffset( 355 if (creation_type != BUBBLE_USE_EXISTING)
355 creation_type, TrayBubbleView::InitParams::kArrowDefaultOffset, false); 356 WmShell::Get()->RecordUserMetricsAction(UMA_STATUS_AREA_MENU_OPENED);
357 ShowItems(items_.get(), false, true, creation_type, false);
356 } 358 }
357 359
358 void SystemTray::ShowPersistentDefaultView() { 360 void SystemTray::ShowPersistentDefaultView() {
359 ShowItems(items_.get(), false, false, BUBBLE_CREATE_NEW, 361 ShowItems(items_.get(), false, false, BUBBLE_CREATE_NEW, true);
360 TrayBubbleView::InitParams::kArrowDefaultOffset, true);
361 } 362 }
362 363
363 void SystemTray::ShowDetailedView(SystemTrayItem* item, 364 void SystemTray::ShowDetailedView(SystemTrayItem* item,
364 int close_delay, 365 int close_delay,
365 bool activate, 366 bool activate,
366 BubbleCreationType creation_type) { 367 BubbleCreationType creation_type) {
367 std::vector<SystemTrayItem*> items; 368 std::vector<SystemTrayItem*> items;
368 // The detailed view with timeout means a UI to show the current system state, 369 // The detailed view with timeout means a UI to show the current system state,
369 // like the audio level or brightness. Such UI should behave as persistent and 370 // like the audio level or brightness. Such UI should behave as persistent and
370 // keep its own logic for the appearance. 371 // keep its own logic for the appearance.
371 bool persistent = 372 bool persistent =
372 (!activate && close_delay > 0 && creation_type == BUBBLE_CREATE_NEW); 373 (!activate && close_delay > 0 && creation_type == BUBBLE_CREATE_NEW);
373 items.push_back(item); 374 items.push_back(item);
374 ShowItems(items, true, activate, creation_type, GetTrayXOffset(item), 375 ShowItems(items, true, activate, creation_type, persistent);
375 persistent);
376 if (system_bubble_) 376 if (system_bubble_)
377 system_bubble_->bubble()->StartAutoCloseTimer(close_delay); 377 system_bubble_->bubble()->StartAutoCloseTimer(close_delay);
378 } 378 }
379 379
380 void SystemTray::SetDetailedViewCloseDelay(int close_delay) { 380 void SystemTray::SetDetailedViewCloseDelay(int close_delay) {
381 if (HasSystemBubbleType(SystemTrayBubble::BUBBLE_TYPE_DETAILED)) 381 if (HasSystemBubbleType(SystemTrayBubble::BUBBLE_TYPE_DETAILED))
382 system_bubble_->bubble()->StartAutoCloseTimer(close_delay); 382 system_bubble_->bubble()->StartAutoCloseTimer(close_delay);
383 } 383 }
384 384
385 void SystemTray::HideDetailedView(SystemTrayItem* item, bool animate) { 385 void SystemTray::HideDetailedView(SystemTrayItem* item, bool animate) {
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 base::string16 SystemTray::GetAccessibleNameForTray() { 526 base::string16 SystemTray::GetAccessibleNameForTray() {
527 base::string16 time = GetAccessibleTimeString(base::Time::Now()); 527 base::string16 time = GetAccessibleTimeString(base::Time::Now());
528 base::string16 battery = base::ASCIIToUTF16(""); 528 base::string16 battery = base::ASCIIToUTF16("");
529 #if defined(OS_CHROMEOS) 529 #if defined(OS_CHROMEOS)
530 battery = PowerStatus::Get()->GetAccessibleNameString(false); 530 battery = PowerStatus::Get()->GetAccessibleNameString(false);
531 #endif 531 #endif
532 return l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_ACCESSIBLE_DESCRIPTION, 532 return l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_ACCESSIBLE_DESCRIPTION,
533 time, battery); 533 time, battery);
534 } 534 }
535 535
536 int SystemTray::GetTrayXOffset(SystemTrayItem* item) const {
537 // Don't attempt to align the arrow if the shelf is on the left or right.
538 if (!IsHorizontalAlignment(shelf_alignment()))
539 return TrayBubbleView::InitParams::kArrowDefaultOffset;
540
541 std::map<SystemTrayItem*, views::View*>::const_iterator it =
542 tray_item_map_.find(item);
543 if (it == tray_item_map_.end())
544 return TrayBubbleView::InitParams::kArrowDefaultOffset;
545
546 const views::View* item_view = it->second;
547 if (item_view->bounds().IsEmpty()) {
548 // The bounds of item could be still empty if it does not have a visible
549 // tray view. In that case, use the default (minimum) offset.
550 return TrayBubbleView::InitParams::kArrowDefaultOffset;
551 }
552
553 gfx::Point point(item_view->width() / 2, 0);
554 ConvertPointToWidget(item_view, &point);
555 return point.x();
556 }
557
558 void SystemTray::ShowDefaultViewWithOffset(BubbleCreationType creation_type,
559 int arrow_offset,
560 bool persistent) {
561 if (creation_type != BUBBLE_USE_EXISTING)
562 WmShell::Get()->RecordUserMetricsAction(UMA_STATUS_AREA_MENU_OPENED);
563 ShowItems(items_.get(), false, true, creation_type, arrow_offset, persistent);
564 }
565
566 void SystemTray::ShowItems(const std::vector<SystemTrayItem*>& items, 536 void SystemTray::ShowItems(const std::vector<SystemTrayItem*>& items,
567 bool detailed, 537 bool detailed,
568 bool can_activate, 538 bool can_activate,
569 BubbleCreationType creation_type, 539 BubbleCreationType creation_type,
570 int arrow_offset,
571 bool persistent) { 540 bool persistent) {
572 // No system tray bubbles in kiosk mode. 541 // No system tray bubbles in kiosk mode.
573 if (WmShell::Get()->system_tray_delegate()->GetUserLoginStatus() == 542 if (WmShell::Get()->system_tray_delegate()->GetUserLoginStatus() ==
574 LoginStatus::KIOSK_APP) { 543 LoginStatus::KIOSK_APP) {
575 return; 544 return;
576 } 545 }
577 546
578 // Destroy any existing bubble and create a new one. 547 // Destroy any existing bubble and create a new one.
579 SystemTrayBubble::BubbleType bubble_type = 548 SystemTrayBubble::BubbleType bubble_type =
580 detailed ? SystemTrayBubble::BUBBLE_TYPE_DETAILED 549 detailed ? SystemTrayBubble::BUBBLE_TYPE_DETAILED
(...skipping 22 matching lines...) Expand all
603 572
604 // The menu width is fixed for all languages in material design. 573 // The menu width is fixed for all languages in material design.
605 int menu_width = kMinimumSystemTrayMenuWidthMd; 574 int menu_width = kMinimumSystemTrayMenuWidthMd;
606 if (!MaterialDesignController::IsSystemTrayMenuMaterial()) { 575 if (!MaterialDesignController::IsSystemTrayMenuMaterial()) {
607 // The menu width is fixed, and it is a per language setting. 576 // The menu width is fixed, and it is a per language setting.
608 menu_width = std::max( 577 menu_width = std::max(
609 kMinimumSystemTrayMenuWidth, 578 kMinimumSystemTrayMenuWidth,
610 WmShell::Get()->system_tray_delegate()->GetSystemTrayMenuWidth()); 579 WmShell::Get()->system_tray_delegate()->GetSystemTrayMenuWidth());
611 } 580 }
612 581
613 TrayBubbleView::InitParams init_params(TrayBubbleView::ANCHOR_TYPE_TRAY, 582 TrayBubbleView::InitParams init_params(GetAnchorAlignment(), menu_width,
614 GetAnchorAlignment(), menu_width,
615 kTrayPopupMaxWidth); 583 kTrayPopupMaxWidth);
616 // TODO(oshima): Change TrayBubbleView itself. 584 // TODO(oshima): Change TrayBubbleView itself.
617 init_params.can_activate = false; 585 init_params.can_activate = false;
618 init_params.first_item_has_no_margin = true;
619 if (detailed) { 586 if (detailed) {
620 // This is the case where a volume control or brightness control bubble 587 // This is the case where a volume control or brightness control bubble
621 // is created. 588 // is created.
622 init_params.max_height = default_bubble_height_; 589 init_params.max_height = default_bubble_height_;
623 init_params.arrow_color = kBackgroundColor; 590 init_params.bg_color = kBackgroundColor;
624 } else { 591 } else {
625 init_params.arrow_color = kHeaderBackgroundColor; 592 init_params.bg_color = kHeaderBackgroundColor;
626 } 593 }
627 init_params.arrow_offset = arrow_offset;
628 if (bubble_type == SystemTrayBubble::BUBBLE_TYPE_DEFAULT) 594 if (bubble_type == SystemTrayBubble::BUBBLE_TYPE_DEFAULT)
629 init_params.close_on_deactivate = !persistent; 595 init_params.close_on_deactivate = !persistent;
630 // For Volume and Brightness we don't want to show an arrow when
631 // they are shown in a bubble by themselves.
632 init_params.arrow_paint_type = views::BubbleBorder::PAINT_NORMAL;
633 if (items.size() == 1 && items[0]->ShouldHideArrow())
634 init_params.arrow_paint_type = views::BubbleBorder::PAINT_NONE;
635 SystemTrayBubble* bubble = new SystemTrayBubble(this, items, bubble_type); 596 SystemTrayBubble* bubble = new SystemTrayBubble(this, items, bubble_type);
636 597
637 system_bubble_.reset(new SystemBubbleWrapper(bubble)); 598 system_bubble_.reset(new SystemBubbleWrapper(bubble));
638 system_bubble_->InitView(this, tray_container(), &init_params, persistent); 599 system_bubble_->InitView(this, GetBubbleAnchor(), GetBubbleAnchorInsets(),
600 &init_params, persistent);
639 601
640 activation_observer_.reset(persistent ? nullptr 602 activation_observer_.reset(persistent ? nullptr
641 : new ActivationObserver(this)); 603 : new ActivationObserver(this));
642 604
643 // Record metrics for the system menu when the default view is invoked. 605 // Record metrics for the system menu when the default view is invoked.
644 if (!detailed) 606 if (!detailed)
645 RecordSystemMenuMetrics(); 607 RecordSystemMenuMetrics();
646 } 608 }
647 // Save height of default view for creating detailed views directly. 609 // Save height of default view for creating detailed views directly.
648 if (!detailed) 610 if (!detailed)
(...skipping 12 matching lines...) Expand all
661 if (!notification_bubble_) 623 if (!notification_bubble_)
662 UpdateWebNotifications(); 624 UpdateWebNotifications();
663 shelf()->UpdateAutoHideState(); 625 shelf()->UpdateAutoHideState();
664 626
665 // When we show the system menu in our alternate shelf layout, we need to 627 // When we show the system menu in our alternate shelf layout, we need to
666 // tint the background. 628 // tint the background.
667 if (full_system_tray_menu_) 629 if (full_system_tray_menu_)
668 SetIsActive(true); 630 SetIsActive(true);
669 } 631 }
670 632
633 // TODO(estade): there's only one thing that triggers a notification bubble,
634 // and that's TraySms. We could delete a lot of code in SystemTray if that
635 // used the message center notifications instead. See crbug.com/630641
671 void SystemTray::UpdateNotificationBubble() { 636 void SystemTray::UpdateNotificationBubble() {
672 // Only show the notification bubble if we have notifications. 637 // Only show the notification bubble if we have notifications.
673 if (notification_items_.empty()) { 638 if (notification_items_.empty()) {
674 DestroyNotificationBubble(); 639 DestroyNotificationBubble();
675 return; 640 return;
676 } 641 }
677 // Destroy the existing bubble before constructing a new one. 642 // Destroy the existing bubble before constructing a new one.
678 notification_bubble_.reset(); 643 notification_bubble_.reset();
679 SystemTrayBubble* notification_bubble; 644 SystemTrayBubble* notification_bubble;
680 notification_bubble = new SystemTrayBubble( 645 notification_bubble = new SystemTrayBubble(
681 this, notification_items_, SystemTrayBubble::BUBBLE_TYPE_NOTIFICATION); 646 this, notification_items_, SystemTrayBubble::BUBBLE_TYPE_NOTIFICATION);
682 views::View* anchor;
683 TrayBubbleView::AnchorType anchor_type;
684 // Tray items might want to show notifications while we are creating and 647 // Tray items might want to show notifications while we are creating and
685 // initializing the |system_bubble_| - but it might not be fully initialized 648 // initializing the |system_bubble_| - but it might not be fully initialized
686 // when coming here - this would produce a crashed like crbug.com/247416. 649 // when coming here - this would produce a crashed like crbug.com/247416.
687 // As such we check the existence of the widget here. 650 // As such we check the existence of the widget here.
651 TrayBubbleView::InitParams init_params(
652 GetAnchorAlignment(), kTrayPopupMinWidth, kTrayPopupMaxWidth);
653 views::View* anchor = GetBubbleAnchor();
654 gfx::Insets anchor_insets = GetBubbleAnchorInsets();
655 // If there's already a system menu bubble, stack this one on top.
688 if (system_bubble_.get() && system_bubble_->bubble_view() && 656 if (system_bubble_.get() && system_bubble_->bubble_view() &&
689 system_bubble_->bubble_view()->GetWidget()) { 657 system_bubble_->bubble_view()->GetWidget()) {
690 anchor = system_bubble_->bubble_view(); 658 anchor = system_bubble_->bubble_view();
691 anchor_type = TrayBubbleView::ANCHOR_TYPE_BUBBLE; 659 anchor_insets.Set(-message_center::kMarginBetweenItems, 0, 0, 0);
692 } else { 660 init_params.anchor_alignment = TrayBubbleView::ANCHOR_ALIGNMENT_BOTTOM;
693 anchor = tray_container();
694 anchor_type = TrayBubbleView::ANCHOR_TYPE_TRAY;
695 } 661 }
696 TrayBubbleView::InitParams init_params(anchor_type, GetAnchorAlignment(), 662 init_params.bg_color = kBackgroundColor;
697 kTrayPopupMinWidth,
698 kTrayPopupMaxWidth);
699 init_params.first_item_has_no_margin = true;
700 init_params.arrow_color = kBackgroundColor;
701 init_params.arrow_offset = GetTrayXOffset(notification_items_[0]);
702 notification_bubble_.reset(new SystemBubbleWrapper(notification_bubble)); 663 notification_bubble_.reset(new SystemBubbleWrapper(notification_bubble));
703 notification_bubble_->InitView(this, anchor, &init_params, false); 664 notification_bubble_->InitView(this, anchor, anchor_insets, &init_params,
665 false);
704 666
705 if (notification_bubble->bubble_view()->child_count() == 0) { 667 if (notification_bubble->bubble_view()->child_count() == 0) {
706 // It is possible that none of the items generated actual notifications. 668 // It is possible that none of the items generated actual notifications.
707 DestroyNotificationBubble(); 669 DestroyNotificationBubble();
708 return; 670 return;
709 } 671 }
710 if (hide_notifications_) 672 if (hide_notifications_)
711 notification_bubble->SetVisible(false); 673 notification_bubble->SetVisible(false);
712 else 674 else
713 UpdateWebNotifications(); 675 UpdateWebNotifications();
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
806 768
807 void SystemTray::OnMouseExitedView() { 769 void SystemTray::OnMouseExitedView() {
808 if (system_bubble_) 770 if (system_bubble_)
809 system_bubble_->bubble()->RestartAutoCloseTimer(); 771 system_bubble_->bubble()->RestartAutoCloseTimer();
810 } 772 }
811 773
812 base::string16 SystemTray::GetAccessibleNameForBubble() { 774 base::string16 SystemTray::GetAccessibleNameForBubble() {
813 return GetAccessibleNameForTray(); 775 return GetAccessibleNameForTray();
814 } 776 }
815 777
816 gfx::Rect SystemTray::GetAnchorRect(
817 views::Widget* anchor_widget,
818 TrayBubbleView::AnchorType anchor_type,
819 TrayBubbleView::AnchorAlignment anchor_alignment) const {
820 return GetBubbleAnchorRect(anchor_widget, anchor_type, anchor_alignment);
821 }
822
823 void SystemTray::OnBeforeBubbleWidgetInit( 778 void SystemTray::OnBeforeBubbleWidgetInit(
824 views::Widget* anchor_widget, 779 views::Widget* anchor_widget,
825 views::Widget* bubble_widget, 780 views::Widget* bubble_widget,
826 views::Widget::InitParams* params) const { 781 views::Widget::InitParams* params) const {
827 // Place the bubble in the same root window as |anchor_widget|. 782 // Place the bubble in the same root window as |anchor_widget|.
828 WmLookup::Get() 783 WmLookup::Get()
829 ->GetWindowForWidget(anchor_widget) 784 ->GetWindowForWidget(anchor_widget)
830 ->GetRootWindowController() 785 ->GetRootWindowController()
831 ->ConfigureWidgetInitParamsForContainer( 786 ->ConfigureWidgetInitParamsForContainer(
832 bubble_widget, kShellWindowId_SettingBubbleContainer, params); 787 bubble_widget, kShellWindowId_SettingBubbleContainer, params);
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
903 bubble_view->set_can_activate(true); 858 bubble_view->set_can_activate(true);
904 bubble_view->GetWidget()->Activate(); 859 bubble_view->GetWidget()->Activate();
905 } 860 }
906 861
907 bool SystemTray::PerformAction(const ui::Event& event) { 862 bool SystemTray::PerformAction(const ui::Event& event) {
908 // If we're already showing the default view, hide it; otherwise, show it 863 // If we're already showing the default view, hide it; otherwise, show it
909 // (and hide any popup that's currently shown). 864 // (and hide any popup that's currently shown).
910 if (HasSystemBubbleType(SystemTrayBubble::BUBBLE_TYPE_DEFAULT)) { 865 if (HasSystemBubbleType(SystemTrayBubble::BUBBLE_TYPE_DEFAULT)) {
911 system_bubble_->bubble()->Close(); 866 system_bubble_->bubble()->Close();
912 } else { 867 } else {
913 int arrow_offset = TrayBubbleView::InitParams::kArrowDefaultOffset; 868 ShowDefaultView(BUBBLE_CREATE_NEW);
914 if (event.IsMouseEvent() || event.type() == ui::ET_GESTURE_TAP) {
915 const ui::LocatedEvent& located_event =
916 static_cast<const ui::LocatedEvent&>(event);
917 if (IsHorizontalAlignment(shelf_alignment())) {
918 gfx::Point point(located_event.x(), 0);
919 ConvertPointToWidget(this, &point);
920 arrow_offset = point.x();
921 }
922 }
923 ShowDefaultViewWithOffset(BUBBLE_CREATE_NEW, arrow_offset, false);
924 if (event.IsKeyEvent() || (event.flags() & ui::EF_TOUCH_ACCESSIBILITY)) 869 if (event.IsKeyEvent() || (event.flags() & ui::EF_TOUCH_ACCESSIBILITY))
925 ActivateBubble(); 870 ActivateBubble();
926 } 871 }
927 return true; 872 return true;
928 } 873 }
929 874
930 void SystemTray::CloseSystemBubbleAndDeactivateSystemTray() { 875 void SystemTray::CloseSystemBubbleAndDeactivateSystemTray() {
931 CHECK(!activating_); 876 CHECK(!activating_);
932 activation_observer_.reset(); 877 activation_observer_.reset();
933 key_event_watcher_.reset(); 878 key_event_watcher_.reset();
(...skipping 27 matching lines...) Expand all
961 .work_area() 906 .work_area()
962 .height(); 907 .height();
963 if (work_area_height > 0) { 908 if (work_area_height > 0) {
964 UMA_HISTOGRAM_CUSTOM_COUNTS( 909 UMA_HISTOGRAM_CUSTOM_COUNTS(
965 "Ash.SystemMenu.PercentageOfWorkAreaHeightCoveredByMenu", 910 "Ash.SystemMenu.PercentageOfWorkAreaHeightCoveredByMenu",
966 100 * bubble_view->height() / work_area_height, 1, 300, 100); 911 100 * bubble_view->height() / work_area_height, 1, 300, 100);
967 } 912 }
968 } 913 }
969 914
970 } // namespace ash 915 } // namespace ash
OLDNEW
« no previous file with comments | « ash/common/system/tray/system_tray.h ('k') | ash/common/system/tray/system_tray_bubble.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698