| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/system/chromeos/network/tray_sms.h" | 5 #include "ash/system/chromeos/network/tray_sms.h" |
| 6 | 6 |
| 7 #include "ash/common/system/tray/fixed_sized_scroll_view.h" | 7 #include "ash/common/system/tray/fixed_sized_scroll_view.h" |
| 8 #include "ash/common/system/tray/system_tray_bubble.h" | 8 #include "ash/common/system/tray/system_tray_bubble.h" |
| 9 #include "ash/common/system/tray/tray_constants.h" | 9 #include "ash/common/system/tray/tray_constants.h" |
| 10 #include "ash/common/system/tray/tray_details_view.h" | 10 #include "ash/common/system/tray/tray_details_view.h" |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 return false; | 49 return false; |
| 50 return true; | 50 return true; |
| 51 } | 51 } |
| 52 | 52 |
| 53 } // namespace | 53 } // namespace |
| 54 | 54 |
| 55 namespace ash { | 55 namespace ash { |
| 56 | 56 |
| 57 class TraySms::SmsDefaultView : public TrayItemMore { | 57 class TraySms::SmsDefaultView : public TrayItemMore { |
| 58 public: | 58 public: |
| 59 explicit SmsDefaultView(TraySms* owner) | 59 explicit SmsDefaultView(TraySms* owner) : TrayItemMore(owner, true) { |
| 60 : TrayItemMore(owner, true) { | |
| 61 SetImage(ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( | 60 SetImage(ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( |
| 62 IDR_AURA_UBER_TRAY_SMS)); | 61 IDR_AURA_UBER_TRAY_SMS)); |
| 63 Update(); | 62 Update(); |
| 64 } | 63 } |
| 65 | 64 |
| 66 ~SmsDefaultView() override {} | 65 ~SmsDefaultView() override {} |
| 67 | 66 |
| 68 void Update() { | 67 void Update() { |
| 69 int message_count = static_cast<TraySms*>(owner())->messages().GetSize(); | 68 int message_count = static_cast<TraySms*>(owner())->messages().GetSize(); |
| 70 // TODO(jshin): Currently, a tabular format is used ("SMS Messages: | 69 // TODO(jshin): Currently, a tabular format is used ("SMS Messages: |
| 71 // <count>"). Check with UX if '<count> SMS messages' with a proper plural | 70 // <count>"). Check with UX if '<count> SMS messages' with a proper plural |
| 72 // support is desired. | 71 // support is desired. |
| 73 base::string16 label = l10n_util::GetStringFUTF16Int( | 72 base::string16 label = l10n_util::GetStringFUTF16Int( |
| 74 IDS_ASH_STATUS_TRAY_SMS_MESSAGES, message_count); | 73 IDS_ASH_STATUS_TRAY_SMS_MESSAGES, message_count); |
| 75 SetLabel(label); | 74 SetLabel(label); |
| 76 SetAccessibleName(label); | 75 SetAccessibleName(label); |
| 77 } | 76 } |
| 78 | 77 |
| 79 private: | 78 private: |
| 80 DISALLOW_COPY_AND_ASSIGN(SmsDefaultView); | 79 DISALLOW_COPY_AND_ASSIGN(SmsDefaultView); |
| 81 }; | 80 }; |
| 82 | 81 |
| 83 // An entry (row) in SmsDetailedView or NotificationView. | 82 // An entry (row) in SmsDetailedView or NotificationView. |
| 84 class TraySms::SmsMessageView : public views::View, | 83 class TraySms::SmsMessageView : public views::View, |
| 85 public views::ButtonListener { | 84 public views::ButtonListener { |
| 86 public: | 85 public: |
| 87 enum ViewType { | 86 enum ViewType { VIEW_DETAILED, VIEW_NOTIFICATION }; |
| 88 VIEW_DETAILED, | |
| 89 VIEW_NOTIFICATION | |
| 90 }; | |
| 91 | 87 |
| 92 SmsMessageView(TraySms* owner, | 88 SmsMessageView(TraySms* owner, |
| 93 ViewType view_type, | 89 ViewType view_type, |
| 94 size_t index, | 90 size_t index, |
| 95 const std::string& number, | 91 const std::string& number, |
| 96 const std::string& message) | 92 const std::string& message) |
| 97 : owner_(owner), | 93 : owner_(owner), index_(index) { |
| 98 index_(index) { | |
| 99 // TODO(jshin): Convert ASCII digits in |number| (phone number) to native | 94 // TODO(jshin): Convert ASCII digits in |number| (phone number) to native |
| 100 // digits if necessary. |number| can contain non-digit characters and may | 95 // digits if necessary. |number| can contain non-digit characters and may |
| 101 // have to be converted one-by-one or use libphonenumber's formating API. | 96 // have to be converted one-by-one or use libphonenumber's formating API. |
| 102 number_label_ = new views::Label( | 97 number_label_ = new views::Label( |
| 103 l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_SMS_NUMBER, | 98 l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_SMS_NUMBER, |
| 104 base::UTF8ToUTF16(number)), | 99 base::UTF8ToUTF16(number)), |
| 105 ui::ResourceBundle::GetSharedInstance().GetFontList( | 100 ui::ResourceBundle::GetSharedInstance().GetFontList( |
| 106 ui::ResourceBundle::BoldFont)); | 101 ui::ResourceBundle::BoldFont)); |
| 107 number_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); | 102 number_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| 108 | 103 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 124 owner_->Update(false); | 119 owner_->Update(false); |
| 125 } | 120 } |
| 126 | 121 |
| 127 private: | 122 private: |
| 128 void LayoutDetailedView() { | 123 void LayoutDetailedView() { |
| 129 views::ImageButton* close_button = new views::ImageButton(this); | 124 views::ImageButton* close_button = new views::ImageButton(this); |
| 130 close_button->SetImage( | 125 close_button->SetImage( |
| 131 views::CustomButton::STATE_NORMAL, | 126 views::CustomButton::STATE_NORMAL, |
| 132 ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( | 127 ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( |
| 133 IDR_AURA_UBER_TRAY_SMS_DISMISS)); | 128 IDR_AURA_UBER_TRAY_SMS_DISMISS)); |
| 134 const int msg_width = owner_->system_tray()->GetSystemBubble()-> | 129 const int msg_width = |
| 135 bubble_view()->GetPreferredSize().width() - | 130 owner_->system_tray() |
| 136 (kNotificationIconWidth + kTrayPopupPaddingHorizontal * 2); | 131 ->GetSystemBubble() |
| 132 ->bubble_view() |
| 133 ->GetPreferredSize() |
| 134 .width() - |
| 135 (kNotificationIconWidth + kTrayPopupPaddingHorizontal * 2); |
| 137 message_label_->SizeToFit(msg_width); | 136 message_label_->SizeToFit(msg_width); |
| 138 | 137 |
| 139 views::GridLayout* layout = new views::GridLayout(this); | 138 views::GridLayout* layout = new views::GridLayout(this); |
| 140 SetLayoutManager(layout); | 139 SetLayoutManager(layout); |
| 141 | 140 |
| 142 views::ColumnSet* columns = layout->AddColumnSet(0); | 141 views::ColumnSet* columns = layout->AddColumnSet(0); |
| 143 | 142 |
| 144 // Message | 143 // Message |
| 145 columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal); | 144 columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal); |
| 146 columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, | 145 columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, |
| 147 0 /* resize percent */, | 146 0 /* resize percent */, views::GridLayout::FIXED, |
| 148 views::GridLayout::FIXED, msg_width, msg_width); | 147 msg_width, msg_width); |
| 149 | 148 |
| 150 // Close button | 149 // Close button |
| 151 columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, | 150 columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER, |
| 152 0, /* resize percent */ | 151 0, /* resize percent */ |
| 153 views::GridLayout::FIXED, | 152 views::GridLayout::FIXED, kNotificationIconWidth, |
| 154 kNotificationIconWidth, kNotificationIconWidth); | 153 kNotificationIconWidth); |
| 155 | |
| 156 | 154 |
| 157 layout->AddPaddingRow(0, kPaddingVertical); | 155 layout->AddPaddingRow(0, kPaddingVertical); |
| 158 layout->StartRow(0, 0); | 156 layout->StartRow(0, 0); |
| 159 layout->AddView(number_label_); | 157 layout->AddView(number_label_); |
| 160 layout->AddView(close_button, 1, 2); // 2 rows for icon | 158 layout->AddView(close_button, 1, 2); // 2 rows for icon |
| 161 layout->StartRow(0, 0); | 159 layout->StartRow(0, 0); |
| 162 layout->AddView(message_label_); | 160 layout->AddView(message_label_); |
| 163 | 161 |
| 164 layout->AddPaddingRow(0, kPaddingVertical); | 162 layout->AddPaddingRow(0, kPaddingVertical); |
| 165 } | 163 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 176 size_t index_; | 174 size_t index_; |
| 177 views::Label* number_label_; | 175 views::Label* number_label_; |
| 178 views::Label* message_label_; | 176 views::Label* message_label_; |
| 179 | 177 |
| 180 DISALLOW_COPY_AND_ASSIGN(SmsMessageView); | 178 DISALLOW_COPY_AND_ASSIGN(SmsMessageView); |
| 181 }; | 179 }; |
| 182 | 180 |
| 183 class TraySms::SmsDetailedView : public TrayDetailsView, | 181 class TraySms::SmsDetailedView : public TrayDetailsView, |
| 184 public ViewClickListener { | 182 public ViewClickListener { |
| 185 public: | 183 public: |
| 186 explicit SmsDetailedView(TraySms* owner) | 184 explicit SmsDetailedView(TraySms* owner) : TrayDetailsView(owner) { |
| 187 : TrayDetailsView(owner) { | |
| 188 Init(); | 185 Init(); |
| 189 Update(); | 186 Update(); |
| 190 } | 187 } |
| 191 | 188 |
| 192 ~SmsDetailedView() override {} | 189 ~SmsDetailedView() override {} |
| 193 | 190 |
| 194 void Init() { | 191 void Init() { |
| 195 CreateScrollableList(); | 192 CreateScrollableList(); |
| 196 CreateSpecialRow(IDS_ASH_STATUS_TRAY_SMS, this); | 193 CreateSpecialRow(IDS_ASH_STATUS_TRAY_SMS, this); |
| 197 } | 194 } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 : TrayNotificationView(owner, IDR_AURA_UBER_TRAY_SMS), | 249 : TrayNotificationView(owner, IDR_AURA_UBER_TRAY_SMS), |
| 253 message_index_(message_index) { | 250 message_index_(message_index) { |
| 254 SmsMessageView* message_view = new SmsMessageView( | 251 SmsMessageView* message_view = new SmsMessageView( |
| 255 owner, SmsMessageView::VIEW_NOTIFICATION, message_index_, number, text); | 252 owner, SmsMessageView::VIEW_NOTIFICATION, message_index_, number, text); |
| 256 InitView(message_view); | 253 InitView(message_view); |
| 257 } | 254 } |
| 258 | 255 |
| 259 void Update(size_t message_index, | 256 void Update(size_t message_index, |
| 260 const std::string& number, | 257 const std::string& number, |
| 261 const std::string& text) { | 258 const std::string& text) { |
| 262 SmsMessageView* message_view = new SmsMessageView( | 259 SmsMessageView* message_view = |
| 263 tray_sms(), SmsMessageView::VIEW_NOTIFICATION, | 260 new SmsMessageView(tray_sms(), SmsMessageView::VIEW_NOTIFICATION, |
| 264 message_index_, number, text); | 261 message_index_, number, text); |
| 265 UpdateView(message_view); | 262 UpdateView(message_view); |
| 266 } | 263 } |
| 267 | 264 |
| 268 // Overridden from TrayNotificationView: | 265 // Overridden from TrayNotificationView: |
| 269 void OnClose() override { tray_sms()->RemoveMessage(message_index_); } | 266 void OnClose() override { tray_sms()->RemoveMessage(message_index_); } |
| 270 | 267 |
| 271 void OnClickAction() override { owner()->PopupDetailedView(0, true); } | 268 void OnClickAction() override { owner()->PopupDetailedView(0, true); } |
| 272 | 269 |
| 273 private: | 270 private: |
| 274 TraySms* tray_sms() { | 271 TraySms* tray_sms() { return static_cast<TraySms*>(owner()); } |
| 275 return static_cast<TraySms*>(owner()); | |
| 276 } | |
| 277 | 272 |
| 278 size_t message_index_; | 273 size_t message_index_; |
| 279 | 274 |
| 280 DISALLOW_COPY_AND_ASSIGN(SmsNotificationView); | 275 DISALLOW_COPY_AND_ASSIGN(SmsNotificationView); |
| 281 }; | 276 }; |
| 282 | 277 |
| 283 TraySms::TraySms(SystemTray* system_tray) | 278 TraySms::TraySms(SystemTray* system_tray) |
| 284 : SystemTrayItem(system_tray), | 279 : SystemTrayItem(system_tray), |
| 285 default_(NULL), | 280 default_(NULL), |
| 286 detailed_(NULL), | 281 detailed_(NULL), |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 | 327 |
| 333 void TraySms::DestroyDetailedView() { | 328 void TraySms::DestroyDetailedView() { |
| 334 detailed_ = NULL; | 329 detailed_ = NULL; |
| 335 } | 330 } |
| 336 | 331 |
| 337 void TraySms::DestroyNotificationView() { | 332 void TraySms::DestroyNotificationView() { |
| 338 notification_ = NULL; | 333 notification_ = NULL; |
| 339 } | 334 } |
| 340 | 335 |
| 341 void TraySms::MessageReceived(const base::DictionaryValue& message) { | 336 void TraySms::MessageReceived(const base::DictionaryValue& message) { |
| 342 | |
| 343 std::string message_text; | 337 std::string message_text; |
| 344 if (!message.GetStringWithoutPathExpansion( | 338 if (!message.GetStringWithoutPathExpansion( |
| 345 chromeos::NetworkSmsHandler::kTextKey, &message_text)) { | 339 chromeos::NetworkSmsHandler::kTextKey, &message_text)) { |
| 346 NET_LOG_ERROR("SMS message contains no content.", ""); | 340 NET_LOG_ERROR("SMS message contains no content.", ""); |
| 347 return; | 341 return; |
| 348 } | 342 } |
| 349 // TODO(armansito): A message might be due to a special "Message Waiting" | 343 // TODO(armansito): A message might be due to a special "Message Waiting" |
| 350 // state that the message is in. Once SMS handling moves to shill, such | 344 // state that the message is in. Once SMS handling moves to shill, such |
| 351 // messages should be filtered there so that this check becomes unnecessary. | 345 // messages should be filtered there so that this check becomes unnecessary. |
| 352 if (message_text.empty()) { | 346 if (message_text.empty()) { |
| 353 NET_LOG_DEBUG("SMS has empty content text. Ignoring.", ""); | 347 NET_LOG_DEBUG("SMS has empty content text. Ignoring.", ""); |
| 354 return; | 348 return; |
| 355 } | 349 } |
| 356 std::string message_number; | 350 std::string message_number; |
| 357 if (!message.GetStringWithoutPathExpansion( | 351 if (!message.GetStringWithoutPathExpansion( |
| 358 chromeos::NetworkSmsHandler::kNumberKey, &message_number)) { | 352 chromeos::NetworkSmsHandler::kNumberKey, &message_number)) { |
| 359 NET_LOG_DEBUG("SMS contains no number. Ignoring.", ""); | 353 NET_LOG_DEBUG("SMS contains no number. Ignoring.", ""); |
| 360 return; | 354 return; |
| 361 } | 355 } |
| 362 | 356 |
| 363 NET_LOG_DEBUG("Received SMS from: " + message_number + " with text: " + | 357 NET_LOG_DEBUG( |
| 364 message_text, ""); | 358 "Received SMS from: " + message_number + " with text: " + message_text, |
| 359 ""); |
| 365 | 360 |
| 366 base::DictionaryValue* dict = new base::DictionaryValue(); | 361 base::DictionaryValue* dict = new base::DictionaryValue(); |
| 367 dict->SetString(kSmsNumberKey, message_number); | 362 dict->SetString(kSmsNumberKey, message_number); |
| 368 dict->SetString(kSmsTextKey, message_text); | 363 dict->SetString(kSmsTextKey, message_text); |
| 369 messages_.Append(dict); | 364 messages_.Append(dict); |
| 370 Update(true); | 365 Update(true); |
| 371 } | 366 } |
| 372 | 367 |
| 373 bool TraySms::GetLatestMessage(size_t* index, | 368 bool TraySms::GetLatestMessage(size_t* index, |
| 374 std::string* number, | 369 std::string* number, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 409 std::string number, text; | 404 std::string number, text; |
| 410 if (GetLatestMessage(&index, &number, &text)) | 405 if (GetLatestMessage(&index, &number, &text)) |
| 411 notification_->Update(index, number, text); | 406 notification_->Update(index, number, text); |
| 412 } else if (notify) { | 407 } else if (notify) { |
| 413 ShowNotificationView(); | 408 ShowNotificationView(); |
| 414 } | 409 } |
| 415 } | 410 } |
| 416 } | 411 } |
| 417 | 412 |
| 418 } // namespace ash | 413 } // namespace ash |
| OLD | NEW |