1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/chromeos/notifications/system_notification.h" 6 7 #include "base/callback.h" 8 #include "chrome/browser/browser_process.h" 9 #include "chrome/browser/chromeos/notifications/system_notification_factory.h" 10 #include "chrome/browser/notifications/notification.h" 11 #include "chrome/browser/notifications/notification_ui_manager.h" 12 #include "chrome/browser/ui/webui/web_ui_util.h" 13 14 namespace chromeos { 15 16 void SystemNotification::Init(int icon_resource_id) { 17 collection_ = static_cast<BalloonCollectionImpl*>( 18 g_browser_process->notification_ui_manager()->balloon_collection()); 19 std::string url = web_ui_util::GetImageDataUrlFromResource(icon_resource_id); 20 DCHECK(!url.empty()); 21 GURL tmp_gurl(url); 22 icon_.Swap(&tmp_gurl); 23 } 24 25 SystemNotification::SystemNotification(Profile* profile, 26 NotificationDelegate* delegate, 27 int icon_resource_id, 28 const string16& title) 29 : profile_(profile), 30 collection_(NULL), 31 delegate_(delegate), 32 title_(title), 33 visible_(false), 34 urgent_(false) { 35 Init(icon_resource_id); 36 } 37 38 SystemNotification::SystemNotification(Profile* profile, 39 const std::string& id, 40 int icon_resource_id, 41 const string16& title) 42 : profile_(profile), 43 collection_(NULL), 44 delegate_(new Delegate(id)), 45 title_(title), 46 visible_(false), 47 urgent_(false) { 48 Init(icon_resource_id); 49 } 50 51 SystemNotification::~SystemNotification() { 52 } 53 54 void SystemNotification::Show(const string16& message, 55 bool urgent, 56 bool sticky) { 57 Show(message, string16(), NULL, urgent, sticky); 58 } 59 60 void SystemNotification::Show(const string16& message, 61 const string16& link, 62 MessageCallback* callback, 63 bool urgent, 64 bool sticky) { 65 Notification notify = SystemNotificationFactory::Create(icon_, 66 title_, message, link, delegate_.get()); 67 if (visible_) { 68 // Force showing a user hidden notification on an urgent transition. 69 if (urgent && !urgent_) { 70 collection_->UpdateAndShowNotification(notify); 71 } else { 72 collection_->UpdateNotification(notify); 73 } 74 } else { 75 collection_->AddSystemNotification(notify, profile_, 76 sticky, 77 false /* no controls */); 78 collection_->AddWebUIMessageCallback(notify, "link", callback); 79 } 80 visible_ = true; 81 urgent_ = urgent; 82 } 83 84 void SystemNotification::Hide() { 85 if (visible_) { 86 collection_->RemoveById(delegate_->id()); 87 visible_ = false; 88 urgent_ = false; 89 } 90 } 91 92 } // namespace chromeos 93