diff options
-rw-r--r-- | ash/ash.gyp | 1 | ||||
-rw-r--r-- | ash/shell.cc | 6 | ||||
-rw-r--r-- | ash/shell.h | 5 | ||||
-rw-r--r-- | ash/system/power/date_format_observer.h | 19 | ||||
-rw-r--r-- | ash/system/power/tray_power_date.cc | 27 | ||||
-rw-r--r-- | ash/system/power/tray_power_date.h | 7 | ||||
-rw-r--r-- | ash/system/tray/system_tray_delegate.h | 4 | ||||
-rw-r--r-- | chrome/browser/chromeos/system/ash_system_tray_delegate.cc | 32 |
8 files changed, 91 insertions, 10 deletions
diff --git a/ash/ash.gyp b/ash/ash.gyp index 797e864..6296000 100644 --- a/ash/ash.gyp +++ b/ash/ash.gyp @@ -119,6 +119,7 @@ 'system/network/network_controller.h', 'system/network/tray_network.cc', 'system/network/tray_network.h', + 'system/power/date_format_observer.h', 'system/power/power_status_controller.h', 'system/power/power_supply_status.cc', 'system/power/power_supply_status.h', diff --git a/ash/shell.cc b/ash/shell.cc index bc3e476..44e3ba3 100644 --- a/ash/shell.cc +++ b/ash/shell.cc @@ -248,6 +248,10 @@ class DummySystemTrayDelegate : public SystemTrayDelegate { return IDR_AURA_UBER_TRAY_UPDATE; } + virtual base::HourClockType GetHourClockType() const OVERRIDE { + return base::k24HourClock; + } + virtual void ShowSettings() OVERRIDE { } @@ -321,6 +325,7 @@ Shell::Shell(ShellDelegate* delegate) delegate_(delegate), audio_controller_(NULL), brightness_controller_(NULL), + date_format_observer_(NULL), network_controller_(NULL), power_status_controller_(NULL), update_controller_(NULL), @@ -479,6 +484,7 @@ void Shell::Init() { internal::TrayUser* tray_user = new internal::TrayUser; audio_controller_ = tray_volume; brightness_controller_ = tray_brightness; + date_format_observer_ = tray_power_date; network_controller_ = tray_network; power_status_controller_ = tray_power_date; update_controller_ = tray_user; diff --git a/ash/shell.h b/ash/shell.h index 475df7a..70d8b63 100644 --- a/ash/shell.h +++ b/ash/shell.h @@ -42,6 +42,7 @@ namespace ash { class AcceleratorController; class AudioController; class BrightnessController; +class DateFormatObserver; class Launcher; class NestedDispatcherController; class NetworkController; @@ -197,6 +198,9 @@ class ASH_EXPORT Shell { BrightnessController* brightness_controller() const { return brightness_controller_; } + DateFormatObserver* date_format_observer() const { + return date_format_observer_; + } NetworkController* network_controller() const { return network_controller_; } @@ -286,6 +290,7 @@ class ASH_EXPORT Shell { // These controllers are not owned by the shell. AudioController* audio_controller_; BrightnessController* brightness_controller_; + DateFormatObserver* date_format_observer_; NetworkController* network_controller_; PowerStatusController* power_status_controller_; UpdateController* update_controller_; diff --git a/ash/system/power/date_format_observer.h b/ash/system/power/date_format_observer.h new file mode 100644 index 0000000..dd45a4f --- /dev/null +++ b/ash/system/power/date_format_observer.h @@ -0,0 +1,19 @@ +// Copyright (c) 2012 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. + +#ifndef ASH_SYSTEM_POWER_DATE_FORMAT_OBSERVER_H_ +#define ASH_SYSTEM_POWER_DATE_FORMAT_OBSERVER_H_ + +namespace ash { + +class DateFormatObserver { + public: + virtual ~DateFormatObserver() {} + + virtual void OnDateFormatChanged() = 0; +}; + +}; + +#endif // ASH_SYSTEM_POWER_DATE_FORMAT_OBSERVER_H_ diff --git a/ash/system/power/tray_power_date.cc b/ash/system/power/tray_power_date.cc index 6e39204..1894f536 100644 --- a/ash/system/power/tray_power_date.cc +++ b/ash/system/power/tray_power_date.cc @@ -79,8 +79,9 @@ class DateView : public views::View { DATE }; - DateView(base::HourClockType hour_type, TimeType type) - : hour_type_(hour_type), + explicit DateView(TimeType type) + : hour_type_(ash::Shell::GetInstance()->tray_delegate()-> + GetHourClockType()), type_(type), actionable_(false) { SetLayoutManager(new views::FillLayout()); @@ -93,6 +94,11 @@ class DateView : public views::View { timer_.Stop(); } + void UpdateTimeFormat() { + hour_type_ = ash::Shell::GetInstance()->tray_delegate()->GetHourClockType(); + UpdateText(); + } + views::Label* label() const { return label_; } void set_actionable(bool actionable) { actionable_ = actionable; } @@ -100,11 +106,11 @@ class DateView : public views::View { private: void UpdateText() { base::Time now = base::Time::Now(); - if (type_ == TIME) { + if (type_ == DATE) { + label_->SetText(FormatNicely(now)); + } else { label_->SetText(base::TimeFormatTimeOfDayWithHourClockType( now, hour_type_, base::kDropAmPm)); - } else { - label_->SetText(FormatNicely(now)); } label_->SetTooltipText(base::TimeFormatFriendlyDate(now)); @@ -126,6 +132,7 @@ class DateView : public views::View { // called just a teeny bit early, then it will skip the next minute. seconds_left += kTimerSlopSeconds; + timer_.Stop(); timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(seconds_left), this, &DateView::UpdateText); } @@ -272,8 +279,7 @@ TrayPowerDate::~TrayPowerDate() { } views::View* TrayPowerDate::CreateTrayView(user::LoginStatus status) { - date_tray_.reset(new tray::DateView(base::k24HourClock, - tray::DateView::TIME)); + date_tray_.reset(new tray::DateView(tray::DateView::TIME)); date_tray_->label()->SetFont( date_tray_->label()->font().DeriveFont(-1, gfx::Font::BOLD)); date_tray_->label()->SetAutoColorReadabilityEnabled(false); @@ -291,8 +297,7 @@ views::View* TrayPowerDate::CreateTrayView(user::LoginStatus status) { } views::View* TrayPowerDate::CreateDefaultView(user::LoginStatus status) { - date_.reset(new tray::DateView(base::k24HourClock, - tray::DateView::DATE)); + date_.reset(new tray::DateView(tray::DateView::DATE)); if (status != user::LOGGED_IN_NONE) date_->set_actionable(true); @@ -333,5 +338,9 @@ void TrayPowerDate::OnPowerStatusChanged(const PowerSupplyStatus& status) { power_->UpdatePowerStatus(status); } +void TrayPowerDate::OnDateFormatChanged() { + date_tray_->UpdateTimeFormat(); +} + } // namespace internal } // namespace ash diff --git a/ash/system/power/tray_power_date.h b/ash/system/power/tray_power_date.h index 5ca8606..9f4f327 100644 --- a/ash/system/power/tray_power_date.h +++ b/ash/system/power/tray_power_date.h @@ -6,6 +6,7 @@ #define ASH_SYSTEM_POWER_TRAY_POWER_DATE_H_ #pragma once +#include "ash/system/power/date_format_observer.h" #include "ash/system/power/power_status_controller.h" #include "ash/system/tray/system_tray_item.h" @@ -19,7 +20,8 @@ class PowerTrayView; } class TrayPowerDate : public SystemTrayItem, - public PowerStatusController { + public PowerStatusController, + public DateFormatObserver { public: TrayPowerDate(); virtual ~TrayPowerDate(); @@ -36,6 +38,9 @@ class TrayPowerDate : public SystemTrayItem, // Overridden from PowerStatusController. virtual void OnPowerStatusChanged(const PowerSupplyStatus& status) OVERRIDE; + // Overridden from DateFormatObserver. + virtual void OnDateFormatChanged() OVERRIDE; + scoped_ptr<tray::DateView> date_; scoped_ptr<tray::DateView> date_tray_; diff --git a/ash/system/tray/system_tray_delegate.h b/ash/system/tray/system_tray_delegate.h index de2b388..40e6b07 100644 --- a/ash/system/tray/system_tray_delegate.h +++ b/ash/system/tray/system_tray_delegate.h @@ -7,6 +7,7 @@ #pragma once #include "ash/system/user/login_status.h" +#include "base/i18n/time_formatting.h" #include "base/string16.h" #include "third_party/skia/include/core/SkBitmap.h" @@ -36,6 +37,9 @@ class SystemTrayDelegate { // Returns the resource id for the icon to show for the update notification. virtual int GetSystemUpdateIconResource() const = 0; + // Returns the desired hour clock type. + virtual base::HourClockType GetHourClockType() const = 0; + // Shows settings. virtual void ShowSettings() = 0; diff --git a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc index ec48b75..858953a 100644 --- a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc +++ b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc @@ -8,6 +8,7 @@ #include "ash/system/audio/audio_controller.h" #include "ash/system/brightness/brightness_controller.h" #include "ash/system/network/network_controller.h" +#include "ash/system/power/date_format_observer.h" #include "ash/system/power/power_status_controller.h" #include "ash/system/tray/system_tray.h" #include "ash/system/tray/system_tray_delegate.h" @@ -21,9 +22,12 @@ #include "chrome/browser/chromeos/login/user.h" #include "chrome/browser/chromeos/login/user_manager.h" #include "chrome/browser/chromeos/status/network_menu_icon.h" +#include "chrome/browser/prefs/pref_service.h" +#include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/upgrade_detector.h" +#include "chrome/common/pref_names.h" #include "chrome/common/chrome_notification_types.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_service.h" @@ -61,6 +65,8 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, registrar_.Add(this, chrome::NOTIFICATION_UPGRADE_RECOMMENDED, content::NotificationService::AllSources()); + + InitializePrefChangeRegistrar(); } virtual ~SystemTrayDelegate() { @@ -103,6 +109,12 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, UpgradeDetector::UPGRADE_ICON_TYPE_MENU_ICON); } + virtual base::HourClockType GetHourClockType() const OVERRIDE { + Profile* profile = ProfileManager::GetDefaultProfile(); + return !profile || profile->GetPrefs()->GetBoolean(prefs::kUse24HourClock) ? + base::k24HourClock : base::k12HourClock; + } + virtual void ShowSettings() OVERRIDE { BrowserList::GetLastActive()->OpenOptionsDialog(); } @@ -151,6 +163,13 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, } private: + void InitializePrefChangeRegistrar() { + Profile* profile = ProfileManager::GetDefaultProfile(); + pref_registrar_.reset(new PrefChangeRegistrar); + pref_registrar_->Init(profile->GetPrefs()); + pref_registrar_->Add(prefs::kUse24HourClock, this); + } + void NotifyRefreshNetwork() { ash::NetworkController* controller = ash::Shell::GetInstance()->network_controller(); @@ -243,6 +262,9 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, const content::NotificationDetails& details) OVERRIDE { switch (type) { case chrome::NOTIFICATION_LOGIN_USER_CHANGED: { + // Profile may have changed after login. So re-initialize the + // pref-change registrar. + InitializePrefChangeRegistrar(); tray_->UpdateAfterLoginStatusChange(GetUserLoginStatus()); break; } @@ -253,6 +275,15 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, controller->OnUpdateRecommended(); break; } + case chrome::NOTIFICATION_PREF_CHANGED: { + DCHECK_EQ(*content::Details<std::string>(details).ptr(), + prefs::kUse24HourClock); + ash::DateFormatObserver* observer = + ash::Shell::GetInstance()->date_format_observer(); + if (observer) + observer->OnDateFormatChanged(); + break; + } default: NOTREACHED(); } @@ -261,6 +292,7 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, ash::SystemTray* tray_; scoped_ptr<NetworkMenuIcon> network_icon_; content::NotificationRegistrar registrar_; + scoped_ptr<PrefChangeRegistrar> pref_registrar_; std::string cellular_device_path_; std::string active_network_path_; |