tray_sms.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/chromeos/network/tray_sms.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_switches.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/fixed_sized_scroll_view.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_bubble.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_details_view.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_more.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_view.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_notification_view.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_strings.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/bubble/tray_bubble_view.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/fill_layout.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/grid_layout.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Min height of the list of messages in the popup. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMessageListMinHeight = 200; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Top/bottom padding of the text items. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kPaddingVertical = 10; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetMessageFromDictionary(const base::DictionaryValue* message, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* number, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* text) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!message->GetStringWithoutPathExpansion(ash::kSmsNumberKey, number)) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!message->GetStringWithoutPathExpansion(ash::kSmsTextKey, text)) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TraySms::SmsDefaultView : public TrayItemMore { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit SmsDefaultView(TraySms* owner) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : TrayItemMore(owner, true) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetImage(ResourceBundle::GetSharedInstance().GetImageSkiaNamed( 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_AURA_UBER_TRAY_SMS)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Update(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SmsDefaultView() {} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Update() { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int message_count = static_cast<TraySms*>(owner())->messages().GetSize(); 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 label = l10n_util::GetStringFUTF16( 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_ASH_STATUS_TRAY_SMS_MESSAGES, base::IntToString16(message_count)); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLabel(label); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAccessibleName(label); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SmsDefaultView); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An entry (row) in SmsDetailedView or NotificationView. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TraySms::SmsMessageView : public views::View, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public views::ButtonListener { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ViewType { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VIEW_DETAILED, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VIEW_NOTIFICATION 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SmsMessageView(TraySms* owner, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewType view_type, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t index, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& number, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : owner_(owner), 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index_(index) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number_label_ = new views::Label( 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_SMS_NUMBER, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF8ToUTF16(number))); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number_label_->SetFont( 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number_label_->font().DeriveFont(0, gfx::Font::BOLD)); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_label_ = new views::Label(UTF8ToUTF16(message)); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_label_->SetMultiLine(true); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_type == VIEW_DETAILED) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayoutDetailedView(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayoutNotificationView(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SmsMessageView() { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ButtonListener. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ButtonPressed(views::Button* sender, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Event& event) OVERRIDE { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owner_->RemoveMessage(index_); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owner_->Update(false); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LayoutDetailedView() { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::ImageButton* close_button = new views::ImageButton(this); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) close_button->SetImage(views::CustomButton::STATE_NORMAL, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceBundle::GetSharedInstance().GetImageSkiaNamed( 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_AURA_WINDOW_CLOSE)); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int msg_width = owner_->system_tray()->GetSystemBubble()-> 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bubble_view()->GetPreferredSize().width() - 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (kNotificationIconWidth + kTrayPopupPaddingHorizontal * 2); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_label_->SizeToFit(msg_width); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GridLayout* layout = new views::GridLayout(this); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLayoutManager(layout); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::ColumnSet* columns = layout->AddColumnSet(0); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Message 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0 /* resize percent */, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GridLayout::FIXED, msg_width, msg_width); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close button 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* resize percent */ 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GridLayout::FIXED, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kNotificationIconWidth, kNotificationIconWidth); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddPaddingRow(0, kPaddingVertical); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0, 0); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(number_label_); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(close_button, 1, 2); // 2 rows for icon 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0, 0); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(message_label_); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddPaddingRow(0, kPaddingVertical); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LayoutNotificationView() { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLayoutManager( 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1)); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(number_label_); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_label_->SizeToFit(kTrayNotificationContentsWidth); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(message_label_); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TraySms* owner_; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t index_; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* number_label_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* message_label_; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SmsMessageView); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TraySms::SmsDetailedView : public TrayDetailsView, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ViewClickListener { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit SmsDetailedView(TraySms* owner) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : TrayDetailsView(owner) { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Update(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SmsDetailedView() { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Init() { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateScrollableList(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSpecialRow(IDS_ASH_STATUS_TRAY_SMS, this); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Update() { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateMessageList(); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layout(); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::View. 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gfx::Size GetPreferredSize() OVERRIDE { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size preferred_size = TrayDetailsView::GetPreferredSize(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (preferred_size.height() < kMessageListMinHeight) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preferred_size.set_height(kMessageListMinHeight); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return preferred_size; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateMessageList() { 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue& messages = 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<TraySms*>(owner())->messages(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scroll_content()->RemoveAllChildViews(true); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t index = 0; index < messages.GetSize(); ++index) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* message = NULL; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!messages.GetDictionary(index, &message)) { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "SMS message not a dictionary at: " << index; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string number, text; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetMessageFromDictionary(message, &number, &text)) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Error parsing SMS message"; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SmsMessageView* msgview = new SmsMessageView( 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<TraySms*>(owner()), SmsMessageView::VIEW_DETAILED, index, 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) number, text); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scroll_content()->AddChildView(msgview); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scroller()->Layout(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ViewClickListener. 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnViewClicked(views::View* sender) OVERRIDE { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sender == footer()->content()) 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owner()->system_tray()->ShowDefaultView(BUBBLE_USE_EXISTING); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SmsDetailedView); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TraySms::SmsNotificationView : public TrayNotificationView { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SmsNotificationView(TraySms* owner, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t message_index, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& number, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& text) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : TrayNotificationView(owner, IDR_AURA_UBER_TRAY_SMS), 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_index_(message_index) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SmsMessageView* message_view = new SmsMessageView( 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owner, SmsMessageView::VIEW_NOTIFICATION, message_index_, number, text); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitView(message_view); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Update(size_t message_index, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& number, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& text) { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SmsMessageView* message_view = new SmsMessageView( 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tray_sms(), SmsMessageView::VIEW_NOTIFICATION, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_index_, number, text); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateView(message_view); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from TrayNotificationView: 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnClose() OVERRIDE { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tray_sms()->RemoveMessage(message_index_); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnClickAction() OVERRIDE { 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owner()->PopupDetailedView(0, true); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TraySms* tray_sms() { 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<TraySms*>(owner()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t message_index_; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SmsNotificationView); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TraySms::TraySms(SystemTray* system_tray) 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : SystemTrayItem(system_tray), 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_(NULL), 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detailed_(NULL), 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_(NULL) { 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->system_tray_notifier()->AddSmsObserver(this); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TraySms::~TraySms() { 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->system_tray_notifier()->RemoveSmsObserver(this); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TraySms::CreateDefaultView(user::LoginStatus status) { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(default_ == NULL); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_ = new SmsDefaultView(this); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_->SetVisible(!messages_.empty()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TraySms::CreateDetailedView(user::LoginStatus status) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(detailed_ == NULL); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HideNotificationView(); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (messages_.empty()) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detailed_ = new SmsDetailedView(this); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return detailed_; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* TraySms::CreateNotificationView(user::LoginStatus status) { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(notification_ == NULL); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (detailed_) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t index; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string number, text; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetLatestMessage(&index, &number, &text)) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_ = new SmsNotificationView(this, index, number, text); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notification_; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraySms::DestroyDefaultView() { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_ = NULL; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraySms::DestroyDetailedView() { 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detailed_ = NULL; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraySms::DestroyNotificationView() { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_ = NULL; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraySms::AddMessage(const base::DictionaryValue& message) { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) messages_.Append(message.DeepCopy()); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Update(true); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TraySms::GetLatestMessage(size_t* index, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* number, 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* text) { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (messages_.empty()) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* message; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t message_index = messages_.GetSize() - 1; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!messages_.GetDictionary(message_index, &message)) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetMessageFromDictionary(message, number, text)) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *index = message_index; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraySms::RemoveMessage(size_t index) { 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index < messages_.GetSize()) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) messages_.Remove(index, NULL); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TraySms::Update(bool notify) { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (messages_.empty()) { 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (default_) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_->SetVisible(false); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (detailed_) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HideDetailedView(); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HideNotificationView(); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (default_) { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_->SetVisible(true); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_->Update(); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (detailed_) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detailed_->Update(); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (notification_) { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t index; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string number, text; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetLatestMessage(&index, &number, &text)) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_->Update(index, number, text); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (notify) { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShowNotificationView(); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 384