| Index: ui/arc/notification/arc_custom_notification_item.cc
|
| diff --git a/ui/arc/notification/arc_custom_notification_item.cc b/ui/arc/notification/arc_custom_notification_item.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f75dcfe67570752f5df790df062020643199103a
|
| --- /dev/null
|
| +++ b/ui/arc/notification/arc_custom_notification_item.cc
|
| @@ -0,0 +1,123 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "ui/arc/notification/arc_custom_notification_item.h"
|
| +
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/strings/string16.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| +#include "components/exo/notification_surface.h"
|
| +#include "ui/arc/notification/arc_custom_notification_view.h"
|
| +#include "ui/message_center/notification.h"
|
| +#include "ui/message_center/notification_types.h"
|
| +
|
| +namespace arc {
|
| +
|
| +namespace {
|
| +
|
| +constexpr char kNotifierId[] = "ARC_NOTIFICATION";
|
| +
|
| +exo::NotificationSurfaceRegistry* notification_surface_registry = nullptr;
|
| +
|
| +class ArcNotificationDelegate : public message_center::NotificationDelegate {
|
| + public:
|
| + ArcNotificationDelegate() {}
|
| +
|
| + std::unique_ptr<views::View> CreateCustomContent() override {
|
| + if (!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 {}
|
| +
|
| + exo::NotificationSurface* surface_ = nullptr;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ArcNotificationDelegate);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +ArcCustomNotificationItem::ArcCustomNotificationItem(
|
| + ArcNotificationManager* manager,
|
| + message_center::MessageCenter* message_center,
|
| + const std::string& notification_key,
|
| + const AccountId& profile_id)
|
| + : ArcNotificationItem(manager,
|
| + message_center,
|
| + notification_key,
|
| + profile_id) {}
|
| +
|
| +ArcCustomNotificationItem::~ArcCustomNotificationItem() {
|
| + if (notification_surface_registry)
|
| + notification_surface_registry->RemoveObserver(this);
|
| +}
|
| +
|
| +// static
|
| +void ArcCustomNotificationItem::SetNotificationSurfaceRegistry(
|
| + exo::NotificationSurfaceRegistry* registry) {
|
| + notification_surface_registry = registry;
|
| +}
|
| +
|
| +void ArcCustomNotificationItem::UpdateWithArcNotificationData(
|
| + const mojom::ArcNotificationData& data) {
|
| + DCHECK(CalledOnValidThread());
|
| + DCHECK(notification_key() == data.key);
|
| +
|
| + if (CacheArcNotificationData(data))
|
| + return;
|
| +
|
| + message_center::RichNotificationData rich_data;
|
| + rich_data.pinned = (data.no_clear || data.ongoing_event);
|
| + rich_data.priority = ConvertAndroidPriority(data.priority);
|
| +
|
| + message_center::NotifierId notifier_id(
|
| + message_center::NotifierId::SYSTEM_COMPONENT, kNotifierId);
|
| + notifier_id.profile_id = profile_id().GetUserEmail();
|
| +
|
| + DCHECK(!data.title.is_null());
|
| + DCHECK(!data.message.is_null());
|
| + SetNotification(base::WrapUnique(new message_center::Notification(
|
| + message_center::NOTIFICATION_TYPE_CUSTOM, notification_id(),
|
| + base::UTF8ToUTF16(data.title.get()),
|
| + base::UTF8ToUTF16(data.message.get()), gfx::Image(),
|
| + base::UTF8ToUTF16("arc"), // display source
|
| + GURL(), // empty origin url, for system component
|
| + notifier_id, rich_data, new ArcNotificationDelegate())));
|
| +
|
| + exo::NotificationSurface* surface =
|
| + notification_surface_registry->GetSurface(notification_key());
|
| + if (surface)
|
| + OnNotificationSurfaceAdded(surface);
|
| + else
|
| + notification_surface_registry->AddObserver(this);
|
| +}
|
| +
|
| +void ArcCustomNotificationItem::OnNotificationSurfaceAdded(
|
| + exo::NotificationSurface* surface) {
|
| + if (!pending_notification() ||
|
| + surface->notification_id() != notification_key())
|
| + return;
|
| +
|
| + static_cast<ArcNotificationDelegate*>(pending_notification()->delegate())
|
| + ->set_notification_surface(surface);
|
| + AddToMessageCenter();
|
| +}
|
| +
|
| +void ArcCustomNotificationItem::OnNotificationSurfaceRemoved(
|
| + exo::NotificationSurface* surface) {
|
| + if (surface->notification_id() != notification_key())
|
| + return;
|
| +
|
| + OnClosedFromAndroid(false);
|
| +}
|
| +
|
| +} // namespace arc
|
|
|