| OLD | NEW |
| 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/system/tray/system_tray.h" | 5 #include "ash/system/tray/system_tray.h" |
| 6 | 6 |
| 7 #include "ash/common/ash_switches.h" | 7 #include "ash/common/ash_switches.h" |
| 8 #include "ash/common/login_status.h" | 8 #include "ash/common/login_status.h" |
| 9 #include "ash/common/session/session_state_delegate.h" | 9 #include "ash/common/session/session_state_delegate.h" |
| 10 #include "ash/common/shelf/wm_shelf.h" | 10 #include "ash/common/shelf/wm_shelf.h" |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 void InitView(TrayBackgroundView* tray, | 89 void InitView(TrayBackgroundView* tray, |
| 90 views::View* anchor, | 90 views::View* anchor, |
| 91 TrayBubbleView::InitParams* init_params, | 91 TrayBubbleView::InitParams* init_params, |
| 92 bool is_persistent) { | 92 bool is_persistent) { |
| 93 DCHECK(anchor); | 93 DCHECK(anchor); |
| 94 LoginStatus login_status = | 94 LoginStatus login_status = |
| 95 WmShell::Get()->system_tray_delegate()->GetUserLoginStatus(); | 95 WmShell::Get()->system_tray_delegate()->GetUserLoginStatus(); |
| 96 bubble_->InitView(anchor, login_status, init_params); | 96 bubble_->InitView(anchor, login_status, init_params); |
| 97 bubble_wrapper_.reset(new TrayBubbleWrapper(tray, bubble_->bubble_view())); | 97 bubble_wrapper_.reset(new TrayBubbleWrapper(tray, bubble_->bubble_view())); |
| 98 // The system bubble should not have an arrow. | 98 // The system bubble should not have an arrow. |
| 99 bubble_->bubble_view()->SetArrowPaintType( | 99 bubble_->bubble_view()->SetArrowPaintType(views::BubbleBorder::PAINT_NONE); |
| 100 views::BubbleBorder::PAINT_NONE); | |
| 101 is_persistent_ = is_persistent; | 100 is_persistent_ = is_persistent; |
| 102 | 101 |
| 103 // If ChromeVox is enabled, focus the default item if no item is focused and | 102 // If ChromeVox is enabled, focus the default item if no item is focused and |
| 104 // there isn't a delayed close. | 103 // there isn't a delayed close. |
| 105 if (Shell::GetInstance() | 104 if (Shell::GetInstance() |
| 106 ->accessibility_delegate() | 105 ->accessibility_delegate() |
| 107 ->IsSpokenFeedbackEnabled() && | 106 ->IsSpokenFeedbackEnabled() && |
| 108 !is_persistent) { | 107 !is_persistent) { |
| 109 bubble_->FocusDefaultIfNeeded(); | 108 bubble_->FocusDefaultIfNeeded(); |
| 110 } | 109 } |
| 111 } | 110 } |
| 112 | 111 |
| 113 // Convenience accessors: | 112 // Convenience accessors: |
| 114 SystemTrayBubble* bubble() const { return bubble_.get(); } | 113 SystemTrayBubble* bubble() const { return bubble_.get(); } |
| 115 SystemTrayBubble::BubbleType bubble_type() const { | 114 SystemTrayBubble::BubbleType bubble_type() const { |
| 116 return bubble_->bubble_type(); | 115 return bubble_->bubble_type(); |
| 117 } | 116 } |
| 118 TrayBubbleView* bubble_view() const { return bubble_->bubble_view(); } | 117 TrayBubbleView* bubble_view() const { return bubble_->bubble_view(); } |
| 119 bool is_persistent() const { return is_persistent_; } | 118 bool is_persistent() const { return is_persistent_; } |
| 120 | 119 |
| 121 private: | 120 private: |
| 122 std::unique_ptr<SystemTrayBubble> bubble_; | 121 std::unique_ptr<SystemTrayBubble> bubble_; |
| 123 std::unique_ptr<TrayBubbleWrapper> bubble_wrapper_; | 122 std::unique_ptr<TrayBubbleWrapper> bubble_wrapper_; |
| 124 bool is_persistent_; | 123 bool is_persistent_; |
| 125 | 124 |
| 126 DISALLOW_COPY_AND_ASSIGN(SystemBubbleWrapper); | 125 DISALLOW_COPY_AND_ASSIGN(SystemBubbleWrapper); |
| 127 }; | 126 }; |
| 128 | 127 |
| 129 | |
| 130 // SystemTray | 128 // SystemTray |
| 131 | 129 |
| 132 SystemTray::SystemTray(StatusAreaWidget* status_area_widget) | 130 SystemTray::SystemTray(StatusAreaWidget* status_area_widget) |
| 133 : TrayBackgroundView(status_area_widget->wm_shelf()), | 131 : TrayBackgroundView(status_area_widget->wm_shelf()), |
| 134 status_area_widget_(status_area_widget), | 132 status_area_widget_(status_area_widget), |
| 135 items_(), | 133 items_(), |
| 136 detailed_item_(nullptr), | 134 detailed_item_(nullptr), |
| 137 default_bubble_height_(0), | 135 default_bubble_height_(0), |
| 138 hide_notifications_(false), | 136 hide_notifications_(false), |
| 139 full_system_tray_menu_(false), | 137 full_system_tray_menu_(false), |
| 140 tray_accessibility_(nullptr), | 138 tray_accessibility_(nullptr), |
| 141 tray_cast_(nullptr), | 139 tray_cast_(nullptr), |
| 142 tray_date_(nullptr), | 140 tray_date_(nullptr), |
| 143 tray_update_(nullptr), | 141 tray_update_(nullptr), |
| 144 screen_capture_tray_item_(nullptr), | 142 screen_capture_tray_item_(nullptr), |
| 145 screen_share_tray_item_(nullptr) { | 143 screen_share_tray_item_(nullptr) { |
| 146 DCHECK(status_area_widget_); | 144 DCHECK(status_area_widget_); |
| 147 SetContentsBackground(); | 145 SetContentsBackground(); |
| 148 } | 146 } |
| 149 | 147 |
| 150 SystemTray::~SystemTray() { | 148 SystemTray::~SystemTray() { |
| 151 // Destroy any child views that might have back pointers before ~View(). | 149 // Destroy any child views that might have back pointers before ~View(). |
| 152 system_bubble_.reset(); | 150 system_bubble_.reset(); |
| 153 notification_bubble_.reset(); | 151 notification_bubble_.reset(); |
| 154 for (std::vector<SystemTrayItem*>::iterator it = items_.begin(); | 152 for (std::vector<SystemTrayItem*>::iterator it = items_.begin(); |
| 155 it != items_.end(); | 153 it != items_.end(); ++it) { |
| 156 ++it) { | |
| 157 (*it)->DestroyTrayView(); | 154 (*it)->DestroyTrayView(); |
| 158 } | 155 } |
| 159 } | 156 } |
| 160 | 157 |
| 161 void SystemTray::InitializeTrayItems(SystemTrayDelegate* delegate) { | 158 void SystemTray::InitializeTrayItems(SystemTrayDelegate* delegate) { |
| 162 TrayBackgroundView::Initialize(); | 159 TrayBackgroundView::Initialize(); |
| 163 CreateItems(delegate); | 160 CreateItems(delegate); |
| 164 } | 161 } |
| 165 | 162 |
| 166 void SystemTray::CreateItems(SystemTrayDelegate* delegate) { | 163 void SystemTray::CreateItems(SystemTrayDelegate* delegate) { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 void SystemTray::RemoveTrayItem(SystemTrayItem* item) { | 233 void SystemTray::RemoveTrayItem(SystemTrayItem* item) { |
| 237 NOTIMPLEMENTED(); | 234 NOTIMPLEMENTED(); |
| 238 } | 235 } |
| 239 | 236 |
| 240 const std::vector<SystemTrayItem*>& SystemTray::GetTrayItems() const { | 237 const std::vector<SystemTrayItem*>& SystemTray::GetTrayItems() const { |
| 241 return items_.get(); | 238 return items_.get(); |
| 242 } | 239 } |
| 243 | 240 |
| 244 void SystemTray::ShowDefaultView(BubbleCreationType creation_type) { | 241 void SystemTray::ShowDefaultView(BubbleCreationType creation_type) { |
| 245 ShowDefaultViewWithOffset( | 242 ShowDefaultViewWithOffset( |
| 246 creation_type, | 243 creation_type, TrayBubbleView::InitParams::kArrowDefaultOffset, false); |
| 247 TrayBubbleView::InitParams::kArrowDefaultOffset, | |
| 248 false); | |
| 249 } | 244 } |
| 250 | 245 |
| 251 void SystemTray::ShowPersistentDefaultView() { | 246 void SystemTray::ShowPersistentDefaultView() { |
| 252 ShowItems(items_.get(), | 247 ShowItems(items_.get(), false, false, BUBBLE_CREATE_NEW, |
| 253 false, | 248 TrayBubbleView::InitParams::kArrowDefaultOffset, true); |
| 254 false, | |
| 255 BUBBLE_CREATE_NEW, | |
| 256 TrayBubbleView::InitParams::kArrowDefaultOffset, | |
| 257 true); | |
| 258 } | 249 } |
| 259 | 250 |
| 260 void SystemTray::ShowDetailedView(SystemTrayItem* item, | 251 void SystemTray::ShowDetailedView(SystemTrayItem* item, |
| 261 int close_delay, | 252 int close_delay, |
| 262 bool activate, | 253 bool activate, |
| 263 BubbleCreationType creation_type) { | 254 BubbleCreationType creation_type) { |
| 264 std::vector<SystemTrayItem*> items; | 255 std::vector<SystemTrayItem*> items; |
| 265 // The detailed view with timeout means a UI to show the current system state, | 256 // The detailed view with timeout means a UI to show the current system state, |
| 266 // like the audio level or brightness. Such UI should behave as persistent and | 257 // like the audio level or brightness. Such UI should behave as persistent and |
| 267 // keep its own logic for the appearance. | 258 // keep its own logic for the appearance. |
| 268 bool persistent = ( | 259 bool persistent = |
| 269 !activate && close_delay > 0 && creation_type == BUBBLE_CREATE_NEW); | 260 (!activate && close_delay > 0 && creation_type == BUBBLE_CREATE_NEW); |
| 270 items.push_back(item); | 261 items.push_back(item); |
| 271 ShowItems( | 262 ShowItems(items, true, activate, creation_type, GetTrayXOffset(item), |
| 272 items, true, activate, creation_type, GetTrayXOffset(item), persistent); | 263 persistent); |
| 273 if (system_bubble_) | 264 if (system_bubble_) |
| 274 system_bubble_->bubble()->StartAutoCloseTimer(close_delay); | 265 system_bubble_->bubble()->StartAutoCloseTimer(close_delay); |
| 275 } | 266 } |
| 276 | 267 |
| 277 void SystemTray::SetDetailedViewCloseDelay(int close_delay) { | 268 void SystemTray::SetDetailedViewCloseDelay(int close_delay) { |
| 278 if (HasSystemBubbleType(SystemTrayBubble::BUBBLE_TYPE_DETAILED)) | 269 if (HasSystemBubbleType(SystemTrayBubble::BUBBLE_TYPE_DETAILED)) |
| 279 system_bubble_->bubble()->StartAutoCloseTimer(close_delay); | 270 system_bubble_->bubble()->StartAutoCloseTimer(close_delay); |
| 280 } | 271 } |
| 281 | 272 |
| 282 void SystemTray::HideDetailedView(SystemTrayItem* item) { | 273 void SystemTray::HideDetailedView(SystemTrayItem* item) { |
| 283 if (item != detailed_item_) | 274 if (item != detailed_item_) |
| 284 return; | 275 return; |
| 285 DestroySystemBubble(); | 276 DestroySystemBubble(); |
| 286 UpdateNotificationBubble(); | 277 UpdateNotificationBubble(); |
| 287 } | 278 } |
| 288 | 279 |
| 289 void SystemTray::ShowNotificationView(SystemTrayItem* item) { | 280 void SystemTray::ShowNotificationView(SystemTrayItem* item) { |
| 290 if (std::find(notification_items_.begin(), notification_items_.end(), item) | 281 if (std::find(notification_items_.begin(), notification_items_.end(), item) != |
| 291 != notification_items_.end()) | 282 notification_items_.end()) |
| 292 return; | 283 return; |
| 293 notification_items_.push_back(item); | 284 notification_items_.push_back(item); |
| 294 UpdateNotificationBubble(); | 285 UpdateNotificationBubble(); |
| 295 } | 286 } |
| 296 | 287 |
| 297 void SystemTray::HideNotificationView(SystemTrayItem* item) { | 288 void SystemTray::HideNotificationView(SystemTrayItem* item) { |
| 298 std::vector<SystemTrayItem*>::iterator found_iter = | 289 std::vector<SystemTrayItem*>::iterator found_iter = |
| 299 std::find(notification_items_.begin(), notification_items_.end(), item); | 290 std::find(notification_items_.begin(), notification_items_.end(), item); |
| 300 if (found_iter == notification_items_.end()) | 291 if (found_iter == notification_items_.end()) |
| 301 return; | 292 return; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 return notification_bubble_.get() != NULL; | 335 return notification_bubble_.get() != NULL; |
| 345 } | 336 } |
| 346 | 337 |
| 347 SystemTrayBubble* SystemTray::GetSystemBubble() { | 338 SystemTrayBubble* SystemTray::GetSystemBubble() { |
| 348 if (!system_bubble_) | 339 if (!system_bubble_) |
| 349 return NULL; | 340 return NULL; |
| 350 return system_bubble_->bubble(); | 341 return system_bubble_->bubble(); |
| 351 } | 342 } |
| 352 | 343 |
| 353 bool SystemTray::IsAnyBubbleVisible() const { | 344 bool SystemTray::IsAnyBubbleVisible() const { |
| 354 return ((system_bubble_.get() && | 345 return ((system_bubble_.get() && system_bubble_->bubble()->IsVisible()) || |
| 355 system_bubble_->bubble()->IsVisible()) || | |
| 356 (notification_bubble_.get() && | 346 (notification_bubble_.get() && |
| 357 notification_bubble_->bubble()->IsVisible())); | 347 notification_bubble_->bubble()->IsVisible())); |
| 358 } | 348 } |
| 359 | 349 |
| 360 bool SystemTray::IsMouseInNotificationBubble() const { | 350 bool SystemTray::IsMouseInNotificationBubble() const { |
| 361 if (!notification_bubble_) | 351 if (!notification_bubble_) |
| 362 return false; | 352 return false; |
| 363 return notification_bubble_->bubble_view()->GetBoundsInScreen().Contains( | 353 return notification_bubble_->bubble_view()->GetBoundsInScreen().Contains( |
| 364 display::Screen::GetScreen()->GetCursorScreenPoint()); | 354 display::Screen::GetScreen()->GetCursorScreenPoint()); |
| 365 } | 355 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 UpdateWebNotifications(); | 391 UpdateWebNotifications(); |
| 402 } | 392 } |
| 403 } | 393 } |
| 404 | 394 |
| 405 base::string16 SystemTray::GetAccessibleNameForTray() { | 395 base::string16 SystemTray::GetAccessibleNameForTray() { |
| 406 base::string16 time = GetAccessibleTimeString(base::Time::Now()); | 396 base::string16 time = GetAccessibleTimeString(base::Time::Now()); |
| 407 base::string16 battery = base::ASCIIToUTF16(""); | 397 base::string16 battery = base::ASCIIToUTF16(""); |
| 408 #if defined(OS_CHROMEOS) | 398 #if defined(OS_CHROMEOS) |
| 409 battery = PowerStatus::Get()->GetAccessibleNameString(false); | 399 battery = PowerStatus::Get()->GetAccessibleNameString(false); |
| 410 #endif | 400 #endif |
| 411 return l10n_util::GetStringFUTF16( | 401 return l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_ACCESSIBLE_DESCRIPTION, |
| 412 IDS_ASH_STATUS_TRAY_ACCESSIBLE_DESCRIPTION, time, battery); | 402 time, battery); |
| 413 } | 403 } |
| 414 | 404 |
| 415 int SystemTray::GetTrayXOffset(SystemTrayItem* item) const { | 405 int SystemTray::GetTrayXOffset(SystemTrayItem* item) const { |
| 416 // Don't attempt to align the arrow if the shelf is on the left or right. | 406 // Don't attempt to align the arrow if the shelf is on the left or right. |
| 417 if (!IsHorizontalAlignment(shelf_alignment())) | 407 if (!IsHorizontalAlignment(shelf_alignment())) |
| 418 return TrayBubbleView::InitParams::kArrowDefaultOffset; | 408 return TrayBubbleView::InitParams::kArrowDefaultOffset; |
| 419 | 409 |
| 420 std::map<SystemTrayItem*, views::View*>::const_iterator it = | 410 std::map<SystemTrayItem*, views::View*>::const_iterator it = |
| 421 tray_item_map_.find(item); | 411 tray_item_map_.find(item); |
| 422 if (it == tray_item_map_.end()) | 412 if (it == tray_item_map_.end()) |
| (...skipping 25 matching lines...) Expand all Loading... |
| 448 BubbleCreationType creation_type, | 438 BubbleCreationType creation_type, |
| 449 int arrow_offset, | 439 int arrow_offset, |
| 450 bool persistent) { | 440 bool persistent) { |
| 451 // No system tray bubbles in kiosk mode. | 441 // No system tray bubbles in kiosk mode. |
| 452 if (WmShell::Get()->system_tray_delegate()->GetUserLoginStatus() == | 442 if (WmShell::Get()->system_tray_delegate()->GetUserLoginStatus() == |
| 453 LoginStatus::KIOSK_APP) { | 443 LoginStatus::KIOSK_APP) { |
| 454 return; | 444 return; |
| 455 } | 445 } |
| 456 | 446 |
| 457 // Destroy any existing bubble and create a new one. | 447 // Destroy any existing bubble and create a new one. |
| 458 SystemTrayBubble::BubbleType bubble_type = detailed ? | 448 SystemTrayBubble::BubbleType bubble_type = |
| 459 SystemTrayBubble::BUBBLE_TYPE_DETAILED : | 449 detailed ? SystemTrayBubble::BUBBLE_TYPE_DETAILED |
| 460 SystemTrayBubble::BUBBLE_TYPE_DEFAULT; | 450 : SystemTrayBubble::BUBBLE_TYPE_DEFAULT; |
| 461 | 451 |
| 462 // Destroy the notification bubble here so that it doesn't get rebuilt | 452 // Destroy the notification bubble here so that it doesn't get rebuilt |
| 463 // while we add items to the main bubble_ (e.g. in HideNotificationView). | 453 // while we add items to the main bubble_ (e.g. in HideNotificationView). |
| 464 notification_bubble_.reset(); | 454 notification_bubble_.reset(); |
| 465 if (system_bubble_.get() && creation_type == BUBBLE_USE_EXISTING) { | 455 if (system_bubble_.get() && creation_type == BUBBLE_USE_EXISTING) { |
| 466 system_bubble_->bubble()->UpdateView(items, bubble_type); | 456 system_bubble_->bubble()->UpdateView(items, bubble_type); |
| 467 // If ChromeVox is enabled, focus the default item if no item is focused. | 457 // If ChromeVox is enabled, focus the default item if no item is focused. |
| 468 if (Shell::GetInstance()->accessibility_delegate()-> | 458 if (Shell::GetInstance() |
| 469 IsSpokenFeedbackEnabled()) { | 459 ->accessibility_delegate() |
| 460 ->IsSpokenFeedbackEnabled()) { |
| 470 system_bubble_->bubble()->FocusDefaultIfNeeded(); | 461 system_bubble_->bubble()->FocusDefaultIfNeeded(); |
| 471 } | 462 } |
| 472 } else { | 463 } else { |
| 473 // Cleanup the existing bubble before showing a new one. Otherwise, it's | 464 // Cleanup the existing bubble before showing a new one. Otherwise, it's |
| 474 // possible to confuse the new system bubble with the old one during | 465 // possible to confuse the new system bubble with the old one during |
| 475 // destruction, leading to subtle errors/crashes such as crbug.com/545166. | 466 // destruction, leading to subtle errors/crashes such as crbug.com/545166. |
| 476 DestroySystemBubble(); | 467 DestroySystemBubble(); |
| 477 | 468 |
| 478 // Remember if the menu is a single property (like e.g. volume) or the | 469 // Remember if the menu is a single property (like e.g. volume) or the |
| 479 // full tray menu. Note that in case of the |BUBBLE_USE_EXISTING| case | 470 // full tray menu. Note that in case of the |BUBBLE_USE_EXISTING| case |
| 480 // above, |full_system_tray_menu_| does not get changed since the fact that | 471 // above, |full_system_tray_menu_| does not get changed since the fact that |
| 481 // the menu is full (or not) doesn't change even if a "single property" | 472 // the menu is full (or not) doesn't change even if a "single property" |
| 482 // (like network) replaces most of the menu. | 473 // (like network) replaces most of the menu. |
| 483 full_system_tray_menu_ = items.size() > 1; | 474 full_system_tray_menu_ = items.size() > 1; |
| 484 // The menu width is fixed, and it is a per language setting. | 475 // The menu width is fixed, and it is a per language setting. |
| 485 int menu_width = std::max( | 476 int menu_width = std::max( |
| 486 kMinimumSystemTrayMenuWidth, | 477 kMinimumSystemTrayMenuWidth, |
| 487 WmShell::Get()->system_tray_delegate()->GetSystemTrayMenuWidth()); | 478 WmShell::Get()->system_tray_delegate()->GetSystemTrayMenuWidth()); |
| 488 | 479 |
| 489 TrayBubbleView::InitParams init_params(TrayBubbleView::ANCHOR_TYPE_TRAY, | 480 TrayBubbleView::InitParams init_params(TrayBubbleView::ANCHOR_TYPE_TRAY, |
| 490 GetAnchorAlignment(), | 481 GetAnchorAlignment(), menu_width, |
| 491 menu_width, | |
| 492 kTrayPopupMaxWidth); | 482 kTrayPopupMaxWidth); |
| 493 init_params.can_activate = can_activate; | 483 init_params.can_activate = can_activate; |
| 494 init_params.first_item_has_no_margin = true; | 484 init_params.first_item_has_no_margin = true; |
| 495 if (detailed) { | 485 if (detailed) { |
| 496 // This is the case where a volume control or brightness control bubble | 486 // This is the case where a volume control or brightness control bubble |
| 497 // is created. | 487 // is created. |
| 498 init_params.max_height = default_bubble_height_; | 488 init_params.max_height = default_bubble_height_; |
| 499 init_params.arrow_color = kBackgroundColor; | 489 init_params.arrow_color = kBackgroundColor; |
| 500 } else { | 490 } else { |
| 501 init_params.arrow_color = kHeaderBackgroundColor; | 491 init_params.arrow_color = kHeaderBackgroundColor; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 notification_bubble_.reset(); | 537 notification_bubble_.reset(); |
| 548 SystemTrayBubble* notification_bubble; | 538 SystemTrayBubble* notification_bubble; |
| 549 notification_bubble = new SystemTrayBubble( | 539 notification_bubble = new SystemTrayBubble( |
| 550 this, notification_items_, SystemTrayBubble::BUBBLE_TYPE_NOTIFICATION); | 540 this, notification_items_, SystemTrayBubble::BUBBLE_TYPE_NOTIFICATION); |
| 551 views::View* anchor; | 541 views::View* anchor; |
| 552 TrayBubbleView::AnchorType anchor_type; | 542 TrayBubbleView::AnchorType anchor_type; |
| 553 // Tray items might want to show notifications while we are creating and | 543 // Tray items might want to show notifications while we are creating and |
| 554 // initializing the |system_bubble_| - but it might not be fully initialized | 544 // initializing the |system_bubble_| - but it might not be fully initialized |
| 555 // when coming here - this would produce a crashed like crbug.com/247416. | 545 // when coming here - this would produce a crashed like crbug.com/247416. |
| 556 // As such we check the existence of the widget here. | 546 // As such we check the existence of the widget here. |
| 557 if (system_bubble_.get() && | 547 if (system_bubble_.get() && system_bubble_->bubble_view() && |
| 558 system_bubble_->bubble_view() && | |
| 559 system_bubble_->bubble_view()->GetWidget()) { | 548 system_bubble_->bubble_view()->GetWidget()) { |
| 560 anchor = system_bubble_->bubble_view(); | 549 anchor = system_bubble_->bubble_view(); |
| 561 anchor_type = TrayBubbleView::ANCHOR_TYPE_BUBBLE; | 550 anchor_type = TrayBubbleView::ANCHOR_TYPE_BUBBLE; |
| 562 } else { | 551 } else { |
| 563 anchor = tray_container(); | 552 anchor = tray_container(); |
| 564 anchor_type = TrayBubbleView::ANCHOR_TYPE_TRAY; | 553 anchor_type = TrayBubbleView::ANCHOR_TYPE_TRAY; |
| 565 } | 554 } |
| 566 TrayBubbleView::InitParams init_params(anchor_type, | 555 TrayBubbleView::InitParams init_params(anchor_type, GetAnchorAlignment(), |
| 567 GetAnchorAlignment(), | |
| 568 kTrayPopupMinWidth, | 556 kTrayPopupMinWidth, |
| 569 kTrayPopupMaxWidth); | 557 kTrayPopupMaxWidth); |
| 570 init_params.first_item_has_no_margin = true; | 558 init_params.first_item_has_no_margin = true; |
| 571 init_params.arrow_color = kBackgroundColor; | 559 init_params.arrow_color = kBackgroundColor; |
| 572 init_params.arrow_offset = GetTrayXOffset(notification_items_[0]); | 560 init_params.arrow_offset = GetTrayXOffset(notification_items_[0]); |
| 573 notification_bubble_.reset(new SystemBubbleWrapper(notification_bubble)); | 561 notification_bubble_.reset(new SystemBubbleWrapper(notification_bubble)); |
| 574 notification_bubble_->InitView(this, anchor, &init_params, false); | 562 notification_bubble_->InitView(this, anchor, &init_params, false); |
| 575 | 563 |
| 576 if (notification_bubble->bubble_view()->child_count() == 0) { | 564 if (notification_bubble->bubble_view()->child_count() == 0) { |
| 577 // It is possible that none of the items generated actual notifications. | 565 // It is possible that none of the items generated actual notifications. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 600 height = | 588 height = |
| 601 std::max(0, work_area.height() - bubble_view->GetBoundsInScreen().y()); | 589 std::max(0, work_area.height() - bubble_view->GetBoundsInScreen().y()); |
| 602 } | 590 } |
| 603 status_area_widget_->web_notification_tray()->SetSystemTrayHeight(height); | 591 status_area_widget_->web_notification_tray()->SetSystemTrayHeight(height); |
| 604 } | 592 } |
| 605 | 593 |
| 606 base::string16 SystemTray::GetAccessibleTimeString( | 594 base::string16 SystemTray::GetAccessibleTimeString( |
| 607 const base::Time& now) const { | 595 const base::Time& now) const { |
| 608 base::HourClockType hour_type = | 596 base::HourClockType hour_type = |
| 609 WmShell::Get()->system_tray_delegate()->GetHourClockType(); | 597 WmShell::Get()->system_tray_delegate()->GetHourClockType(); |
| 610 return base::TimeFormatTimeOfDayWithHourClockType( | 598 return base::TimeFormatTimeOfDayWithHourClockType(now, hour_type, |
| 611 now, hour_type, base::kKeepAmPm); | 599 base::kKeepAmPm); |
| 612 } | 600 } |
| 613 | 601 |
| 614 void SystemTray::SetShelfAlignment(ShelfAlignment alignment) { | 602 void SystemTray::SetShelfAlignment(ShelfAlignment alignment) { |
| 615 if (alignment == shelf_alignment()) | 603 if (alignment == shelf_alignment()) |
| 616 return; | 604 return; |
| 617 TrayBackgroundView::SetShelfAlignment(alignment); | 605 TrayBackgroundView::SetShelfAlignment(alignment); |
| 618 UpdateAfterShelfAlignmentChange(alignment); | 606 UpdateAfterShelfAlignmentChange(alignment); |
| 619 // Destroy any existing bubble so that it is rebuilt correctly. | 607 // Destroy any existing bubble so that it is rebuilt correctly. |
| 620 CloseSystemBubbleAndDeactivateSystemTray(); | 608 CloseSystemBubbleAndDeactivateSystemTray(); |
| 621 // Rebuild any notification bubble. | 609 // Rebuild any notification bubble. |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 705 void SystemTray::HideBubble(const TrayBubbleView* bubble_view) { | 693 void SystemTray::HideBubble(const TrayBubbleView* bubble_view) { |
| 706 HideBubbleWithView(bubble_view); | 694 HideBubbleWithView(bubble_view); |
| 707 } | 695 } |
| 708 | 696 |
| 709 views::View* SystemTray::GetTrayItemViewForTest(SystemTrayItem* item) { | 697 views::View* SystemTray::GetTrayItemViewForTest(SystemTrayItem* item) { |
| 710 std::map<SystemTrayItem*, views::View*>::iterator it = | 698 std::map<SystemTrayItem*, views::View*>::iterator it = |
| 711 tray_item_map_.find(item); | 699 tray_item_map_.find(item); |
| 712 return it == tray_item_map_.end() ? NULL : it->second; | 700 return it == tray_item_map_.end() ? NULL : it->second; |
| 713 } | 701 } |
| 714 | 702 |
| 715 TrayCast* SystemTray::GetTrayCastForTesting() const { return tray_cast_; } | 703 TrayCast* SystemTray::GetTrayCastForTesting() const { |
| 704 return tray_cast_; |
| 705 } |
| 716 | 706 |
| 717 TrayDate* SystemTray::GetTrayDateForTesting() const { return tray_date_; } | 707 TrayDate* SystemTray::GetTrayDateForTesting() const { |
| 708 return tray_date_; |
| 709 } |
| 718 | 710 |
| 719 TrayUpdate* SystemTray::GetTrayUpdateForTesting() const { | 711 TrayUpdate* SystemTray::GetTrayUpdateForTesting() const { |
| 720 return tray_update_; | 712 return tray_update_; |
| 721 } | 713 } |
| 722 | 714 |
| 723 bool SystemTray::PerformAction(const ui::Event& event) { | 715 bool SystemTray::PerformAction(const ui::Event& event) { |
| 724 // If we're already showing the default view, hide it; otherwise, show it | 716 // If we're already showing the default view, hide it; otherwise, show it |
| 725 // (and hide any popup that's currently shown). | 717 // (and hide any popup that's currently shown). |
| 726 if (HasSystemBubbleType(SystemTrayBubble::BUBBLE_TYPE_DEFAULT)) { | 718 if (HasSystemBubbleType(SystemTrayBubble::BUBBLE_TYPE_DEFAULT)) { |
| 727 system_bubble_->bubble()->Close(); | 719 system_bubble_->bubble()->Close(); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 770 .work_area() | 762 .work_area() |
| 771 .height(); | 763 .height(); |
| 772 if (work_area_height > 0) { | 764 if (work_area_height > 0) { |
| 773 UMA_HISTOGRAM_CUSTOM_COUNTS( | 765 UMA_HISTOGRAM_CUSTOM_COUNTS( |
| 774 "Ash.SystemMenu.PercentageOfWorkAreaHeightCoveredByMenu", | 766 "Ash.SystemMenu.PercentageOfWorkAreaHeightCoveredByMenu", |
| 775 100 * bubble_view->height() / work_area_height, 1, 300, 100); | 767 100 * bubble_view->height() / work_area_height, 1, 300, 100); |
| 776 } | 768 } |
| 777 } | 769 } |
| 778 | 770 |
| 779 } // namespace ash | 771 } // namespace ash |
| OLD | NEW |