Chromium Code Reviews| 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/power/tray_power.h" | 5 #include "ash/system/chromeos/power/tray_power.h" |
| 6 | 6 |
| 7 #include "ash/accessibility_delegate.h" | 7 #include "ash/accessibility_delegate.h" |
| 8 #include "ash/ash_switches.h" | 8 #include "ash/ash_switches.h" |
| 9 #include "ash/shell.h" | 9 #include "ash/shell.h" |
| 10 #include "ash/system/chromeos/power/power_status_view.h" | 10 #include "ash/system/chromeos/power/power_status_view.h" |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 32 #include "ui/views/layout/fill_layout.h" | 32 #include "ui/views/layout/fill_layout.h" |
| 33 #include "ui/views/layout/grid_layout.h" | 33 #include "ui/views/layout/grid_layout.h" |
| 34 #include "ui/views/view.h" | 34 #include "ui/views/view.h" |
| 35 #include "ui/views/widget/widget.h" | 35 #include "ui/views/widget/widget.h" |
| 36 | 36 |
| 37 using message_center::MessageCenter; | 37 using message_center::MessageCenter; |
| 38 using message_center::Notification; | 38 using message_center::Notification; |
| 39 | 39 |
| 40 namespace ash { | 40 namespace ash { |
| 41 namespace tray { | 41 namespace tray { |
| 42 namespace { | |
| 43 | |
| 44 const int kMaxSpringChargerAccessibilityNotifyCount = 3; | |
| 45 const int kSpringChargerAccessibilityTimerFirstTimeNotifyInSeconds = 30; | |
| 46 const int kSpringChargerAccessibilityTimerRepeatInMinutes = 5; | |
| 47 | |
| 48 } | |
| 49 | 42 |
| 50 // This view is used only for the tray. | 43 // This view is used only for the tray. |
| 51 class PowerTrayView : public views::ImageView { | 44 class PowerTrayView : public views::ImageView { |
| 52 public: | 45 public: |
| 53 PowerTrayView() | 46 PowerTrayView() { |
| 54 : spring_charger_spoken_notification_count_(0) { | |
| 55 UpdateImage(); | 47 UpdateImage(); |
| 56 } | 48 } |
| 57 | 49 |
| 58 virtual ~PowerTrayView() { | 50 virtual ~PowerTrayView() { |
| 59 } | 51 } |
| 60 | 52 |
| 61 // Overriden from views::View. | 53 // Overriden from views::View. |
| 62 virtual void GetAccessibleState(ui::AXViewState* state) override { | 54 virtual void GetAccessibleState(ui::AXViewState* state) override { |
| 63 state->name = accessible_name_; | 55 state->name = accessible_name_; |
| 64 state->role = ui::AX_ROLE_BUTTON; | 56 state->role = ui::AX_ROLE_BUTTON; |
| 65 } | 57 } |
| 66 | 58 |
| 67 void UpdateStatus(bool battery_alert) { | 59 void UpdateStatus(bool battery_alert) { |
| 68 UpdateImage(); | 60 UpdateImage(); |
| 69 SetVisible(PowerStatus::Get()->IsBatteryPresent()); | 61 SetVisible(PowerStatus::Get()->IsBatteryPresent()); |
| 70 | 62 |
| 71 if (battery_alert) { | 63 if (battery_alert) { |
| 72 accessible_name_ = PowerStatus::Get()->GetAccessibleNameString(true); | 64 accessible_name_ = PowerStatus::Get()->GetAccessibleNameString(true); |
| 73 NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, true); | 65 NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, true); |
| 74 } | 66 } |
| 75 } | 67 } |
| 76 | 68 |
| 77 void SetupNotifyBadCharger() { | |
| 78 // Poll with a shorter duration timer to notify the charger issue | |
| 79 // for the first time after the charger dialog is displayed. | |
| 80 spring_charger_accessibility_timer_.Start( | |
| 81 FROM_HERE, base::TimeDelta::FromSeconds( | |
| 82 kSpringChargerAccessibilityTimerFirstTimeNotifyInSeconds), | |
| 83 this, &PowerTrayView::NotifyChargerIssue); | |
| 84 } | |
| 85 | |
| 86 private: | 69 private: |
| 87 void UpdateImage() { | 70 void UpdateImage() { |
| 88 SetImage(PowerStatus::Get()->GetBatteryImage(PowerStatus::ICON_LIGHT)); | 71 SetImage(PowerStatus::Get()->GetBatteryImage(PowerStatus::ICON_LIGHT)); |
| 89 } | 72 } |
| 90 | 73 |
| 91 void NotifyChargerIssue() { | |
| 92 if (!Shell::GetInstance()->accessibility_delegate()-> | |
| 93 IsSpokenFeedbackEnabled()) | |
| 94 return; | |
| 95 | |
| 96 if (!Shell::GetInstance()->system_tray_delegate()-> | |
| 97 IsSpringChargerReplacementDialogVisible()) { | |
| 98 spring_charger_accessibility_timer_.Stop(); | |
| 99 return; | |
| 100 } | |
| 101 | |
| 102 accessible_name_ = ui::ResourceBundle::GetSharedInstance(). | |
| 103 GetLocalizedString(IDS_CHARGER_REPLACEMENT_ACCESSIBILITY_NOTIFICATION); | |
| 104 NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, true); | |
| 105 ++spring_charger_spoken_notification_count_; | |
| 106 | |
| 107 if (spring_charger_spoken_notification_count_ == 1) { | |
| 108 // After notify the charger issue for the first time, repeat the | |
| 109 // notification with a longer duration timer. | |
| 110 spring_charger_accessibility_timer_.Stop(); | |
| 111 spring_charger_accessibility_timer_.Start( | |
| 112 FROM_HERE, base::TimeDelta::FromMinutes( | |
| 113 kSpringChargerAccessibilityTimerRepeatInMinutes), | |
| 114 this, &PowerTrayView::NotifyChargerIssue); | |
| 115 } else if (spring_charger_spoken_notification_count_ >= | |
| 116 kMaxSpringChargerAccessibilityNotifyCount) { | |
| 117 spring_charger_accessibility_timer_.Stop(); | |
| 118 } | |
| 119 } | |
| 120 | |
| 121 base::string16 accessible_name_; | 74 base::string16 accessible_name_; |
| 122 | 75 |
| 123 // Tracks how many times the original spring charger accessibility | |
| 124 // notification has been spoken. | |
| 125 int spring_charger_spoken_notification_count_; | |
| 126 | |
| 127 base::RepeatingTimer<PowerTrayView> spring_charger_accessibility_timer_; | |
| 128 | |
| 129 DISALLOW_COPY_AND_ASSIGN(PowerTrayView); | 76 DISALLOW_COPY_AND_ASSIGN(PowerTrayView); |
| 130 }; | 77 }; |
| 131 | 78 |
| 132 class PowerNotificationView : public TrayNotificationView { | 79 class PowerNotificationView : public TrayNotificationView { |
| 133 public: | 80 public: |
| 134 explicit PowerNotificationView(TrayPower* owner) | 81 explicit PowerNotificationView(TrayPower* owner) |
| 135 : TrayNotificationView(owner, 0) { | 82 : TrayNotificationView(owner, 0) { |
| 136 power_status_view_ = | 83 power_status_view_ = |
| 137 new PowerStatusView(PowerStatusView::VIEW_NOTIFICATION, true); | 84 new PowerStatusView(PowerStatusView::VIEW_NOTIFICATION, true); |
| 138 InitView(power_status_view_); | 85 InitView(power_status_view_); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 213 } | 160 } |
| 214 | 161 |
| 215 void TrayPower::UpdateAfterLoginStatusChange(user::LoginStatus status) { | 162 void TrayPower::UpdateAfterLoginStatusChange(user::LoginStatus status) { |
| 216 } | 163 } |
| 217 | 164 |
| 218 void TrayPower::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) { | 165 void TrayPower::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) { |
| 219 SetTrayImageItemBorder(power_tray_, alignment); | 166 SetTrayImageItemBorder(power_tray_, alignment); |
| 220 } | 167 } |
| 221 | 168 |
| 222 void TrayPower::OnPowerStatusChanged() { | 169 void TrayPower::OnPowerStatusChanged() { |
| 223 RecordChargerType(); | |
| 224 | |
| 225 if (PowerStatus::Get()->IsOriginalSpringChargerConnected()) { | |
| 226 if (ash::Shell::GetInstance()->system_tray_delegate()-> | |
| 227 ShowSpringChargerReplacementDialog()) { | |
| 228 power_tray_->SetupNotifyBadCharger(); | |
| 229 } | |
| 230 } | |
| 231 | |
| 232 bool battery_alert = UpdateNotificationState(); | 170 bool battery_alert = UpdateNotificationState(); |
| 233 if (power_tray_) | 171 if (power_tray_) |
| 234 power_tray_->UpdateStatus(battery_alert); | 172 power_tray_->UpdateStatus(battery_alert); |
| 235 if (notification_view_) | 173 if (notification_view_) |
| 236 notification_view_->UpdateStatus(); | 174 notification_view_->UpdateStatus(); |
| 237 | 175 |
| 238 // Factory testing may place the battery into unusual states. | 176 // Factory testing may place the battery into unusual states. |
| 239 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 177 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 240 ash::switches::kAshHideNotificationsForFactory)) | 178 ash::switches::kAshHideNotificationsForFactory)) |
| 241 return; | 179 return; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 281 message_center_->RemoveNotification(kNotificationId, false); | 219 message_center_->RemoveNotification(kNotificationId, false); |
| 282 return true; | 220 return true; |
| 283 } | 221 } |
| 284 return false; | 222 return false; |
| 285 } | 223 } |
| 286 | 224 |
| 287 bool TrayPower::UpdateNotificationState() { | 225 bool TrayPower::UpdateNotificationState() { |
| 288 const PowerStatus& status = *PowerStatus::Get(); | 226 const PowerStatus& status = *PowerStatus::Get(); |
| 289 if (!status.IsBatteryPresent() || | 227 if (!status.IsBatteryPresent() || |
| 290 status.IsBatteryTimeBeingCalculated() || | 228 status.IsBatteryTimeBeingCalculated() || |
| 291 status.IsMainsChargerConnected() || | 229 status.IsMainsChargerConnected()) { |
| 292 status.IsOriginalSpringChargerConnected()) { | |
|
Daniel Erat
2014/11/14 22:48:26
i think we still want to include this here, at lea
jennyz
2014/11/15 00:04:04
Yes, please check in the change for updating power
| |
| 293 notification_state_ = NOTIFICATION_NONE; | 230 notification_state_ = NOTIFICATION_NONE; |
| 294 return false; | 231 return false; |
| 295 } | 232 } |
| 296 | 233 |
| 297 return status.IsUsbChargerConnected() ? | 234 return status.IsUsbChargerConnected() ? |
| 298 UpdateNotificationStateForRemainingPercentage() : | 235 UpdateNotificationStateForRemainingPercentage() : |
| 299 UpdateNotificationStateForRemainingTime(); | 236 UpdateNotificationStateForRemainingTime(); |
| 300 } | 237 } |
| 301 | 238 |
| 302 bool TrayPower::UpdateNotificationStateForRemainingTime() { | 239 bool TrayPower::UpdateNotificationStateForRemainingTime() { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 364 return true; | 301 return true; |
| 365 } | 302 } |
| 366 return false; | 303 return false; |
| 367 case NOTIFICATION_CRITICAL: | 304 case NOTIFICATION_CRITICAL: |
| 368 return false; | 305 return false; |
| 369 } | 306 } |
| 370 NOTREACHED(); | 307 NOTREACHED(); |
| 371 return false; | 308 return false; |
| 372 } | 309 } |
| 373 | 310 |
| 374 void TrayPower::RecordChargerType() { | |
|
Daniel Erat
2014/11/14 22:48:26
it might be worthwhile to keep this metric around,
jennyz
2014/11/15 00:04:04
I deprecated it in the histograms.xml.
| |
| 375 if (!PowerStatus::Get()->IsLinePowerConnected() || | |
| 376 line_power_was_connected_) | |
| 377 return; | |
| 378 | |
| 379 ChargerType current_charger = UNKNOWN_CHARGER; | |
| 380 if (PowerStatus::Get()->IsMainsChargerConnected()) { | |
| 381 current_charger = MAINS_CHARGER; | |
| 382 } else if (PowerStatus::Get()->IsUsbChargerConnected()) { | |
| 383 current_charger = USB_CHARGER; | |
| 384 } else if (PowerStatus::Get()->IsOriginalSpringChargerConnected()) { | |
| 385 current_charger = | |
| 386 ash::Shell::GetInstance()->system_tray_delegate()-> | |
| 387 HasUserConfirmedSafeSpringCharger() ? | |
| 388 SAFE_SPRING_CHARGER : UNCONFIRMED_SPRING_CHARGER; | |
| 389 } | |
| 390 | |
| 391 if (current_charger != UNKNOWN_CHARGER) { | |
| 392 UMA_HISTOGRAM_ENUMERATION("Power.ChargerType", | |
| 393 current_charger, | |
| 394 CHARGER_TYPE_COUNT); | |
| 395 } | |
| 396 } | |
| 397 | |
| 398 } // namespace ash | 311 } // namespace ash |
| OLD | NEW |