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 |