| 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
 | 
| 
 |