Index: ash/system/toast/toast_manager.cc |
diff --git a/ash/system/toast/toast_manager.cc b/ash/system/toast/toast_manager.cc |
index 86f8653be2f0e51c9499bf7b00f44397c40c6b94..16aa9d25c8b7917401cbb5bb3d932abbc812f089 100644 |
--- a/ash/system/toast/toast_manager.cc |
+++ b/ash/system/toast/toast_manager.cc |
@@ -21,42 +21,73 @@ ToastManager::ToastManager() : weak_ptr_factory_(this) {} |
ToastManager::~ToastManager() {} |
-void ToastManager::Show(const std::string& text, uint64_t duration_ms) { |
- queue_.emplace(std::make_pair(text, duration_ms)); |
+void ToastManager::Show(const ToastData& data) { |
+ const std::string& id = data.id; |
+ DCHECK(!id.empty()); |
+ |
+ if (current_toast_id_ == id) { |
+ // TODO(yoshiki): Replaces the visible toast. |
+ return; |
+ } |
+ |
+ auto existing_toast = |
+ std::find_if(queue_.begin(), queue_.end(), |
+ [&id](const ToastData& data) { return data.id == id; }); |
+ |
+ if (existing_toast == queue_.end()) { |
+ queue_.emplace_back(data); |
+ } else { |
+ *existing_toast = data; |
+ } |
if (queue_.size() == 1 && overlay_ == nullptr) |
ShowLatest(); |
} |
+void ToastManager::Cancel(const std::string& id) { |
+ if (id == current_toast_id_) { |
+ overlay_->Show(false); |
+ return; |
+ } |
+ |
+ auto cancelled_toast = |
+ std::find_if(queue_.begin(), queue_.end(), |
+ [id](const ToastData& data) { return data.id == id; }); |
dcheng
2016/05/20 08:16:33
(This should probably also capture by ref as well)
yoshiki
2016/05/20 09:30:31
Thank you for letting me know!
|
+ if (cancelled_toast != queue_.end()) |
+ queue_.erase(cancelled_toast); |
+} |
+ |
void ToastManager::OnClosed() { |
overlay_.reset(); |
+ current_toast_id_.clear(); |
// Show the next toast if available. |
- if (queue_.size() != 0) |
+ if (!queue_.empty()) |
ShowLatest(); |
} |
void ToastManager::ShowLatest() { |
DCHECK(!overlay_); |
- auto data = queue_.front(); |
- uint64_t duration_ms = std::max(data.second, kMinimumDurationMs); |
+ const ToastData& data = std::move(queue_.front()); |
+ uint64_t duration_ms = std::max(data.duration_ms, kMinimumDurationMs); |
- toast_id_++; |
+ current_toast_id_ = data.id; |
+ serial_++; |
- overlay_.reset(new ToastOverlay(this, data.first /* text */)); |
+ overlay_.reset(new ToastOverlay(this, data.text)); |
overlay_->Show(true); |
base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
FROM_HERE, base::Bind(&ToastManager::OnDurationPassed, |
- weak_ptr_factory_.GetWeakPtr(), toast_id_), |
+ weak_ptr_factory_.GetWeakPtr(), serial_), |
base::TimeDelta::FromMilliseconds(duration_ms)); |
- queue_.pop(); |
+ queue_.pop_front(); |
} |
-void ToastManager::OnDurationPassed(int toast_id) { |
- if (overlay_ && toast_id_ == toast_id) |
+void ToastManager::OnDurationPassed(int toast_number) { |
+ if (overlay_ && serial_ == toast_number) |
overlay_->Show(false); |
} |