| Index: ui/arc/notification/arc_notification_item_impl.cc
|
| diff --git a/ui/arc/notification/arc_notification_item_impl.cc b/ui/arc/notification/arc_notification_item_impl.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d4ed1b0b70f7a58bdabe89538fa37fc613f2667d
|
| --- /dev/null
|
| +++ b/ui/arc/notification/arc_notification_item_impl.cc
|
| @@ -0,0 +1,194 @@
|
| +// Copyright 2017 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_notification_item_impl.h"
|
| +
|
| +#include <utility>
|
| +#include <vector>
|
| +
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| +#include "ui/arc/notification/arc_custom_notification_view.h"
|
| +#include "ui/arc/notification/arc_notification_delegate.h"
|
| +#include "ui/gfx/geometry/size.h"
|
| +#include "ui/gfx/image/image.h"
|
| +#include "ui/message_center/message_center_style.h"
|
| +#include "ui/message_center/notification.h"
|
| +#include "ui/message_center/notification_types.h"
|
| +#include "ui/message_center/notifier_settings.h"
|
| +
|
| +namespace arc {
|
| +
|
| +namespace {
|
| +
|
| +constexpr char kNotifierId[] = "ARC_NOTIFICATION";
|
| +constexpr char kNotificationIdPrefix[] = "ARC_NOTIFICATION_";
|
| +
|
| +// 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
|
| +// TODO(yoshiki): rewrite this conversion as typemap
|
| +int ConvertAndroidPriority(mojom::ArcNotificationPriority android_priority) {
|
| + switch (android_priority) {
|
| + case mojom::ArcNotificationPriority::MIN:
|
| + case mojom::ArcNotificationPriority::LOW:
|
| + return message_center::MIN_PRIORITY;
|
| + case mojom::ArcNotificationPriority::DEFAULT:
|
| + return message_center::LOW_PRIORITY;
|
| + case mojom::ArcNotificationPriority::HIGH:
|
| + return message_center::DEFAULT_PRIORITY;
|
| + case mojom::ArcNotificationPriority::MAX:
|
| + return message_center::MAX_PRIORITY;
|
| + }
|
| +
|
| + NOTREACHED() << "Invalid Priority: " << android_priority;
|
| + return message_center::DEFAULT_PRIORITY;
|
| +}
|
| +
|
| +} // anonymous namespace
|
| +
|
| +ArcNotificationItemImpl::ArcNotificationItemImpl(
|
| + ArcNotificationManager* manager,
|
| + message_center::MessageCenter* message_center,
|
| + const std::string& notification_key,
|
| + const AccountId& profile_id)
|
| + : manager_(manager),
|
| + message_center_(message_center),
|
| + profile_id_(profile_id),
|
| + notification_key_(notification_key),
|
| + notification_id_(kNotificationIdPrefix + notification_key_),
|
| + weak_ptr_factory_(this) {}
|
| +
|
| +ArcNotificationItemImpl::~ArcNotificationItemImpl() {
|
| + for (auto& observer : observers_)
|
| + observer.OnItemDestroying();
|
| +}
|
| +
|
| +void ArcNotificationItemImpl::OnUpdatedFromAndroid(
|
| + mojom::ArcNotificationDataPtr data) {
|
| + DCHECK(CalledOnValidThread());
|
| + DCHECK_EQ(notification_key_, data->key);
|
| +
|
| + message_center::RichNotificationData rich_data;
|
| + rich_data.pinned = (data->no_clear || data->ongoing_event);
|
| + rich_data.priority = ConvertAndroidPriority(data->priority);
|
| + if (data->small_icon)
|
| + rich_data.small_image = gfx::Image::CreateFrom1xBitmap(*data->small_icon);
|
| + if (data->accessible_name.has_value())
|
| + rich_data.accessible_name = base::UTF8ToUTF16(*data->accessible_name);
|
| +
|
| + message_center::NotifierId notifier_id(
|
| + message_center::NotifierId::SYSTEM_COMPONENT, kNotifierId);
|
| + notifier_id.profile_id = profile_id_.GetUserEmail();
|
| +
|
| + auto notification = base::MakeUnique<message_center::Notification>(
|
| + message_center::NOTIFICATION_TYPE_CUSTOM, notification_id_,
|
| + base::UTF8ToUTF16(data->title), base::UTF8ToUTF16(data->message),
|
| + gfx::Image(),
|
| + base::UTF8ToUTF16("arc"), // display source
|
| + GURL(), // empty origin url, for system component
|
| + notifier_id, rich_data,
|
| + new ArcNotificationDelegate(weak_ptr_factory_.GetWeakPtr()));
|
| + notification->set_timestamp(base::Time::FromJavaTime(data->time));
|
| +
|
| + pinned_ = rich_data.pinned;
|
| + expand_state_ = data->expand_state;
|
| + shown_contents_ = data->shown_contents;
|
| +
|
| + if (!data->snapshot_image || data->snapshot_image->isNull()) {
|
| + snapshot_ = gfx::ImageSkia();
|
| + } else {
|
| + snapshot_ = gfx::ImageSkia(
|
| + gfx::ImageSkiaRep(*data->snapshot_image, data->snapshot_image_scale));
|
| + }
|
| +
|
| + for (auto& observer : observers_)
|
| + observer.OnItemUpdated();
|
| +
|
| + message_center_->AddNotification(std::move(notification));
|
| +}
|
| +
|
| +void ArcNotificationItemImpl::OnClosedFromAndroid() {
|
| + being_removed_by_manager_ = true; // Closing is initiated by the manager.
|
| + message_center_->RemoveNotification(notification_id_, false /* by_user */);
|
| +}
|
| +
|
| +void ArcNotificationItemImpl::Close(bool by_user) {
|
| + if (being_removed_by_manager_) {
|
| + // Closing is caused by the manager, so we don't need to nofify a close
|
| + // event to the manager.
|
| + return;
|
| + }
|
| +
|
| + // Do not touch its any members afterwards, because this instance will be
|
| + // destroyed in the following call
|
| + manager_->SendNotificationRemovedFromChrome(notification_key_);
|
| +}
|
| +
|
| +void ArcNotificationItemImpl::Click() {
|
| + manager_->SendNotificationClickedOnChrome(notification_key_);
|
| +}
|
| +
|
| +void ArcNotificationItemImpl::OpenSettings() {
|
| + manager_->OpenNotificationSettings(notification_key_);
|
| +}
|
| +
|
| +bool ArcNotificationItemImpl::IsOpeningSettingsSupported() const {
|
| + return manager_->IsOpeningSettingsSupported();
|
| +}
|
| +
|
| +void ArcNotificationItemImpl::ToggleExpansion() {
|
| + manager_->SendNotificationToggleExpansionOnChrome(notification_key_);
|
| +}
|
| +
|
| +bool ArcNotificationItemImpl::CalledOnValidThread() const {
|
| + return thread_checker_.CalledOnValidThread();
|
| +}
|
| +
|
| +void ArcNotificationItemImpl::AddObserver(Observer* observer) {
|
| + observers_.AddObserver(observer);
|
| +}
|
| +
|
| +void ArcNotificationItemImpl::RemoveObserver(Observer* observer) {
|
| + observers_.RemoveObserver(observer);
|
| +}
|
| +
|
| +void ArcNotificationItemImpl::IncrementWindowRefCount() {
|
| + ++window_ref_count_;
|
| + if (window_ref_count_ == 1)
|
| + manager_->CreateNotificationWindow(notification_key_);
|
| +}
|
| +
|
| +void ArcNotificationItemImpl::DecrementWindowRefCount() {
|
| + DCHECK_GT(window_ref_count_, 0);
|
| + --window_ref_count_;
|
| + if (window_ref_count_ == 0)
|
| + manager_->CloseNotificationWindow(notification_key_);
|
| +}
|
| +
|
| +bool ArcNotificationItemImpl::GetPinned() const {
|
| + return pinned_;
|
| +}
|
| +
|
| +const gfx::ImageSkia& ArcNotificationItemImpl::GetSnapshot() const {
|
| + return snapshot_;
|
| +}
|
| +
|
| +mojom::ArcNotificationExpandState ArcNotificationItemImpl::GetExpandState()
|
| + const {
|
| + return expand_state_;
|
| +}
|
| +
|
| +mojom::ArcNotificationShownContents ArcNotificationItemImpl::GetShownContents()
|
| + const {
|
| + return shown_contents_;
|
| +}
|
| +
|
| +const std::string& ArcNotificationItemImpl::GetNotificationKey() const {
|
| + return notification_key_;
|
| +}
|
| +
|
| +} // namespace arc
|
|
|