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

Unified Diff: ui/arc/notification/arc_notification_item.cc

Issue 2066853002: arc: Show custom notification via notification surface (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@notification-exo
Patch Set: clean up Created 4 years, 6 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 side-by-side diff with in-line comments
Download patch
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..2b3722efba9fd49bb7f74e52155e2fe12ca7ec64 100644
--- a/ui/arc/notification/arc_notification_item.cc
+++ b/ui/arc/notification/arc_notification_item.cc
@@ -5,8 +5,10 @@
#include "ui/arc/notification/arc_notification_item.h"
#include <algorithm>
+#include <memory>
#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"
@@ -15,6 +17,7 @@
#include "components/arc/bitmap/bitmap_type_converters.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkPaint.h"
+#include "ui/arc/notification/arc_custom_notification_view.h"
#include "ui/gfx/codec/png_codec.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/image/image.h"
@@ -28,9 +31,11 @@ namespace arc {
namespace {
-static const char kNotifierId[] = "ARC_NOTIFICATION";
+constexpr char kNotifierId[] = "ARC_NOTIFICATION";
+constexpr char kNotificationIdPrefix[] = "ARC_NOTIFICATION_";
-static const char kNotificationIdPrefix[] = "ARC_NOTIFICATION_";
+// Whether to use notification surface.
+constexpr bool use_notification_surface = true;
SkBitmap DecodeImage(const std::vector<uint8_t>& data) {
DCHECK(base::WorkerPool::RunsTasksOnCurrentThread());
@@ -134,11 +139,23 @@ class ArcNotificationDelegate : public message_center::NotificationDelegate {
item_->ButtonClick(button_index);
}
+ std::unique_ptr<views::View> CreateCustomContent() override {
+ if (!item_ || !surface_)
+ return std::unique_ptr<views::View>();
+
+ return base::WrapUnique(new ArcCustomNotificationView(surface_));
+ }
+
+ void set_notification_surface(exo::NotificationSurface* surface) {
+ surface_ = surface;
+ }
+
private:
// The destructor is private since this class is ref-counted.
~ArcNotificationDelegate() override {}
base::WeakPtr<ArcNotificationItem> item_;
+ exo::NotificationSurface* surface_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(ArcNotificationDelegate);
};
@@ -244,6 +261,9 @@ void ArcNotificationItem::UpdateWithArcNotificationData(
message_center::NotifierId::SYSTEM_COMPONENT, kNotifierId);
notifier_id.profile_id = profile_id_.GetUserEmail();
+ if (use_notification_surface)
+ type = message_center::NOTIFICATION_TYPE_CUSTOM;
+
DCHECK(!data.title.is_null());
DCHECK(!data.message.is_null());
notification_.reset(new message_center::Notification(
@@ -255,6 +275,18 @@ void ArcNotificationItem::UpdateWithArcNotificationData(
notifier_id, rich_data,
new ArcNotificationDelegate(weak_ptr_factory_.GetWeakPtr())));
+ if (use_notification_surface) {
+ ArcNotificationSurfaceCollection* surface_collection =
+ manager_->notification_surface_collection();
+ exo::NotificationSurface* surface =
+ surface_collection->GetSurface(notification_id_);
+ if (surface)
+ OnNotificationSurfaceAdded(surface);
+ else
+ surface_collection->AddObserver(this);
+ return;
yoshiki 2016/06/15 11:47:20 Please call AddToMessageCenter(). At least, we nee
xiyuan 2016/06/15 19:32:44 AddToMessageCenter() is called once the surface is
yoshiki 2016/06/16 02:44:50 I got it. Thank you for explanation.
+ }
+
DCHECK(!data.icon_data.is_null());
if (data.icon_data.size() == 0) {
OnImageDecoded(SkBitmap()); // Pass an empty bitmap.
@@ -269,7 +301,9 @@ void ArcNotificationItem::UpdateWithArcNotificationData(
weak_ptr_factory_.GetWeakPtr()));
}
-ArcNotificationItem::~ArcNotificationItem() {}
+ArcNotificationItem::~ArcNotificationItem() {
+ manager_->notification_surface_collection()->RemoveObserver(this);
+}
void ArcNotificationItem::OnClosedFromAndroid(bool by_user) {
being_removed_by_manager_ = true; // Closing is initiated by the manager.
@@ -297,12 +331,25 @@ void ArcNotificationItem::ButtonClick(int button_index) {
notification_key_, button_index);
}
+void ArcNotificationItem::OnNotificationSurfaceAdded(
+ exo::NotificationSurface* surface) {
+ if (!notification_ || surface->notification_id() != notification_key_)
+ return;
yoshiki 2016/06/15 11:47:20 Ditto for calling AddTestMessageCenter().
xiyuan 2016/06/15 19:32:44 AddToMessageCenter() is called at the end. The con
+
+ static_cast<ArcNotificationDelegate*>(notification_->delegate())
+ ->set_notification_surface(surface);
+ AddToMessageCenter();
+}
+
void ArcNotificationItem::OnImageDecoded(const SkBitmap& bitmap) {
DCHECK(thread_checker_.CalledOnValidThread());
gfx::Image image = gfx::Image::CreateFrom1xBitmap(bitmap);
notification_->set_icon(image);
+ AddToMessageCenter();
+}
+void ArcNotificationItem::AddToMessageCenter() {
DCHECK(notification_);
message_center_->AddNotification(std::move(notification_));

Powered by Google App Engine
This is Rietveld 408576698