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

Unified Diff: ash/common/system/chromeos/network/tray_sms.cc

Issue 2583393002: Send notification to users upon receiving sms messages (Closed)
Patch Set: update return type Created 3 years, 10 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: ash/common/system/chromeos/network/tray_sms.cc
diff --git a/ash/common/system/chromeos/network/tray_sms.cc b/ash/common/system/chromeos/network/tray_sms.cc
deleted file mode 100644
index a66886308ce283668e8021676646bbf9dab10b54..0000000000000000000000000000000000000000
--- a/ash/common/system/chromeos/network/tray_sms.cc
+++ /dev/null
@@ -1,428 +0,0 @@
-// Copyright (c) 2012 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 "ash/common/system/chromeos/network/tray_sms.h"
-
-#include <utility>
-
-#include "ash/common/material_design/material_design_controller.h"
-#include "ash/common/metrics/user_metrics_action.h"
-#include "ash/common/system/tray/fixed_sized_scroll_view.h"
-#include "ash/common/system/tray/system_tray.h"
-#include "ash/common/system/tray/system_tray_bubble.h"
-#include "ash/common/system/tray/tray_constants.h"
-#include "ash/common/system/tray/tray_details_view.h"
-#include "ash/common/system/tray/tray_item_more.h"
-#include "ash/common/system/tray/tray_item_view.h"
-#include "ash/common/system/tray/tray_notification_view.h"
-#include "ash/common/wm_shell.h"
-#include "ash/resources/vector_icons/vector_icons.h"
-#include "base/memory/ptr_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chromeos/network/network_event_log.h"
-#include "chromeos/network/network_handler.h"
-#include "grit/ash_resources.h"
-#include "grit/ash_strings.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/gfx/paint_vector_icon.h"
-#include "ui/views/bubble/tray_bubble_view.h"
-#include "ui/views/controls/image_view.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/layout/box_layout.h"
-#include "ui/views/layout/fill_layout.h"
-#include "ui/views/layout/grid_layout.h"
-#include "ui/views/view.h"
-
-namespace {
-
-// Min height of the list of messages in the popup.
-const int kMessageListMinHeight = 200;
-// Top/bottom padding of the text items.
-const int kPaddingVertical = 10;
-
-const char kSmsNumberKey[] = "number";
-const char kSmsTextKey[] = "text";
-
-bool GetMessageFromDictionary(const base::DictionaryValue* message,
- std::string* number,
- std::string* text) {
- if (!message->GetStringWithoutPathExpansion(kSmsNumberKey, number))
- return false;
- if (!message->GetStringWithoutPathExpansion(kSmsTextKey, text))
- return false;
- return true;
-}
-
-} // namespace
-
-namespace ash {
-
-class TraySms::SmsDefaultView : public TrayItemMore {
- public:
- explicit SmsDefaultView(TraySms* owner) : TrayItemMore(owner, true) {
- if (MaterialDesignController::UseMaterialDesignSystemIcons()) {
- SetImage(gfx::CreateVectorIcon(kSystemMenuSmsIcon, kMenuIconSize,
- kMenuIconColor));
- } else {
- SetImage(*ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
- IDR_AURA_UBER_TRAY_SMS));
- }
- Update();
- }
-
- ~SmsDefaultView() override {}
-
- void Update() {
- int message_count = static_cast<TraySms*>(owner())->messages().GetSize();
- // TODO(jshin): Currently, a tabular format is used ("SMS Messages:
- // <count>"). Check with UX if '<count> SMS messages' with a proper plural
- // support is desired.
- base::string16 label = l10n_util::GetStringFUTF16Int(
- IDS_ASH_STATUS_TRAY_SMS_MESSAGES, message_count);
- SetLabel(label);
- SetAccessibleName(label);
- }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(SmsDefaultView);
-};
-
-// An entry (row) in SmsDetailedView or NotificationView.
-class TraySms::SmsMessageView : public views::View,
- public views::ButtonListener {
- public:
- enum ViewType { VIEW_DETAILED, VIEW_NOTIFICATION };
-
- SmsMessageView(TraySms* owner,
- ViewType view_type,
- size_t index,
- const std::string& number,
- const std::string& message)
- : owner_(owner), index_(index) {
- // TODO(jshin): Convert ASCII digits in |number| (phone number) to native
- // digits if necessary. |number| can contain non-digit characters and may
- // have to be converted one-by-one or use libphonenumber's formating API.
- number_label_ = new views::Label(
- l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_SMS_NUMBER,
- base::UTF8ToUTF16(number)),
- ui::ResourceBundle::GetSharedInstance().GetFontList(
- ui::ResourceBundle::BoldFont));
- number_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-
- message_label_ = new views::Label(base::UTF8ToUTF16(message));
- message_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- message_label_->SetMultiLine(true);
-
- if (view_type == VIEW_DETAILED)
- LayoutDetailedView();
- else
- LayoutNotificationView();
- }
-
- ~SmsMessageView() override {}
-
- // Overridden from ButtonListener.
- void ButtonPressed(views::Button* sender, const ui::Event& event) override {
- if (owner_->RemoveMessage(index_)) {
- WmShell::Get()->RecordUserMetricsAction(
- UMA_STATUS_AREA_SMS_DETAILED_DISMISS_MSG);
- }
- owner_->Update(false);
- }
-
- private:
- void LayoutDetailedView() {
- views::ImageButton* close_button = new views::ImageButton(this);
- close_button->SetImage(
- views::CustomButton::STATE_NORMAL,
- ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
- IDR_AURA_UBER_TRAY_SMS_DISMISS));
- const int msg_width =
- owner_->system_tray()
- ->GetSystemBubble()
- ->bubble_view()
- ->GetPreferredSize()
- .width() -
- (kNotificationIconWidth + kTrayPopupPaddingHorizontal * 2);
- message_label_->SizeToFit(msg_width);
-
- views::GridLayout* layout = new views::GridLayout(this);
- SetLayoutManager(layout);
-
- views::ColumnSet* columns = layout->AddColumnSet(0);
-
- // Message
- columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal);
- columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL,
- 0 /* resize percent */, views::GridLayout::FIXED,
- msg_width, msg_width);
-
- // Close button
- columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER,
- 0, /* resize percent */
- views::GridLayout::FIXED, kNotificationIconWidth,
- kNotificationIconWidth);
-
- layout->AddPaddingRow(0, kPaddingVertical);
- layout->StartRow(0, 0);
- layout->AddView(number_label_);
- layout->AddView(close_button, 1, 2); // 2 rows for icon
- layout->StartRow(0, 0);
- layout->AddView(message_label_);
-
- layout->AddPaddingRow(0, kPaddingVertical);
- }
-
- void LayoutNotificationView() {
- SetLayoutManager(
- new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1));
- AddChildView(number_label_);
- message_label_->SizeToFit(kTrayNotificationContentsWidth);
- AddChildView(message_label_);
- }
-
- TraySms* owner_;
- size_t index_;
- views::Label* number_label_;
- views::Label* message_label_;
-
- DISALLOW_COPY_AND_ASSIGN(SmsMessageView);
-};
-
-class TraySms::SmsDetailedView : public TrayDetailsView {
- public:
- explicit SmsDetailedView(TraySms* owner) : TrayDetailsView(owner) {
- Init();
- Update();
- }
-
- ~SmsDetailedView() override {}
-
- void Init() {
- CreateScrollableList();
- CreateTitleRow(IDS_ASH_STATUS_TRAY_SMS);
- }
-
- void Update() {
- UpdateMessageList();
- Layout();
- SchedulePaint();
- }
-
- // Overridden from views::View.
- gfx::Size GetPreferredSize() const override {
- gfx::Size preferred_size = TrayDetailsView::GetPreferredSize();
- if (preferred_size.height() < kMessageListMinHeight)
- preferred_size.set_height(kMessageListMinHeight);
- return preferred_size;
- }
-
- private:
- void UpdateMessageList() {
- const base::ListValue& messages =
- static_cast<TraySms*>(owner())->messages();
- scroll_content()->RemoveAllChildViews(true);
- for (size_t index = 0; index < messages.GetSize(); ++index) {
- const base::DictionaryValue* message = nullptr;
- if (!messages.GetDictionary(index, &message)) {
- LOG(ERROR) << "SMS message not a dictionary at: " << index;
- continue;
- }
- std::string number, text;
- if (!GetMessageFromDictionary(message, &number, &text)) {
- LOG(ERROR) << "Error parsing SMS message";
- continue;
- }
- SmsMessageView* msgview = new SmsMessageView(
- static_cast<TraySms*>(owner()), SmsMessageView::VIEW_DETAILED, index,
- number, text);
- scroll_content()->AddChildView(msgview);
- }
- scroller()->Layout();
- }
-
- DISALLOW_COPY_AND_ASSIGN(SmsDetailedView);
-};
-
-class TraySms::SmsNotificationView : public TrayNotificationView {
- public:
- SmsNotificationView(TraySms* owner,
- size_t message_index,
- const std::string& number,
- const std::string& text)
- : TrayNotificationView(owner, IDR_AURA_UBER_TRAY_SMS),
- message_index_(message_index) {
- SmsMessageView* message_view = new SmsMessageView(
- owner, SmsMessageView::VIEW_NOTIFICATION, message_index_, number, text);
- InitView(message_view);
- }
-
- void Update(size_t message_index,
- const std::string& number,
- const std::string& text) {
- SmsMessageView* message_view =
- new SmsMessageView(tray_sms(), SmsMessageView::VIEW_NOTIFICATION,
- message_index_, number, text);
- UpdateView(message_view);
- }
-
- // Overridden from TrayNotificationView:
- void OnClose() override {
- if (tray_sms()->RemoveMessage(message_index_)) {
- WmShell::Get()->RecordUserMetricsAction(
- UMA_STATUS_AREA_SMS_NOTIFICATION_DISMISS_MSG);
- }
- }
-
- void OnClickAction() override { owner()->PopupDetailedView(0, true); }
-
- private:
- TraySms* tray_sms() { return static_cast<TraySms*>(owner()); }
-
- size_t message_index_;
-
- DISALLOW_COPY_AND_ASSIGN(SmsNotificationView);
-};
-
-TraySms::TraySms(SystemTray* system_tray)
- : SystemTrayItem(system_tray, UMA_SMS),
- default_(nullptr),
- detailed_(nullptr),
- notification_(nullptr) {
- // TODO(armansito): SMS could be a special case for cellular that requires a
- // user (perhaps the owner) to be logged in. If that is the case, then an
- // additional check should be done before subscribing for SMS notifications.
- if (chromeos::NetworkHandler::IsInitialized())
- chromeos::NetworkHandler::Get()->network_sms_handler()->AddObserver(this);
-}
-
-TraySms::~TraySms() {
- if (chromeos::NetworkHandler::IsInitialized()) {
- chromeos::NetworkHandler::Get()->network_sms_handler()->RemoveObserver(
- this);
- }
-}
-
-views::View* TraySms::CreateDefaultView(LoginStatus status) {
- CHECK(default_ == nullptr);
- default_ = new SmsDefaultView(this);
- default_->SetVisible(!messages_.empty());
- return default_;
-}
-
-views::View* TraySms::CreateDetailedView(LoginStatus status) {
- CHECK(detailed_ == nullptr);
- HideNotificationView();
- if (messages_.empty())
- return nullptr;
- detailed_ = new SmsDetailedView(this);
- WmShell::Get()->RecordUserMetricsAction(UMA_STATUS_AREA_DETAILED_SMS_VIEW);
- return detailed_;
-}
-
-views::View* TraySms::CreateNotificationView(LoginStatus status) {
- CHECK(notification_ == nullptr);
- if (detailed_)
- return nullptr;
- size_t index;
- std::string number, text;
- if (GetLatestMessage(&index, &number, &text))
- notification_ = new SmsNotificationView(this, index, number, text);
- return notification_;
-}
-
-void TraySms::DestroyDefaultView() {
- default_ = nullptr;
-}
-
-void TraySms::DestroyDetailedView() {
- detailed_ = nullptr;
-}
-
-void TraySms::DestroyNotificationView() {
- notification_ = nullptr;
-}
-
-void TraySms::MessageReceived(const base::DictionaryValue& message) {
- std::string message_text;
- if (!message.GetStringWithoutPathExpansion(
- chromeos::NetworkSmsHandler::kTextKey, &message_text)) {
- NET_LOG_ERROR("SMS message contains no content.", "");
- return;
- }
- // TODO(armansito): A message might be due to a special "Message Waiting"
- // state that the message is in. Once SMS handling moves to shill, such
- // messages should be filtered there so that this check becomes unnecessary.
- if (message_text.empty()) {
- NET_LOG_DEBUG("SMS has empty content text. Ignoring.", "");
- return;
- }
- std::string message_number;
- if (!message.GetStringWithoutPathExpansion(
- chromeos::NetworkSmsHandler::kNumberKey, &message_number)) {
- NET_LOG_DEBUG("SMS contains no number. Ignoring.", "");
- return;
- }
-
- NET_LOG_DEBUG(
- "Received SMS from: " + message_number + " with text: " + message_text,
- "");
-
- auto dict = base::MakeUnique<base::DictionaryValue>();
- dict->SetString(kSmsNumberKey, message_number);
- dict->SetString(kSmsTextKey, message_text);
- messages_.Append(std::move(dict));
- Update(true);
-}
-
-bool TraySms::GetLatestMessage(size_t* index,
- std::string* number,
- std::string* text) {
- if (messages_.empty())
- return false;
- base::DictionaryValue* message;
- size_t message_index = messages_.GetSize() - 1;
- if (!messages_.GetDictionary(message_index, &message))
- return false;
- if (!GetMessageFromDictionary(message, number, text))
- return false;
- *index = message_index;
- return true;
-}
-
-bool TraySms::RemoveMessage(size_t index) {
- if (index >= messages_.GetSize())
- return false;
- messages_.Remove(index, nullptr);
- return true;
-}
-
-void TraySms::Update(bool notify) {
- if (messages_.empty()) {
- if (default_)
- default_->SetVisible(false);
- if (detailed_)
- HideDetailedView(true /* animate */);
- HideNotificationView();
- } else {
- if (default_) {
- default_->SetVisible(true);
- default_->Update();
- }
- if (detailed_)
- detailed_->Update();
- if (notification_) {
- size_t index;
- std::string number, text;
- if (GetLatestMessage(&index, &number, &text))
- notification_->Update(index, number, text);
- } else if (notify) {
- ShowNotificationView();
- }
- }
-}
-
-} // namespace ash
« no previous file with comments | « ash/common/system/chromeos/network/tray_sms.h ('k') | ash/common/system/chromeos/screen_security/screen_tray_item.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698