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

Side by Side Diff: ash/system/power/tray_power.cc

Issue 10540041: Add battery status to settings row in uber tray bubble. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix nits. Created 8 years, 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ash/system/power/tray_power.h ('k') | ash/system/settings/tray_settings.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/power/tray_power.h" 5 #include "ash/system/power/tray_power.h"
6 6
7 #include "ash/ash_switches.h" 7 #include "ash/ash_switches.h"
8 #include "ash/shell.h" 8 #include "ash/shell.h"
9 #include "ash/system/date/date_view.h" 9 #include "ash/system/date/date_view.h"
10 #include "ash/system/power/power_status_view.h"
10 #include "ash/system/power/power_supply_status.h" 11 #include "ash/system/power/power_supply_status.h"
11 #include "ash/system/tray/system_tray_delegate.h" 12 #include "ash/system/tray/system_tray_delegate.h"
12 #include "ash/system/tray/tray_constants.h" 13 #include "ash/system/tray/tray_constants.h"
13 #include "ash/system/tray/tray_views.h" 14 #include "ash/system/tray/tray_views.h"
14 #include "base/command_line.h" 15 #include "base/command_line.h"
15 #include "base/string_number_conversions.h" 16 #include "base/string_number_conversions.h"
16 #include "base/stringprintf.h" 17 #include "base/stringprintf.h"
17 #include "base/utf_string_conversions.h" 18 #include "base/utf_string_conversions.h"
18 #include "grit/ash_strings.h" 19 #include "grit/ash_strings.h"
19 #include "grit/ui_resources_standard.h" 20 #include "grit/ui_resources_standard.h"
(...skipping 26 matching lines...) Expand all
46 const int kNumPowerImages = 15; 47 const int kNumPowerImages = 15;
47 // Top/bottom padding of the text items. 48 // Top/bottom padding of the text items.
48 const int kPaddingVertical = 10; 49 const int kPaddingVertical = 10;
49 // Specify min width of status label for layout. 50 // Specify min width of status label for layout.
50 const int kLabelMinWidth = 120; 51 const int kLabelMinWidth = 120;
51 // Notification times. 52 // Notification times.
52 const int kCriticalSeconds = 5 * 60; 53 const int kCriticalSeconds = 5 * 60;
53 const int kLowPowerSeconds = 15 * 60; 54 const int kLowPowerSeconds = 15 * 60;
54 const int kNoWarningSeconds = 30 * 60; 55 const int kNoWarningSeconds = 30 * 60;
55 56
56 enum IconSet {
57 ICON_LIGHT,
58 ICON_DARK
59 };
60
61 gfx::ImageSkia GetBatteryImage(const PowerSupplyStatus& supply_status,
62 IconSet icon_set) {
63 gfx::ImageSkia image;
64 gfx::Image all = ui::ResourceBundle::GetSharedInstance().GetImageNamed(
65 icon_set == ICON_DARK ?
66 IDR_AURA_UBER_TRAY_POWER_SMALL_DARK : IDR_AURA_UBER_TRAY_POWER_SMALL);
67
68 int image_index = 0;
69 if (supply_status.battery_percentage >= 100) {
70 image_index = kNumPowerImages - 1;
71 } else if (!supply_status.battery_is_present) {
72 image_index = kNumPowerImages;
73 } else {
74 double percentage = supply_status.is_calculating_battery_time ? 100.0 :
75 supply_status.battery_percentage;
76 image_index = static_cast<int>(percentage / 100.0 * (kNumPowerImages - 1));
77 image_index = std::max(std::min(image_index, kNumPowerImages - 2), 0);
78 }
79
80 // TODO(mbolohan): Remove the 2px offset when the assets are centered. See
81 // crbug.com/119832.
82 SkIRect region = SkIRect::MakeXYWH(
83 (supply_status.line_power_on ? kBatteryImageWidth : 0) + 2,
84 image_index * kBatteryImageHeight,
85 kBatteryImageWidth - 2, kBatteryImageHeight);
86 all.ToImageSkia()->extractSubset(&image, region);
87 return image;
88 }
89
90 } // namespace 57 } // namespace
91 58
92 namespace tray { 59 namespace tray {
93 60
94 // This view is used only for the tray. 61 // This view is used only for the tray.
95 class PowerTrayView : public views::ImageView { 62 class PowerTrayView : public views::ImageView {
96 public: 63 public:
97 PowerTrayView() { 64 PowerTrayView() {
98 UpdateImage(); 65 UpdateImage();
99 } 66 }
100 67
101 virtual ~PowerTrayView() { 68 virtual ~PowerTrayView() {
102 } 69 }
103 70
104 void UpdatePowerStatus(const PowerSupplyStatus& status) { 71 void UpdatePowerStatus(const PowerSupplyStatus& status) {
105 supply_status_ = status; 72 supply_status_ = status;
106 // Sanitize. 73 // Sanitize.
107 if (supply_status_.battery_is_full) 74 if (supply_status_.battery_is_full)
108 supply_status_.battery_percentage = 100.0; 75 supply_status_.battery_percentage = 100.0;
109 76
110 UpdateImage(); 77 UpdateImage();
111 SetVisible(status.battery_is_present); 78 SetVisible(status.battery_is_present);
112 } 79 }
113 80
114 private: 81 private:
115 void UpdateImage() { 82 void UpdateImage() {
116 SetImage(GetBatteryImage(supply_status_, ICON_LIGHT)); 83 SetImage(TrayPower::GetBatteryImage(supply_status_, ICON_LIGHT));
117 } 84 }
118 85
119 PowerSupplyStatus supply_status_; 86 PowerSupplyStatus supply_status_;
120 87
121 DISALLOW_COPY_AND_ASSIGN(PowerTrayView); 88 DISALLOW_COPY_AND_ASSIGN(PowerTrayView);
122 }; 89 };
123 90
124 // This view is used only for the popup.
125 class PowerStatusView : public views::View {
126 public:
127 enum ViewType {
128 VIEW_DEFAULT,
129 VIEW_NOTIFICATION
130 };
131
132 explicit PowerStatusView(ViewType view_type) : icon_(NULL) {
133 status_label_ = new views::Label;
134 time_label_ = new views::Label;
135
136 if (view_type == VIEW_DEFAULT)
137 LayoutDefaultView();
138 else
139 LayoutNotificationView();
140
141 Update();
142 }
143
144 virtual ~PowerStatusView() {
145 }
146
147 void UpdatePowerStatus(const PowerSupplyStatus& status) {
148 supply_status_ = status;
149 // Sanitize.
150 if (supply_status_.battery_is_full)
151 supply_status_.battery_percentage = 100.0;
152
153 Update();
154 }
155
156 private:
157 void LayoutDefaultView() {
158 set_border(views::Border::CreateEmptyBorder(
159 kPaddingVertical, kTrayPopupPaddingHorizontal,
160 kPaddingVertical, kTrayPopupPaddingHorizontal));
161
162 status_label_->SetHorizontalAlignment(views::Label::ALIGN_RIGHT);
163 time_label_->SetHorizontalAlignment(views::Label::ALIGN_RIGHT);
164
165 icon_ = new views::ImageView;
166
167 views::GridLayout* layout = new views::GridLayout(this);
168 SetLayoutManager(layout);
169
170 views::ColumnSet* columns = layout->AddColumnSet(0);
171
172 columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal);
173 // Status + Time
174 columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL,
175 0, views::GridLayout::USE_PREF, 0, kLabelMinWidth);
176
177 columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal/2);
178
179 // Icon
180 columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL,
181 0, views::GridLayout::USE_PREF, 0, 0);
182
183 columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal);
184
185 layout->AddPaddingRow(0, kPaddingVertical);
186
187 layout->StartRow(0, 0);
188 layout->AddView(status_label_);
189 layout->AddView(icon_, 1, 3); // 3 rows for icon
190
191 layout->AddPaddingRow(0, kPaddingVertical/3);
192 layout->StartRow(0, 0);
193 layout->AddView(time_label_);
194
195 layout->AddPaddingRow(0, kPaddingVertical);
196 }
197
198 void LayoutNotificationView() {
199 SetLayoutManager(
200 new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1));
201 status_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
202 AddChildView(status_label_);
203
204 time_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
205 AddChildView(time_label_);
206 }
207
208 void UpdateText() {
209 base::TimeDelta time = base::TimeDelta::FromSeconds(
210 supply_status_.line_power_on ?
211 supply_status_.averaged_battery_time_to_full :
212 supply_status_.averaged_battery_time_to_empty);
213 int hour = time.InHours();
214 int min = (time - base::TimeDelta::FromHours(hour)).InMinutes();
215
216 if (supply_status_.line_power_on && !hour && !min) {
217 status_label_->SetText(
218 ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
219 IDS_ASH_STATUS_TRAY_BATTERY_FULL));
220 } else {
221 status_label_->SetText(
222 l10n_util::GetStringFUTF16(
223 IDS_ASH_STATUS_TRAY_BATTERY_PERCENT,
224 base::IntToString16(
225 static_cast<int>(supply_status_.battery_percentage))));
226 }
227
228 if (supply_status_.is_calculating_battery_time) {
229 time_label_->SetText(
230 ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
231 IDS_ASH_STATUS_TRAY_BATTERY_CALCULATING));
232 } else if (hour || min) {
233 time_label_->SetText(
234 l10n_util::GetStringFUTF16(
235 supply_status_.line_power_on ?
236 IDS_ASH_STATUS_TRAY_BATTERY_TIME_UNTIL_FULL :
237 IDS_ASH_STATUS_TRAY_BATTERY_TIME_UNTIL_EMPTY,
238 base::IntToString16(hour),
239 base::IntToString16(min)));
240 } else {
241 time_label_->SetText(string16());
242 }
243 }
244
245 void UpdateIcon() {
246 if (icon_) {
247 icon_->SetImage(GetBatteryImage(supply_status_, ICON_DARK));
248 icon_->SetVisible(true);
249 }
250 }
251
252 void Update() {
253 UpdateText();
254 UpdateIcon();
255 }
256
257 views::Label* status_label_;
258 views::Label* time_label_;
259 views::ImageView* icon_;
260
261 PowerSupplyStatus supply_status_;
262
263 DISALLOW_COPY_AND_ASSIGN(PowerStatusView);
264 };
265
266 class PowerNotificationView : public TrayNotificationView { 91 class PowerNotificationView : public TrayNotificationView {
267 public: 92 public:
268 explicit PowerNotificationView(TrayPower* tray) 93 explicit PowerNotificationView(TrayPower* tray)
269 : TrayNotificationView(0), 94 : TrayNotificationView(0),
270 tray_(tray) { 95 tray_(tray) {
271 power_status_view_ = 96 power_status_view_ =
272 new PowerStatusView(PowerStatusView::VIEW_NOTIFICATION); 97 new PowerStatusView(PowerStatusView::VIEW_NOTIFICATION);
273 InitView(power_status_view_); 98 InitView(power_status_view_);
274 } 99 }
275 100
276 void UpdatePowerStatus(const PowerSupplyStatus& status) { 101 void UpdatePowerStatus(const PowerSupplyStatus& status) {
277 SetIconImage(GetBatteryImage(status, ICON_DARK)); 102 SetIconImage(TrayPower::GetBatteryImage(status, ICON_DARK));
278 power_status_view_->UpdatePowerStatus(status); 103 power_status_view_->UpdatePowerStatus(status);
279 } 104 }
280 105
281 // Overridden from TrayNotificationView: 106 // Overridden from TrayNotificationView:
282 virtual void OnClose() OVERRIDE { 107 virtual void OnClose() OVERRIDE {
283 tray_->HideNotificationView(); 108 tray_->HideNotificationView();
284 } 109 }
285 110
286 private: 111 private:
287 TrayPower* tray_; 112 TrayPower* tray_;
288 tray::PowerStatusView* power_status_view_; 113 PowerStatusView* power_status_view_;
289 114
290 DISALLOW_COPY_AND_ASSIGN(PowerNotificationView); 115 DISALLOW_COPY_AND_ASSIGN(PowerNotificationView);
291 }; 116 };
292 117
293 } // namespace tray 118 } // namespace tray
294 119
295 using tray::PowerStatusView;
296 using tray::PowerNotificationView; 120 using tray::PowerNotificationView;
297 121
298 TrayPower::TrayPower() 122 TrayPower::TrayPower()
299 : power_tray_(NULL), 123 : power_tray_(NULL),
300 notification_view_(NULL), 124 notification_view_(NULL),
301 notification_state_(NOTIFICATION_NONE) { 125 notification_state_(NOTIFICATION_NONE) {
302 } 126 }
303 127
304 TrayPower::~TrayPower() { 128 TrayPower::~TrayPower() {
305 } 129 }
306 130
131 // static
132 gfx::ImageSkia TrayPower::GetBatteryImage(
133 const PowerSupplyStatus& supply_status,
134 IconSet icon_set) {
135 gfx::ImageSkia image;
136 gfx::Image all = ui::ResourceBundle::GetSharedInstance().GetImageNamed(
137 icon_set == ICON_DARK ?
138 IDR_AURA_UBER_TRAY_POWER_SMALL_DARK : IDR_AURA_UBER_TRAY_POWER_SMALL);
139
140 int image_index = 0;
141 if (supply_status.battery_percentage >= 100) {
142 image_index = kNumPowerImages - 1;
143 } else if (!supply_status.battery_is_present) {
144 image_index = kNumPowerImages;
145 } else {
146 double percentage = supply_status.is_calculating_battery_time ? 100.0 :
147 supply_status.battery_percentage;
148 image_index = static_cast<int>(percentage / 100.0 * (kNumPowerImages - 1));
149 image_index = std::max(std::min(image_index, kNumPowerImages - 2), 0);
150 }
151
152 // TODO(mbolohan): Remove the 2px offset when the assets are centered. See
153 // crbug.com/119832.
154 SkIRect region = SkIRect::MakeXYWH(
155 (supply_status.line_power_on ? kBatteryImageWidth : 0) + 2,
156 image_index * kBatteryImageHeight,
157 kBatteryImageWidth - 2, kBatteryImageHeight);
158 all.ToImageSkia()->extractSubset(&image, region);
159 return image;
160 }
161
307 views::View* TrayPower::CreateTrayView(user::LoginStatus status) { 162 views::View* TrayPower::CreateTrayView(user::LoginStatus status) {
308 // There may not be enough information when this is created about whether 163 // There may not be enough information when this is created about whether
309 // there is a battery or not. So always create this, and adjust visibility as 164 // there is a battery or not. So always create this, and adjust visibility as
310 // necessary. 165 // necessary.
311 PowerSupplyStatus power_status = 166 PowerSupplyStatus power_status =
312 ash::Shell::GetInstance()->tray_delegate()->GetPowerSupplyStatus(); 167 ash::Shell::GetInstance()->tray_delegate()->GetPowerSupplyStatus();
313 CHECK(power_tray_ == NULL); 168 CHECK(power_tray_ == NULL);
314 power_tray_ = new tray::PowerTrayView(); 169 power_tray_ = new tray::PowerTrayView();
315 power_tray_->UpdatePowerStatus(power_status); 170 power_tray_->UpdatePowerStatus(power_status);
316 return power_tray_; 171 return power_tray_;
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 return false; 250 return false;
396 case NOTIFICATION_CRITICAL: 251 case NOTIFICATION_CRITICAL:
397 return false; 252 return false;
398 } 253 }
399 NOTREACHED(); 254 NOTREACHED();
400 return false; 255 return false;
401 } 256 }
402 257
403 } // namespace internal 258 } // namespace internal
404 } // namespace ash 259 } // namespace ash
OLDNEW
« no previous file with comments | « ash/system/power/tray_power.h ('k') | ash/system/settings/tray_settings.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698