Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / athena / system / status_icon_container_view.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "athena/system/status_icon_container_view.h"
6
7 #include "athena/resources/athena_resources.h"
8 #include "athena/system/network_selector.h"
9 #include "base/bind.h"
10 #include "base/macros.h"
11 #include "base/strings/stringprintf.h"
12 #include "base/strings/utf_string_conversions.h"
13 #include "chromeos/dbus/dbus_thread_manager.h"
14 #include "chromeos/dbus/power_manager/power_supply_properties.pb.h"
15 #include "chromeos/dbus/power_manager_client.h"
16 #include "chromeos/dbus/update_engine_client.h"
17 #include "chromeos/network/network_state.h"
18 #include "chromeos/network/network_state_handler.h"
19 #include "chromeos/network/network_state_handler_observer.h"
20 #include "chromeos/network/network_type_pattern.h"
21 #include "extensions/shell/common/version.h"
22 #include "ui/aura/window.h"
23 #include "ui/base/resource/resource_bundle.h"
24 #include "ui/gfx/image/image.h"
25 #include "ui/gfx/image/image_skia.h"
26 #include "ui/gfx/image/image_skia_operations.h"
27 #include "ui/views/controls/image_view.h"
28 #include "ui/views/controls/label.h"
29 #include "ui/views/layout/box_layout.h"
30
31 namespace athena {
32 namespace {
33
34 views::Label* CreateLabel(SystemUI::ColorScheme color_scheme,
35                           const std::string& text) {
36   views::Label* label = new views::Label(base::UTF8ToUTF16(text));
37   label->SetEnabledColor((color_scheme == SystemUI::COLOR_SCHEME_LIGHT)
38                              ? SK_ColorWHITE
39                              : SK_ColorDKGRAY);
40   label->SetAutoColorReadabilityEnabled(false);
41   label->SetSubpixelRenderingEnabled(false);
42   label->SetFontList(gfx::FontList().DeriveWithStyle(gfx::Font::BOLD));
43   return label;
44 }
45
46 }  // namespace
47
48 class StatusIconContainerView::PowerStatus
49     : public chromeos::PowerManagerClient::Observer {
50  public:
51   PowerStatus(SystemUI::ColorScheme color_scheme,
52               views::ImageView* icon)
53       : color_scheme_(color_scheme),
54         icon_(icon) {
55     chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(
56         this);
57     chromeos::DBusThreadManager::Get()
58         ->GetPowerManagerClient()
59         ->RequestStatusUpdate();
60   }
61
62   ~PowerStatus() override {
63     chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(
64         this);
65   }
66
67  private:
68   const gfx::ImageSkia GetPowerIcon(
69       const power_manager::PowerSupplyProperties& proto) const {
70     // Width and height of battery images.
71     const int kBatteryImageHeight = 25;
72     const int kBatteryImageWidth = 25;
73
74     // Number of different power states.
75     const int kNumPowerImages = 15;
76
77     gfx::Image all = ui::ResourceBundle::GetSharedInstance().GetImageNamed(
78         (color_scheme_ == SystemUI::COLOR_SCHEME_LIGHT)
79             ? IDR_AURA_UBER_TRAY_POWER_SMALL
80             : IDR_AURA_UBER_TRAY_POWER_SMALL_DARK);
81     int horiz_offset = IsCharging(proto) ? 1 : 0;
82     int vert_offset = -1;
83     if (proto.battery_percent() >= 100) {
84       vert_offset = kNumPowerImages - 1;
85     } else {
86       vert_offset = static_cast<int>((kNumPowerImages - 1) *
87                                      proto.battery_percent() / 100);
88       vert_offset = std::max(std::min(vert_offset, kNumPowerImages - 2), 0);
89     }
90     gfx::Rect region(horiz_offset * kBatteryImageWidth,
91                      vert_offset * kBatteryImageHeight,
92                      kBatteryImageWidth,
93                      kBatteryImageHeight);
94     return gfx::ImageSkiaOperations::ExtractSubset(*all.ToImageSkia(), region);
95   }
96
97   bool IsCharging(const power_manager::PowerSupplyProperties& proto) const {
98     return proto.external_power() !=
99            power_manager::PowerSupplyProperties_ExternalPower_DISCONNECTED;
100   }
101
102   // chromeos::PowerManagerClient::Observer:
103   virtual void PowerChanged(
104       const power_manager::PowerSupplyProperties& proto) override {
105     icon_->SetImage(GetPowerIcon(proto));
106   }
107
108   SystemUI::ColorScheme color_scheme_;
109   views::ImageView* icon_;
110
111   DISALLOW_COPY_AND_ASSIGN(PowerStatus);
112 };
113
114 class StatusIconContainerView::NetworkStatus
115     : public chromeos::NetworkStateHandlerObserver {
116  public:
117   explicit NetworkStatus(views::Label* label) : label_(label) {
118     chromeos::NetworkStateHandler* handler =
119         chromeos::NetworkHandler::Get()->network_state_handler();
120     handler->AddObserver(this, FROM_HERE);
121   }
122
123   ~NetworkStatus() override {
124     chromeos::NetworkStateHandler* handler =
125         chromeos::NetworkHandler::Get()->network_state_handler();
126     handler->RemoveObserver(this, FROM_HERE);
127   }
128
129  private:
130   void Update() {
131     std::string status = "<unknown>";
132     chromeos::NetworkStateHandler* handler =
133         chromeos::NetworkHandler::Get()->network_state_handler();
134     const chromeos::NetworkState* network = handler->DefaultNetwork();
135     if (!network) {
136       network = handler->ConnectedNetworkByType(
137           chromeos::NetworkTypePattern::NonVirtual());
138     }
139     if (network) {
140       status = base::StringPrintf(
141           "%s (%s)", network->ip_address().c_str(), network->name().c_str());
142     }
143     label_->SetText(base::UTF8ToUTF16(status));
144   }
145
146   // chromeos::NetworkStateHandlerObserver:
147   virtual void DefaultNetworkChanged(
148       const chromeos::NetworkState* network) override {
149     Update();
150   }
151
152   virtual void NetworkConnectionStateChanged(
153       const chromeos::NetworkState* network) override {
154     Update();
155   }
156
157   virtual void NetworkPropertiesUpdated(
158       const chromeos::NetworkState* network) override {
159     Update();
160   }
161
162   views::Label* label_;
163
164   DISALLOW_COPY_AND_ASSIGN(NetworkStatus);
165 };
166
167 void StartUpdateCallback(
168     chromeos::UpdateEngineClient::UpdateCheckResult result) {
169   VLOG(1) << "Callback from RequestUpdateCheck, result " << result;
170 }
171
172 class StatusIconContainerView::UpdateStatus
173     : public chromeos::UpdateEngineClient::Observer {
174  public:
175   UpdateStatus(SystemUI::ColorScheme color_scheme, views::ImageView* icon)
176       : color_scheme_(color_scheme),
177         icon_(icon) {
178     chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()->AddObserver(
179         this);
180     chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()->
181         RequestUpdateCheck(base::Bind(StartUpdateCallback));
182   }
183
184   ~UpdateStatus() override {
185     chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(
186         this);
187   }
188
189   // chromeos::UpdateEngineClient::Observer:
190   virtual void UpdateStatusChanged(
191       const chromeos::UpdateEngineClient::Status& status) override {
192     if (status.status !=
193         chromeos::UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT) {
194       return;
195     }
196     int image_id = (color_scheme_ == SystemUI::COLOR_SCHEME_LIGHT)
197                        ? IDR_AURA_UBER_TRAY_UPDATE
198                        : IDR_AURA_UBER_TRAY_UPDATE_DARK;
199     icon_->SetImage(
200         ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(image_id));
201   }
202
203  private:
204   SystemUI::ColorScheme color_scheme_;
205   views::ImageView* icon_;
206
207   DISALLOW_COPY_AND_ASSIGN(UpdateStatus);
208 };
209
210 StatusIconContainerView::StatusIconContainerView(
211     SystemUI::ColorScheme color_scheme) {
212   const int kHorizontalSpacing = 10;
213   const int kVerticalSpacing = 3;
214   const int kBetweenChildSpacing = 10;
215   SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal,
216                                         kHorizontalSpacing,
217                                         kVerticalSpacing,
218                                         kBetweenChildSpacing));
219
220   std::string version_text =
221       base::StringPrintf("%s (Build %s)", PRODUCT_VERSION, LAST_CHANGE);
222   AddChildView(CreateLabel(color_scheme, version_text));
223
224   AddChildView(CreateLabel(color_scheme, "Network:"));
225   views::Label* network_label = CreateLabel(color_scheme, std::string());
226   AddChildView(network_label);
227   if (chromeos::NetworkHandler::IsInitialized())
228     network_status_.reset(new NetworkStatus(network_label));
229
230   views::ImageView* battery_view = new views::ImageView();
231   AddChildView(battery_view);
232   power_status_.reset(new PowerStatus(color_scheme, battery_view));
233
234   views::ImageView* update_view = new views::ImageView();
235   AddChildView(update_view);
236   update_status_.reset(new UpdateStatus(color_scheme, update_view));
237 }
238
239 StatusIconContainerView::~StatusIconContainerView() {
240 }
241
242 bool StatusIconContainerView::OnMousePressed(const ui::MouseEvent& event) {
243   CreateNetworkSelector();
244   return true;
245 }
246
247 void StatusIconContainerView::OnGestureEvent(ui::GestureEvent* event) {
248   if (event->type() == ui::ET_GESTURE_TAP) {
249     CreateNetworkSelector();
250     event->SetHandled();
251   }
252 }
253
254 void StatusIconContainerView::ChildPreferredSizeChanged(views::View* child) {
255   PreferredSizeChanged();
256 }
257
258 }  // namespace athena