Index: ui/arc/notification/arc_notification_item.cc |
diff --git a/ui/arc/notification/arc_notification_item.cc b/ui/arc/notification/arc_notification_item.cc |
index 5d936ad3cc3776773adc00553ab7324865bd6bcd..fc7f6742b3ba287ead7cf871ca5cd1f765a6eea0 100644 |
--- a/ui/arc/notification/arc_notification_item.cc |
+++ b/ui/arc/notification/arc_notification_item.cc |
@@ -7,6 +7,7 @@ |
#include <algorithm> |
#include <vector> |
+#include "base/memory/ptr_util.h" |
#include "base/strings/string16.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/task_runner.h" |
@@ -28,9 +29,8 @@ namespace arc { |
namespace { |
-static const char kNotifierId[] = "ARC_NOTIFICATION"; |
- |
-static const char kNotificationIdPrefix[] = "ARC_NOTIFICATION_"; |
+constexpr char kNotifierId[] = "ARC_NOTIFICATION"; |
+constexpr char kNotificationIdPrefix[] = "ARC_NOTIFICATION_"; |
SkBitmap DecodeImage(const std::vector<uint8_t>& data) { |
DCHECK(base::WorkerPool::RunsTasksOnCurrentThread()); |
@@ -86,28 +86,6 @@ SkBitmap CropImage(const SkBitmap& original_bitmap) { |
return container_bitmap; |
} |
-// Converts from Android notification priority to Chrome notification priority. |
-// On Android, PRIORITY_DEFAULT does not pop up, so this maps PRIORITY_DEFAULT |
-// to Chrome's -1 to adapt that behavior. Also, this maps PRIORITY_LOW and _HIGH |
-// to -2 and 0 respectively to adjust the value with keeping the order among |
-// _LOW, _DEFAULT and _HIGH. |
-int convertAndroidPriority(const int android_priority) { |
- switch (android_priority) { |
- case -2: // PRIORITY_MIN |
- case -1: // PRIORITY_LOW |
- return -2; |
- case 0: // PRIORITY_DEFAULT |
- return -1; |
- case 1: // PRIORITY_HIGH |
- return 0; |
- case 2: // PRIORITY_MAX |
- return 2; |
- default: |
- NOTREACHED() << "Invalid Priority: " << android_priority; |
- return 0; |
- } |
-} |
- |
class ArcNotificationDelegate : public message_center::NotificationDelegate { |
public: |
explicit ArcNotificationDelegate(base::WeakPtr<ArcNotificationItem> item) |
@@ -166,13 +144,8 @@ void ArcNotificationItem::UpdateWithArcNotificationData( |
// a decode task is on-going asynchronously. Otherwise, there is no task. |
// TODO(yoshiki): Refactor and remove this check by omitting image decoding |
// from here. |
- if (notification_) { |
- // Store the latest data to the |newer_data_| property and returns, if the |
- // previous decode is still in progress. |
- // If old |newer_data_| has been stored, discard the old one. |
- newer_data_ = data.Clone(); |
+ if (CacheArcNotificationData(data)) |
return; |
- } |
message_center::RichNotificationData rich_data; |
message_center::NotificationType type; |
@@ -236,7 +209,7 @@ void ArcNotificationItem::UpdateWithArcNotificationData( |
// are false. |
rich_data.pinned = (data.no_clear || data.ongoing_event); |
- rich_data.priority = convertAndroidPriority(data.priority); |
+ rich_data.priority = ConvertAndroidPriority(data.priority); |
// The identifier of the notifier, which is used to distinguish the notifiers |
// in the message center. |
@@ -246,14 +219,14 @@ void ArcNotificationItem::UpdateWithArcNotificationData( |
DCHECK(!data.title.is_null()); |
DCHECK(!data.message.is_null()); |
- notification_.reset(new message_center::Notification( |
+ SetNotification(base::WrapUnique(new message_center::Notification( |
type, notification_id_, base::UTF8ToUTF16(data.title.get()), |
base::UTF8ToUTF16(data.message.get()), |
gfx::Image(), // icon image: Will be overriden later. |
base::UTF8ToUTF16("arc"), // display source |
GURL(), // empty origin url, for system component |
notifier_id, rich_data, |
- new ArcNotificationDelegate(weak_ptr_factory_.GetWeakPtr()))); |
+ new ArcNotificationDelegate(weak_ptr_factory_.GetWeakPtr())))); |
DCHECK(!data.icon_data.is_null()); |
if (data.icon_data.size() == 0) { |
@@ -297,12 +270,47 @@ void ArcNotificationItem::ButtonClick(int button_index) { |
notification_key_, button_index); |
} |
-void ArcNotificationItem::OnImageDecoded(const SkBitmap& bitmap) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
+// Converts from Android notification priority to Chrome notification priority. |
+// On Android, PRIORITY_DEFAULT does not pop up, so this maps PRIORITY_DEFAULT |
+// to Chrome's -1 to adapt that behavior. Also, this maps PRIORITY_LOW and _HIGH |
+// to -2 and 0 respectively to adjust the value with keeping the order among |
+// _LOW, _DEFAULT and _HIGH. |
+// static |
+int ArcNotificationItem::ConvertAndroidPriority(int android_priority) { |
+ switch (android_priority) { |
+ case -2: // PRIORITY_MIN |
+ case -1: // PRIORITY_LOW |
+ return -2; |
+ case 0: // PRIORITY_DEFAULT |
+ return -1; |
+ case 1: // PRIORITY_HIGH |
+ return 0; |
+ case 2: // PRIORITY_MAX |
+ return 2; |
+ default: |
+ NOTREACHED() << "Invalid Priority: " << android_priority; |
+ return 0; |
+ } |
+} |
- gfx::Image image = gfx::Image::CreateFrom1xBitmap(bitmap); |
- notification_->set_icon(image); |
+bool ArcNotificationItem::CacheArcNotificationData( |
+ const mojom::ArcNotificationData& data) { |
+ if (!notification_) |
+ return false; |
+ |
+ // Store the latest data to the |newer_data_| property if there is a pending |
+ // |notification_|. |
+ // If old |newer_data_| has been stored, discard the old one. |
+ newer_data_ = data.Clone(); |
+ return true; |
+} |
+ |
+void ArcNotificationItem::SetNotification( |
+ std::unique_ptr<message_center::Notification> notification) { |
+ notification_ = std::move(notification); |
+} |
+void ArcNotificationItem::AddToMessageCenter() { |
DCHECK(notification_); |
message_center_->AddNotification(std::move(notification_)); |
@@ -313,4 +321,16 @@ void ArcNotificationItem::OnImageDecoded(const SkBitmap& bitmap) { |
} |
} |
+bool ArcNotificationItem::CalledOnValidThread() const { |
+ return thread_checker_.CalledOnValidThread(); |
+} |
+ |
+void ArcNotificationItem::OnImageDecoded(const SkBitmap& bitmap) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ gfx::Image image = gfx::Image::CreateFrom1xBitmap(bitmap); |
+ notification_->set_icon(image); |
+ AddToMessageCenter(); |
+} |
+ |
} // namespace arc |