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

Unified Diff: athena/system/status_icon_container_view.cc

Issue 483363003: [Athena] Add status icons and system time to the desktop background (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « athena/system/status_icon_container_view.h ('k') | athena/system/system_ui_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: athena/system/status_icon_container_view.cc
diff --git a/athena/system/status_icon_container_view.cc b/athena/system/status_icon_container_view.cc
new file mode 100644
index 0000000000000000000000000000000000000000..afb38955224afc5c3fc6a8d8948de6281db9e1f9
--- /dev/null
+++ b/athena/system/status_icon_container_view.cc
@@ -0,0 +1,242 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "athena/system/status_icon_container_view.h"
+
+#include "athena/resources/athena_resources.h"
+#include "athena/system/network_selector.h"
+#include "base/bind.h"
+#include "base/macros.h"
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/power_manager/power_supply_properties.pb.h"
+#include "chromeos/dbus/power_manager_client.h"
+#include "chromeos/dbus/update_engine_client.h"
+#include "chromeos/network/network_state.h"
+#include "chromeos/network/network_state_handler.h"
+#include "chromeos/network/network_state_handler_observer.h"
+#include "chromeos/network/network_type_pattern.h"
+#include "extensions/shell/common/version.h"
+#include "ui/aura/window.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/gfx/image/image.h"
+#include "ui/gfx/image/image_skia.h"
+#include "ui/gfx/image/image_skia_operations.h"
+#include "ui/views/controls/image_view.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/layout/box_layout.h"
+
+namespace athena {
+namespace {
+
+views::Label* CreateLabel(const std::string& text) {
+ views::Label* label = new views::Label(base::UTF8ToUTF16(text));
+ label->SetEnabledColor(SK_ColorWHITE);
+ label->SetAutoColorReadabilityEnabled(false);
+ label->SetFontList(gfx::FontList().DeriveWithStyle(gfx::Font::BOLD));
+ return label;
+}
+
+} // namespace
+
+class StatusIconContainerView::PowerStatus
+ : public chromeos::PowerManagerClient::Observer {
+ public:
+ explicit PowerStatus(views::ImageView* icon) : icon_(icon) {
+ chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(
+ this);
+ chromeos::DBusThreadManager::Get()
+ ->GetPowerManagerClient()
+ ->RequestStatusUpdate();
+ }
+
+ virtual ~PowerStatus() {
+ chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(
+ this);
+ }
+
+ private:
+ const gfx::ImageSkia GetPowerIcon(
+ const power_manager::PowerSupplyProperties& proto) const {
+ // Width and height of battery images.
+ const int kBatteryImageHeight = 25;
+ const int kBatteryImageWidth = 25;
+
+ // Number of different power states.
+ const int kNumPowerImages = 15;
+
+ gfx::Image all = ui::ResourceBundle::GetSharedInstance().GetImageNamed(
+ IDR_AURA_UBER_TRAY_POWER_SMALL);
+ int horiz_offset = IsCharging(proto) ? 1 : 0;
+ int vert_offset = -1;
+ if (proto.battery_percent() >= 100) {
+ vert_offset = kNumPowerImages - 1;
+ } else {
+ vert_offset = static_cast<int>((kNumPowerImages - 1) *
+ proto.battery_percent() / 100);
+ vert_offset = std::max(std::min(vert_offset, kNumPowerImages - 2), 0);
+ }
+ gfx::Rect region(horiz_offset * kBatteryImageWidth,
+ vert_offset * kBatteryImageHeight,
+ kBatteryImageWidth,
+ kBatteryImageHeight);
+ return gfx::ImageSkiaOperations::ExtractSubset(*all.ToImageSkia(), region);
+ }
+
+ bool IsCharging(const power_manager::PowerSupplyProperties& proto) const {
+ return proto.external_power() !=
+ power_manager::PowerSupplyProperties_ExternalPower_DISCONNECTED;
+ }
+
+ // chromeos::PowerManagerClient::Observer:
+ virtual void PowerChanged(
+ const power_manager::PowerSupplyProperties& proto) OVERRIDE {
+ icon_->SetImage(GetPowerIcon(proto));
+ }
+
+ views::ImageView* icon_;
+
+ DISALLOW_COPY_AND_ASSIGN(PowerStatus);
+};
+
+class StatusIconContainerView::NetworkStatus
+ : public chromeos::NetworkStateHandlerObserver {
+ public:
+ explicit NetworkStatus(views::Label* label) : label_(label) {
+ chromeos::NetworkStateHandler* handler =
+ chromeos::NetworkHandler::Get()->network_state_handler();
+ handler->AddObserver(this, FROM_HERE);
+ }
+
+ virtual ~NetworkStatus() {
+ chromeos::NetworkStateHandler* handler =
+ chromeos::NetworkHandler::Get()->network_state_handler();
+ handler->RemoveObserver(this, FROM_HERE);
+ }
+
+ private:
+ void Update() {
+ std::string status = "<unknown>";
+ chromeos::NetworkStateHandler* handler =
+ chromeos::NetworkHandler::Get()->network_state_handler();
+ const chromeos::NetworkState* network = handler->DefaultNetwork();
+ if (!network) {
+ network = handler->ConnectedNetworkByType(
+ chromeos::NetworkTypePattern::NonVirtual());
+ }
+ if (network) {
+ status = base::StringPrintf(
+ "%s (%s)", network->ip_address().c_str(), network->name().c_str());
+ }
+ label_->SetText(base::UTF8ToUTF16(status));
+ }
+
+ // chromeos::NetworkStateHandlerObserver:
+ virtual void DefaultNetworkChanged(
+ const chromeos::NetworkState* network) OVERRIDE {
+ Update();
+ }
+
+ virtual void NetworkConnectionStateChanged(
+ const chromeos::NetworkState* network) OVERRIDE {
+ Update();
+ }
+
+ virtual void NetworkPropertiesUpdated(
+ const chromeos::NetworkState* network) OVERRIDE {
+ Update();
+ }
+
+ views::Label* label_;
+
+ DISALLOW_COPY_AND_ASSIGN(NetworkStatus);
+};
+
+void StartUpdateCallback(
+ chromeos::UpdateEngineClient::UpdateCheckResult result) {
+ VLOG(1) << "Callback from RequestUpdateCheck, result " << result;
+}
+
+class StatusIconContainerView::UpdateStatus
+ : public chromeos::UpdateEngineClient::Observer {
+ public:
+ explicit UpdateStatus(views::ImageView* icon) : icon_(icon) {
+ chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()->AddObserver(
+ this);
+ chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()->
+ RequestUpdateCheck(base::Bind(StartUpdateCallback));
+ }
+
+ virtual ~UpdateStatus() {
+ chromeos::DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(
+ this);
+ }
+
+ // chromeos::UpdateEngineClient::Observer:
+ virtual void UpdateStatusChanged(
+ const chromeos::UpdateEngineClient::Status& status) OVERRIDE {
+ if (status.status !=
+ chromeos::UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT) {
+ return;
+ }
+ icon_->SetImage(ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
+ IDR_AURA_UBER_TRAY_UPDATE));
+ }
+
+ private:
+ views::ImageView* icon_;
+
+ DISALLOW_COPY_AND_ASSIGN(UpdateStatus);
+};
+
+StatusIconContainerView::StatusIconContainerView(
+ aura::Window* system_modal_container)
+ : system_modal_container_(system_modal_container) {
+ const int kHorizontalSpacing = 10;
+ const int kVerticalSpacing = 3;
+ const int kBetweenChildSpacing = 10;
+ SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal,
+ kHorizontalSpacing,
+ kVerticalSpacing,
+ kBetweenChildSpacing));
+
+ std::string version_text =
+ base::StringPrintf("%s (Build %s)", PRODUCT_VERSION, LAST_CHANGE);
+ AddChildView(CreateLabel(version_text));
+
+ AddChildView(CreateLabel("Network:"));
+ views::Label* network_label = CreateLabel(std::string());
+ AddChildView(network_label);
+ network_status_.reset(new NetworkStatus(network_label));
+
+ views::ImageView* battery_view = new views::ImageView();
+ AddChildView(battery_view);
+ power_status_.reset(new PowerStatus(battery_view));
+
+ views::ImageView* update_view = new views::ImageView();
+ AddChildView(update_view);
+ update_status_.reset(new UpdateStatus(update_view));
+}
+
+StatusIconContainerView::~StatusIconContainerView() {
+}
+
+bool StatusIconContainerView::OnMousePressed(const ui::MouseEvent& event) {
+ CreateNetworkSelector(system_modal_container_);
+ return true;
+}
+
+void StatusIconContainerView::OnGestureEvent(ui::GestureEvent* event) {
+ if (event->type() == ui::ET_GESTURE_TAP) {
+ CreateNetworkSelector(system_modal_container_);
+ event->SetHandled();
+ }
+}
+
+void StatusIconContainerView::ChildPreferredSizeChanged(views::View* child) {
+ PreferredSizeChanged();
+}
+
+} // namespace athena
« no previous file with comments | « athena/system/status_icon_container_view.h ('k') | athena/system/system_ui_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698