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

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

Issue 10407080: Add NetworkNotificationView to tray_network. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix NOTREACHED Created 8 years, 7 months 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 | Annotate | Revision Log
« no previous file with comments | « ash/system/tray/system_tray.h ('k') | ash/system/tray/system_tray_bubble.h » ('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/system/tray/system_tray.h" 5 #include "ash/system/tray/system_tray.h"
6 6
7 #include "ash/shell.h" 7 #include "ash/shell.h"
8 #include "ash/shell/panel_window.h" 8 #include "ash/shell/panel_window.h"
9 #include "ash/shell_window_ids.h" 9 #include "ash/shell_window_ids.h"
10 #include "ash/system/audio/tray_volume.h" 10 #include "ash/system/audio/tray_volume.h"
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 ime_observer_(NULL), 170 ime_observer_(NULL),
171 locale_observer_(NULL), 171 locale_observer_(NULL),
172 network_observer_(NULL), 172 network_observer_(NULL),
173 power_status_observer_(NULL), 173 power_status_observer_(NULL),
174 update_observer_(NULL), 174 update_observer_(NULL),
175 user_observer_(NULL), 175 user_observer_(NULL),
176 widget_(NULL), 176 widget_(NULL),
177 background_(new internal::SystemTrayBackground), 177 background_(new internal::SystemTrayBackground),
178 should_show_launcher_(false), 178 should_show_launcher_(false),
179 shelf_alignment_(SHELF_ALIGNMENT_BOTTOM), 179 shelf_alignment_(SHELF_ALIGNMENT_BOTTOM),
180 ALLOW_THIS_IN_INITIALIZER_LIST(hide_background_animator_(this, 180 ALLOW_THIS_IN_INITIALIZER_LIST(hide_background_animator_(
181 0, kTrayBackgroundAlpha)), 181 this, 0, kTrayBackgroundAlpha)),
182 ALLOW_THIS_IN_INITIALIZER_LIST(hover_background_animator_(this, 182 ALLOW_THIS_IN_INITIALIZER_LIST(hover_background_animator_(
183 0, kTrayBackgroundHoverAlpha - kTrayBackgroundAlpha)) { 183 this, 0, kTrayBackgroundHoverAlpha - kTrayBackgroundAlpha)),
184 default_bubble_height_(0) {
184 tray_container_ = new internal::SystemTrayContainer; 185 tray_container_ = new internal::SystemTrayContainer;
185 tray_container_->SetLayoutManager(new views::BoxLayout( 186 tray_container_->SetLayoutManager(new views::BoxLayout(
186 views::BoxLayout::kHorizontal, 0, 0, 0)); 187 views::BoxLayout::kHorizontal, 0, 0, 0));
187 tray_container_->set_background(background_); 188 tray_container_->set_background(background_);
188 tray_container_->set_border( 189 tray_container_->set_border(
189 views::Border::CreateEmptyBorder(1, 1, 1, 1)); 190 views::Border::CreateEmptyBorder(1, 1, 1, 1));
190 set_border(views::Border::CreateEmptyBorder(0, 0, 191 set_border(views::Border::CreateEmptyBorder(0, 0,
191 kPaddingFromBottomOfScreenBottomAlignment, 192 kPaddingFromBottomOfScreenBottomAlignment,
192 kPaddingFromRightEdgeOfScreenBottomAlignment)); 193 kPaddingFromRightEdgeOfScreenBottomAlignment));
193 set_notify_enter_exit_on_child(true); 194 set_notify_enter_exit_on_child(true);
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 317
317 void SystemTray::SetDetailedViewCloseDelay(int close_delay) { 318 void SystemTray::SetDetailedViewCloseDelay(int close_delay) {
318 if (bubble_.get() && 319 if (bubble_.get() &&
319 bubble_->bubble_type() == SystemTrayBubble::BUBBLE_TYPE_DETAILED) 320 bubble_->bubble_type() == SystemTrayBubble::BUBBLE_TYPE_DETAILED)
320 bubble_->StartAutoCloseTimer(close_delay); 321 bubble_->StartAutoCloseTimer(close_delay);
321 } 322 }
322 323
323 void SystemTray::HideDetailedView(SystemTrayItem* item) { 324 void SystemTray::HideDetailedView(SystemTrayItem* item) {
324 if (item != detailed_item_) 325 if (item != detailed_item_)
325 return; 326 return;
326 bubble_.reset(); 327 DestroyBubble();
327 UpdateNotificationBubble(); 328 UpdateNotificationBubble();
328 } 329 }
329 330
330 void SystemTray::ShowNotificationView(SystemTrayItem* item) { 331 void SystemTray::ShowNotificationView(SystemTrayItem* item) {
331 if (std::find(notification_items_.begin(), notification_items_.end(), item) 332 if (std::find(notification_items_.begin(), notification_items_.end(), item)
332 != notification_items_.end()) 333 != notification_items_.end())
333 return; 334 return;
334 notification_items_.push_back(item); 335 notification_items_.push_back(item);
335 UpdateNotificationBubble(); 336 UpdateNotificationBubble();
336 } 337 }
337 338
338 void SystemTray::HideNotificationView(SystemTrayItem* item) { 339 void SystemTray::HideNotificationView(SystemTrayItem* item) {
339 std::vector<SystemTrayItem*>::iterator found_iter = 340 std::vector<SystemTrayItem*>::iterator found_iter =
340 std::find(notification_items_.begin(), notification_items_.end(), item); 341 std::find(notification_items_.begin(), notification_items_.end(), item);
341 if (found_iter == notification_items_.end()) 342 if (found_iter == notification_items_.end())
342 return; 343 return;
343 notification_items_.erase(found_iter); 344 notification_items_.erase(found_iter);
344 // Only update the notification bubble if visible (i.e. don't create one). 345 // Only update the notification bubble if visible (i.e. don't create one).
345 if (notification_bubble_.get()) 346 if (notification_bubble_.get())
346 UpdateNotificationBubble(); 347 UpdateNotificationBubble();
347 } 348 }
348 349
349 void SystemTray::UpdateAfterLoginStatusChange(user::LoginStatus login_status) { 350 void SystemTray::UpdateAfterLoginStatusChange(user::LoginStatus login_status) {
350 bubble_.reset(); 351 DestroyBubble();
351 352
352 for (std::vector<SystemTrayItem*>::iterator it = items_.begin(); 353 for (std::vector<SystemTrayItem*>::iterator it = items_.begin();
353 it != items_.end(); 354 it != items_.end();
354 ++it) { 355 ++it) {
355 (*it)->UpdateAfterLoginStatusChange(login_status); 356 (*it)->UpdateAfterLoginStatusChange(login_status);
356 } 357 }
357 358
358 SetVisible(true); 359 SetVisible(true);
359 PreferredSizeChanged(); 360 PreferredSizeChanged();
360 } 361 }
361 362
362 bool SystemTray::CloseBubbleForTest() const { 363 bool SystemTray::CloseBubbleForTest() const {
363 if (!bubble_.get()) 364 if (!bubble_.get())
364 return false; 365 return false;
365 bubble_->Close(); 366 bubble_->Close();
366 return true; 367 return true;
367 } 368 }
368 369
369 // Private methods. 370 // Private methods.
370 371
372 void SystemTray::DestroyBubble() {
373 bubble_.reset();
374 detailed_item_ = NULL;
375 }
376
371 void SystemTray::RemoveBubble(SystemTrayBubble* bubble) { 377 void SystemTray::RemoveBubble(SystemTrayBubble* bubble) {
372 if (bubble == bubble_.get()) { 378 if (bubble == bubble_.get()) {
373 bubble_.reset(); 379 DestroyBubble();
374 UpdateNotificationBubble(); // State changed, re-create notifications. 380 UpdateNotificationBubble(); // State changed, re-create notifications.
375 if (should_show_launcher_) { 381 if (should_show_launcher_) {
376 // No need to show the launcher if the mouse isn't over the status area 382 // No need to show the launcher if the mouse isn't over the status area
377 // anymore. 383 // anymore.
378 aura::RootWindow* root = GetWidget()->GetNativeView()->GetRootWindow(); 384 aura::RootWindow* root = GetWidget()->GetNativeView()->GetRootWindow();
379 should_show_launcher_ = GetWidget()->GetWindowScreenBounds().Contains( 385 should_show_launcher_ = GetWidget()->GetWindowScreenBounds().Contains(
380 root->last_mouse_location()); 386 root->last_mouse_location());
381 if (!should_show_launcher_) 387 if (!should_show_launcher_)
382 Shell::GetInstance()->shelf()->UpdateAutoHideState(); 388 Shell::GetInstance()->shelf()->UpdateAutoHideState();
383 } 389 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 ash::Shell::GetInstance()->tray_delegate(); 459 ash::Shell::GetInstance()->tray_delegate();
454 views::View* anchor = tray_container_; 460 views::View* anchor = tray_container_;
455 SystemTrayBubble::InitParams init_params( 461 SystemTrayBubble::InitParams init_params(
456 SystemTrayBubble::ANCHOR_TYPE_TRAY, 462 SystemTrayBubble::ANCHOR_TYPE_TRAY,
457 shelf_alignment()); 463 shelf_alignment());
458 init_params.anchor = anchor; 464 init_params.anchor = anchor;
459 init_params.can_activate = can_activate; 465 init_params.can_activate = can_activate;
460 init_params.login_status = delegate->GetUserLoginStatus(); 466 init_params.login_status = delegate->GetUserLoginStatus();
461 if (arrow_offset >= 0) 467 if (arrow_offset >= 0)
462 init_params.arrow_offset = arrow_offset; 468 init_params.arrow_offset = arrow_offset;
469 if (detailed)
470 init_params.max_height = default_bubble_height_;
463 bubble_->InitView(init_params); 471 bubble_->InitView(init_params);
464 } 472 }
473 // Save height of default view for creating detailed views directly.
474 if (!detailed)
475 default_bubble_height_ = bubble_->bubble_view()->height();
465 476
466 if (detailed && items.size() > 0) 477 if (detailed && items.size() > 0)
467 detailed_item_ = items[0]; 478 detailed_item_ = items[0];
468 else 479 else
469 detailed_item_ = NULL; 480 detailed_item_ = NULL;
470 481
471 // If we have focus the shelf should be visible and we need to continue 482 // If we have focus the shelf should be visible and we need to continue
472 // showing the shelf when the popup is shown. 483 // showing the shelf when the popup is shown.
473 if (GetWidget()->IsActive()) 484 if (GetWidget()->IsActive())
474 should_show_launcher_ = true; 485 should_show_launcher_ = true;
475 486
476 UpdateNotificationBubble(); // State changed, re-create notifications. 487 UpdateNotificationBubble(); // State changed, re-create notifications.
477 } 488 }
478 489
479 void SystemTray::UpdateNotificationBubble() { 490 void SystemTray::UpdateNotificationBubble() {
480 // Only show the notification buble if we have notifications and we are not 491 // Only show the notification buble if we have notifications and we are not
481 // showing the default bubble. 492 // showing the default bubble.
482 if (notification_items_.empty() || 493 if (notification_items_.empty() ||
483 (bubble_.get() && 494 (bubble_.get() &&
484 bubble_->bubble_type() == SystemTrayBubble::BUBBLE_TYPE_DEFAULT)) { 495 bubble_->bubble_type() == SystemTrayBubble::BUBBLE_TYPE_DEFAULT)) {
485 notification_bubble_.reset(); 496 notification_bubble_.reset();
486 return; 497 return;
487 } 498 }
488 notification_bubble_.reset( 499 if (bubble_.get() &&
489 new SystemTrayBubble(this, notification_items_, 500 bubble_->bubble_type() == SystemTrayBubble::BUBBLE_TYPE_DETAILED) {
490 SystemTrayBubble::BUBBLE_TYPE_NOTIFICATION)); 501 // Skip notifications for any currently displayed detailed item.
502 std::vector<SystemTrayItem*> items;
503 for (std::vector<SystemTrayItem*>::iterator iter =
504 notification_items_.begin();
505 iter != notification_items_.end(); ++ iter) {
506 if (*iter != detailed_item_)
507 items.push_back(*iter);
508 }
509 notification_bubble_.reset(new SystemTrayBubble(
510 this, items, SystemTrayBubble::BUBBLE_TYPE_NOTIFICATION));
511 } else {
512 // Show all notifications.
513 notification_bubble_.reset(new SystemTrayBubble(
514 this, notification_items_, SystemTrayBubble::BUBBLE_TYPE_NOTIFICATION));
515 }
491 views::View* anchor; 516 views::View* anchor;
492 SystemTrayBubble::AnchorType anchor_type; 517 SystemTrayBubble::AnchorType anchor_type;
493 if (bubble_.get()) { 518 if (bubble_.get()) {
494 anchor = bubble_->bubble_view(); 519 anchor = bubble_->bubble_view();
495 anchor_type = SystemTrayBubble::ANCHOR_TYPE_BUBBLE; 520 anchor_type = SystemTrayBubble::ANCHOR_TYPE_BUBBLE;
496 } else { 521 } else {
497 anchor = tray_container_; 522 anchor = tray_container_;
498 anchor_type = SystemTrayBubble::ANCHOR_TYPE_TRAY; 523 anchor_type = SystemTrayBubble::ANCHOR_TYPE_TRAY;
499 } 524 }
500 SystemTrayBubble::InitParams init_params(anchor_type, shelf_alignment()); 525 SystemTrayBubble::InitParams init_params(anchor_type, shelf_alignment());
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
580 canvas->DrawFocusRect(tray_container_->bounds()); 605 canvas->DrawFocusRect(tray_container_->bounds());
581 } 606 }
582 607
583 void SystemTray::UpdateBackground(int alpha) { 608 void SystemTray::UpdateBackground(int alpha) {
584 background_->set_alpha(hide_background_animator_.alpha() + 609 background_->set_alpha(hide_background_animator_.alpha() +
585 hover_background_animator_.alpha()); 610 hover_background_animator_.alpha());
586 SchedulePaint(); 611 SchedulePaint();
587 } 612 }
588 613
589 } // namespace ash 614 } // namespace ash
OLDNEW
« no previous file with comments | « ash/system/tray/system_tray.h ('k') | ash/system/tray/system_tray_bubble.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698