| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "ui/message_center/message_center_impl.h" | 5 #include "ui/message_center/message_center_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 } | 349 } |
| 350 } | 350 } |
| 351 | 351 |
| 352 //////////////////////////////////////////////////////////////////////////////// | 352 //////////////////////////////////////////////////////////////////////////////// |
| 353 // MessageCenterImpl | 353 // MessageCenterImpl |
| 354 | 354 |
| 355 MessageCenterImpl::MessageCenterImpl() | 355 MessageCenterImpl::MessageCenterImpl() |
| 356 : MessageCenter(), | 356 : MessageCenter(), |
| 357 popup_timers_controller_(new PopupTimersController(this)), | 357 popup_timers_controller_(new PopupTimersController(this)), |
| 358 settings_provider_(NULL) { | 358 settings_provider_(NULL) { |
| 359 notification_list_.reset(new NotificationList()); | 359 notification_list_.reset(new NotificationList(this)); |
| 360 | 360 |
| 361 bool enable_message_center_changes_while_open = true; // enable by default | 361 bool enable_message_center_changes_while_open = true; // enable by default |
| 362 std::string arg = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 362 std::string arg = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| 363 switches::kMessageCenterChangesWhileOpen); | 363 switches::kMessageCenterChangesWhileOpen); |
| 364 if (!arg.empty()) { | 364 if (!arg.empty()) { |
| 365 if (arg == "enabled") | 365 if (arg == "enabled") |
| 366 enable_message_center_changes_while_open = true; | 366 enable_message_center_changes_while_open = true; |
| 367 else if (arg == "disabled") | 367 else if (arg == "disabled") |
| 368 enable_message_center_changes_while_open = false; | 368 enable_message_center_changes_while_open = false; |
| 369 } | 369 } |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 void MessageCenterImpl::NotifierGroupChanged() {} | 433 void MessageCenterImpl::NotifierGroupChanged() {} |
| 434 | 434 |
| 435 void MessageCenterImpl::NotifierEnabledChanged( | 435 void MessageCenterImpl::NotifierEnabledChanged( |
| 436 const NotifierId& notifier_id, bool enabled) { | 436 const NotifierId& notifier_id, bool enabled) { |
| 437 if (!enabled) { | 437 if (!enabled) { |
| 438 RemoveNotificationsForNotifierId(notifier_id); | 438 RemoveNotificationsForNotifierId(notifier_id); |
| 439 } | 439 } |
| 440 } | 440 } |
| 441 | 441 |
| 442 void MessageCenterImpl::SetVisibility(Visibility visibility) { | 442 void MessageCenterImpl::SetVisibility(Visibility visibility) { |
| 443 std::set<std::string> updated_ids; | 443 visible_ = (visibility == VISIBILITY_MESSAGE_CENTER); |
| 444 notification_list_->SetMessageCenterVisible( | |
| 445 (visibility == VISIBILITY_MESSAGE_CENTER), &updated_ids); | |
| 446 notification_cache_.RecountUnread(); | |
| 447 | 444 |
| 448 for (const auto& id : updated_ids) { | 445 if (visible_ && !locked_) { |
| 449 FOR_EACH_OBSERVER( | 446 std::set<std::string> updated_ids; |
| 450 MessageCenterObserver, observer_list_, OnNotificationUpdated(id)); | 447 notification_list_->SetNotificationsShown(blockers_, &updated_ids); |
| 448 notification_cache_.RecountUnread(); |
| 449 |
| 450 for (const auto& id : updated_ids) { |
| 451 FOR_EACH_OBSERVER( |
| 452 MessageCenterObserver, observer_list_, OnNotificationUpdated(id)); |
| 453 } |
| 451 } | 454 } |
| 452 | 455 |
| 453 if (notification_queue_ && | 456 if (notification_queue_ && |
| 454 visibility == VISIBILITY_TRANSIENT) { | 457 visibility == VISIBILITY_TRANSIENT) { |
| 455 notification_queue_->ApplyChanges(this); | 458 notification_queue_->ApplyChanges(this); |
| 456 } | 459 } |
| 457 | 460 |
| 458 FOR_EACH_OBSERVER(MessageCenterObserver, | 461 FOR_EACH_OBSERVER(MessageCenterObserver, |
| 459 observer_list_, | 462 observer_list_, |
| 460 OnCenterVisibilityChanged(visibility)); | 463 OnCenterVisibilityChanged(visibility)); |
| 461 } | 464 } |
| 462 | 465 |
| 463 bool MessageCenterImpl::IsMessageCenterVisible() const { | 466 bool MessageCenterImpl::IsMessageCenterVisible() const { |
| 464 return notification_list_->is_message_center_visible(); | 467 return visible_; |
| 465 } | 468 } |
| 466 | 469 |
| 467 size_t MessageCenterImpl::NotificationCount() const { | 470 size_t MessageCenterImpl::NotificationCount() const { |
| 468 return notification_cache_.visible_notifications.size(); | 471 return notification_cache_.visible_notifications.size(); |
| 469 } | 472 } |
| 470 | 473 |
| 471 size_t MessageCenterImpl::UnreadNotificationCount() const { | 474 size_t MessageCenterImpl::UnreadNotificationCount() const { |
| 472 return notification_cache_.unread_count; | 475 return notification_cache_.unread_count; |
| 473 } | 476 } |
| 474 | 477 |
| 475 bool MessageCenterImpl::HasPopupNotifications() const { | 478 bool MessageCenterImpl::HasPopupNotifications() const { |
| 476 return !IsMessageCenterVisible() && | 479 return !IsMessageCenterVisible() && |
| 477 notification_list_->HasPopupNotifications(blockers_); | 480 notification_list_->HasPopupNotifications(blockers_); |
| 478 } | 481 } |
| 479 | 482 |
| 480 bool MessageCenterImpl::IsQuietMode() const { | 483 bool MessageCenterImpl::IsQuietMode() const { |
| 481 return notification_list_->quiet_mode(); | 484 return notification_list_->quiet_mode(); |
| 482 } | 485 } |
| 483 | 486 |
| 487 bool MessageCenterImpl::IsLockedState() const { |
| 488 return locked_; |
| 489 } |
| 490 |
| 484 bool MessageCenterImpl::HasClickedListener(const std::string& id) { | 491 bool MessageCenterImpl::HasClickedListener(const std::string& id) { |
| 485 scoped_refptr<NotificationDelegate> delegate = | 492 scoped_refptr<NotificationDelegate> delegate = |
| 486 notification_list_->GetNotificationDelegate(id); | 493 notification_list_->GetNotificationDelegate(id); |
| 487 return delegate.get() && delegate->HasClickedListener(); | 494 return delegate.get() && delegate->HasClickedListener(); |
| 488 } | 495 } |
| 489 | 496 |
| 490 message_center::Notification* MessageCenterImpl::FindVisibleNotificationById( | 497 message_center::Notification* MessageCenterImpl::FindVisibleNotificationById( |
| 491 const std::string& id) { | 498 const std::string& id) { |
| 492 return notification_list_->GetNotificationById(id); | 499 return notification_list_->GetNotificationById(id); |
| 493 } | 500 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 509 | 516 |
| 510 //------------------------------------------------------------------------------ | 517 //------------------------------------------------------------------------------ |
| 511 // Client code interface. | 518 // Client code interface. |
| 512 void MessageCenterImpl::AddNotification( | 519 void MessageCenterImpl::AddNotification( |
| 513 std::unique_ptr<Notification> notification) { | 520 std::unique_ptr<Notification> notification) { |
| 514 DCHECK(notification); | 521 DCHECK(notification); |
| 515 const std::string id = notification->id(); | 522 const std::string id = notification->id(); |
| 516 for (size_t i = 0; i < blockers_.size(); ++i) | 523 for (size_t i = 0; i < blockers_.size(); ++i) |
| 517 blockers_[i]->CheckState(); | 524 blockers_[i]->CheckState(); |
| 518 | 525 |
| 519 if (notification_queue_ && | 526 if (notification_queue_ && visible_) { |
| 520 notification_list_->is_message_center_visible()) { | |
| 521 notification_queue_->AddNotification(std::move(notification)); | 527 notification_queue_->AddNotification(std::move(notification)); |
| 522 return; | 528 return; |
| 523 } | 529 } |
| 524 | 530 |
| 525 AddNotificationImmediately(std::move(notification)); | 531 AddNotificationImmediately(std::move(notification)); |
| 526 } | 532 } |
| 527 | 533 |
| 528 void MessageCenterImpl::AddNotificationImmediately( | 534 void MessageCenterImpl::AddNotificationImmediately( |
| 529 std::unique_ptr<Notification> notification) { | 535 std::unique_ptr<Notification> notification) { |
| 530 const std::string id = notification->id(); | 536 const std::string id = notification->id(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 545 MessageCenterObserver, observer_list_, OnNotificationAdded(id)); | 551 MessageCenterObserver, observer_list_, OnNotificationAdded(id)); |
| 546 } | 552 } |
| 547 } | 553 } |
| 548 | 554 |
| 549 void MessageCenterImpl::UpdateNotification( | 555 void MessageCenterImpl::UpdateNotification( |
| 550 const std::string& old_id, | 556 const std::string& old_id, |
| 551 std::unique_ptr<Notification> new_notification) { | 557 std::unique_ptr<Notification> new_notification) { |
| 552 for (size_t i = 0; i < blockers_.size(); ++i) | 558 for (size_t i = 0; i < blockers_.size(); ++i) |
| 553 blockers_[i]->CheckState(); | 559 blockers_[i]->CheckState(); |
| 554 | 560 |
| 555 if (notification_queue_ && | 561 if (notification_queue_ && visible_) { |
| 556 notification_list_->is_message_center_visible()) { | |
| 557 // We will allow notifications that are progress types (and stay progress | 562 // We will allow notifications that are progress types (and stay progress |
| 558 // types) to be updated even if the message center is open. There are 3 | 563 // types) to be updated even if the message center is open. There are 3 |
| 559 // requirements here: | 564 // requirements here: |
| 560 // * Notification of type PROGRESS exists with same ID in the center | 565 // * Notification of type PROGRESS exists with same ID in the center |
| 561 // * There are no queued updates for this notification (they imply a change | 566 // * There are no queued updates for this notification (they imply a change |
| 562 // that violates the PROGRESS invariant | 567 // that violates the PROGRESS invariant |
| 563 // * The new notification is type PROGRESS. | 568 // * The new notification is type PROGRESS. |
| 564 // TODO(dewittj): Ensure this works when the ID is changed by the caller. | 569 // TODO(dewittj): Ensure this works when the ID is changed by the caller. |
| 565 // This shouldn't be an issue in practice since only W3C notifications | 570 // This shouldn't be an issue in practice since only W3C notifications |
| 566 // change the ID on update, and they don't have progress type notifications. | 571 // change the ID on update, and they don't have progress type notifications. |
| (...skipping 27 matching lines...) Expand all Loading... |
| 594 } else { | 599 } else { |
| 595 FOR_EACH_OBSERVER(MessageCenterObserver, observer_list_, | 600 FOR_EACH_OBSERVER(MessageCenterObserver, observer_list_, |
| 596 OnNotificationRemoved(old_id, false)); | 601 OnNotificationRemoved(old_id, false)); |
| 597 FOR_EACH_OBSERVER(MessageCenterObserver, observer_list_, | 602 FOR_EACH_OBSERVER(MessageCenterObserver, observer_list_, |
| 598 OnNotificationAdded(new_id)); | 603 OnNotificationAdded(new_id)); |
| 599 } | 604 } |
| 600 } | 605 } |
| 601 | 606 |
| 602 void MessageCenterImpl::RemoveNotification(const std::string& id, | 607 void MessageCenterImpl::RemoveNotification(const std::string& id, |
| 603 bool by_user) { | 608 bool by_user) { |
| 604 if (notification_queue_ && !by_user && | 609 if (notification_queue_ && !by_user && visible_) { |
| 605 notification_list_->is_message_center_visible()) { | |
| 606 notification_queue_->EraseNotification(id, by_user); | 610 notification_queue_->EraseNotification(id, by_user); |
| 607 return; | 611 return; |
| 608 } | 612 } |
| 609 | 613 |
| 610 RemoveNotificationImmediately(id, by_user); | 614 RemoveNotificationImmediately(id, by_user); |
| 611 } | 615 } |
| 612 | 616 |
| 613 void MessageCenterImpl::RemoveNotificationImmediately( | 617 void MessageCenterImpl::RemoveNotificationImmediately( |
| 614 const std::string& id, bool by_user) { | 618 const std::string& id, bool by_user) { |
| 615 if (FindVisibleNotificationById(id) == NULL) | 619 if (FindVisibleNotificationById(id) == NULL) |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 847 void MessageCenterImpl::SetQuietMode(bool in_quiet_mode) { | 851 void MessageCenterImpl::SetQuietMode(bool in_quiet_mode) { |
| 848 if (in_quiet_mode != notification_list_->quiet_mode()) { | 852 if (in_quiet_mode != notification_list_->quiet_mode()) { |
| 849 notification_list_->SetQuietMode(in_quiet_mode); | 853 notification_list_->SetQuietMode(in_quiet_mode); |
| 850 FOR_EACH_OBSERVER(MessageCenterObserver, | 854 FOR_EACH_OBSERVER(MessageCenterObserver, |
| 851 observer_list_, | 855 observer_list_, |
| 852 OnQuietModeChanged(in_quiet_mode)); | 856 OnQuietModeChanged(in_quiet_mode)); |
| 853 } | 857 } |
| 854 quiet_mode_timer_.reset(); | 858 quiet_mode_timer_.reset(); |
| 855 } | 859 } |
| 856 | 860 |
| 861 void MessageCenterImpl::SetLockedState(bool locked) { |
| 862 if (locked != locked_) { |
| 863 locked_ = locked; |
| 864 FOR_EACH_OBSERVER(MessageCenterObserver, observer_list_, |
| 865 OnLockedStateChanged(locked)); |
| 866 } |
| 867 } |
| 868 |
| 857 void MessageCenterImpl::EnterQuietModeWithExpire( | 869 void MessageCenterImpl::EnterQuietModeWithExpire( |
| 858 const base::TimeDelta& expires_in) { | 870 const base::TimeDelta& expires_in) { |
| 859 if (quiet_mode_timer_) { | 871 if (quiet_mode_timer_) { |
| 860 // Note that the capital Reset() is the method to restart the timer, not | 872 // Note that the capital Reset() is the method to restart the timer, not |
| 861 // scoped_ptr::reset(). | 873 // scoped_ptr::reset(). |
| 862 quiet_mode_timer_->Reset(); | 874 quiet_mode_timer_->Reset(); |
| 863 } else { | 875 } else { |
| 864 notification_list_->SetQuietMode(true); | 876 notification_list_->SetQuietMode(true); |
| 865 FOR_EACH_OBSERVER( | 877 FOR_EACH_OBSERVER( |
| 866 MessageCenterObserver, observer_list_, OnQuietModeChanged(true)); | 878 MessageCenterObserver, observer_list_, OnQuietModeChanged(true)); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 889 } | 901 } |
| 890 | 902 |
| 891 void MessageCenterImpl::EnableChangeQueueForTest(bool enable) { | 903 void MessageCenterImpl::EnableChangeQueueForTest(bool enable) { |
| 892 if (enable) | 904 if (enable) |
| 893 notification_queue_.reset(new internal::ChangeQueue()); | 905 notification_queue_.reset(new internal::ChangeQueue()); |
| 894 else | 906 else |
| 895 notification_queue_.reset(); | 907 notification_queue_.reset(); |
| 896 } | 908 } |
| 897 | 909 |
| 898 } // namespace message_center | 910 } // namespace message_center |
| OLD | NEW |