summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ash/system/date/clock_observer.h1
-rw-r--r--ash/system/date/tray_date.cc5
-rw-r--r--ash/system/date/tray_date.h1
-rw-r--r--ash/system/tray/system_tray_notifier.cc6
-rw-r--r--ash/system/tray/system_tray_notifier.h1
-rw-r--r--chrome/browser/chromeos/system/ash_system_tray_delegate.cc9
-rw-r--r--chromeos/chromeos.gyp4
-rw-r--r--chromeos/dbus/dbus_thread_manager.cc10
-rw-r--r--chromeos/dbus/dbus_thread_manager.h2
-rw-r--r--chromeos/dbus/mock_dbus_thread_manager.cc10
-rw-r--r--chromeos/dbus/mock_dbus_thread_manager.h6
-rw-r--r--chromeos/dbus/mock_dbus_thread_manager_without_gmock.cc5
-rw-r--r--chromeos/dbus/mock_dbus_thread_manager_without_gmock.h1
-rw-r--r--chromeos/dbus/mock_system_clock_client.cc13
-rw-r--r--chromeos/dbus/mock_system_clock_client.h29
-rw-r--r--chromeos/dbus/system_clock_client.cc111
-rw-r--r--chromeos/dbus/system_clock_client.h52
17 files changed, 265 insertions, 1 deletions
diff --git a/ash/system/date/clock_observer.h b/ash/system/date/clock_observer.h
index b82df02..3046528 100644
--- a/ash/system/date/clock_observer.h
+++ b/ash/system/date/clock_observer.h
@@ -12,6 +12,7 @@ class ClockObserver {
virtual ~ClockObserver() {}
virtual void OnDateFormatChanged() = 0;
+ virtual void OnSystemClockTimeUpdated() = 0;
// Force a refresh (e.g. after the system is resumed).
virtual void Refresh() = 0;
diff --git a/ash/system/date/tray_date.cc b/ash/system/date/tray_date.cc
index c603b26..4b25bbc 100644
--- a/ash/system/date/tray_date.cc
+++ b/ash/system/date/tray_date.cc
@@ -188,6 +188,11 @@ void TrayDate::OnDateFormatChanged() {
time_tray_->UpdateTimeFormat();
}
+void TrayDate::OnSystemClockTimeUpdated() {
+ if (time_tray_)
+ time_tray_->UpdateTimeFormat();
+}
+
void TrayDate::Refresh() {
if (time_tray_)
time_tray_->UpdateText();
diff --git a/ash/system/date/tray_date.h b/ash/system/date/tray_date.h
index 6e11642..dc8988c 100644
--- a/ash/system/date/tray_date.h
+++ b/ash/system/date/tray_date.h
@@ -43,6 +43,7 @@ class TrayDate : public SystemTrayItem,
// Overridden from ClockObserver.
virtual void OnDateFormatChanged() OVERRIDE;
+ virtual void OnSystemClockTimeUpdated() OVERRIDE;
virtual void Refresh() OVERRIDE;
void SetupLabelForTimeTray(views::Label* label);
diff --git a/ash/system/tray/system_tray_notifier.cc b/ash/system/tray/system_tray_notifier.cc
index 8897917..e174e0d 100644
--- a/ash/system/tray/system_tray_notifier.cc
+++ b/ash/system/tray/system_tray_notifier.cc
@@ -228,6 +228,12 @@ void SystemTrayNotifier::NotifyDateFormatChanged() {
OnDateFormatChanged());
}
+void SystemTrayNotifier::NotifySystemClockTimeUpdated() {
+ FOR_EACH_OBSERVER(ClockObserver,
+ clock_observers_,
+ OnSystemClockTimeUpdated());
+}
+
void SystemTrayNotifier::NotifyRefreshDrive(DriveOperationStatusList& list) {
FOR_EACH_OBSERVER(DriveObserver,
drive_observers_,
diff --git a/ash/system/tray/system_tray_notifier.h b/ash/system/tray/system_tray_notifier.h
index 7437efc..8933687 100644
--- a/ash/system/tray/system_tray_notifier.h
+++ b/ash/system/tray/system_tray_notifier.h
@@ -107,6 +107,7 @@ public:
void NotifyCapsLockChanged(bool enabled, bool search_mapped_to_caps_lock);
void NotifyRefreshClock();
void NotifyDateFormatChanged();
+ void NotifySystemClockTimeUpdated();
void NotifyRefreshDrive(DriveOperationStatusList& list);
void NotifyRefreshIME(bool show_message);
void NotifyShowLoginButtonChanged(bool show_login_button);
diff --git a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc
index a251ca2..684d31e 100644
--- a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc
+++ b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc
@@ -82,6 +82,7 @@
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/power_manager_client.h"
#include "chromeos/dbus/session_manager_client.h"
+#include "chromeos/dbus/system_clock_client.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_service.h"
@@ -197,6 +198,7 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
public content::NotificationObserver,
public input_method::InputMethodManager::Observer,
public system::TimezoneSettings::Observer,
+ public chromeos::SystemClockClient::Observer,
public device::BluetoothAdapter::Observer,
public SystemKeyEventListener::CapsLockObserver,
public ash::NetworkTrayDelegate,
@@ -265,6 +267,7 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
input_method::GetInputMethodManager()->AddObserver(this);
system::TimezoneSettings::GetInstance()->AddObserver(this);
+ DBusThreadManager::Get()->GetSystemClockClient()->AddObserver(this);
if (SystemKeyEventListener::GetInstance())
SystemKeyEventListener::GetInstance()->AddCapsLockObserver(this);
@@ -313,6 +316,7 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
audiohandler->RemoveVolumeObserver(this);
DBusThreadManager::Get()->GetSessionManagerClient()->RemoveObserver(this);
DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(this);
+ DBusThreadManager::Get()->GetSystemClockClient()->RemoveObserver(this);
NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary();
if (crosnet)
crosnet->RemoveNetworkManagerObserver(this);
@@ -1307,6 +1311,11 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
GetSystemTrayNotifier()->NotifyRefreshClock();
}
+ // Overridden from SystemClockClient::Observer.
+ virtual void SystemClockUpdated() OVERRIDE {
+ GetSystemTrayNotifier()->NotifySystemClockTimeUpdated();
+ }
+
// Overridden from BluetoothAdapter::Observer.
virtual void AdapterPresentChanged(device::BluetoothAdapter* adapter,
bool present) OVERRIDE {
diff --git a/chromeos/chromeos.gyp b/chromeos/chromeos.gyp
index 7fe11e8..7255fe2 100644
--- a/chromeos/chromeos.gyp
+++ b/chromeos/chromeos.gyp
@@ -131,6 +131,8 @@
'dbus/session_manager_client.h',
'dbus/sms_client.cc',
'dbus/sms_client.h',
+ 'dbus/system_clock_client.cc',
+ 'dbus/system_clock_client.h',
'dbus/update_engine_client.cc',
'dbus/update_engine_client.h',
'disks/disk_mount_manager.cc',
@@ -285,6 +287,8 @@
'dbus/mock_session_manager_client.h',
'dbus/mock_sms_client.cc',
'dbus/mock_sms_client.h',
+ 'dbus/mock_system_clock_client.cc',
+ 'dbus/mock_system_clock_client.h',
'dbus/mock_update_engine_client.cc',
'dbus/mock_update_engine_client.h',
'disks/mock_disk_mount_manager.cc',
diff --git a/chromeos/dbus/dbus_thread_manager.cc b/chromeos/dbus/dbus_thread_manager.cc
index 79de3d0..4c30323 100644
--- a/chromeos/dbus/dbus_thread_manager.cc
+++ b/chromeos/dbus/dbus_thread_manager.cc
@@ -22,12 +22,13 @@
#include "chromeos/dbus/dbus_client_implementation_type.h"
#include "chromeos/dbus/dbus_thread_manager_observer.h"
#include "chromeos/dbus/debug_daemon_client.h"
+#include "chromeos/dbus/gsm_sms_client.h"
#include "chromeos/dbus/shill_device_client.h"
#include "chromeos/dbus/shill_ipconfig_client.h"
#include "chromeos/dbus/shill_manager_client.h"
#include "chromeos/dbus/shill_profile_client.h"
#include "chromeos/dbus/shill_service_client.h"
-#include "chromeos/dbus/gsm_sms_client.h"
+#include "chromeos/dbus/system_clock_client.h"
#include "chromeos/dbus/ibus/ibus_client.h"
#include "chromeos/dbus/ibus/ibus_config_client.h"
#include "chromeos/dbus/ibus/ibus_engine_factory_service.h"
@@ -128,6 +129,8 @@ class DBusThreadManagerImpl : public DBusThreadManager {
SessionManagerClient::Create(client_type_, system_bus_.get()));
sms_client_.reset(
SMSClient::Create(client_type_, system_bus_.get()));
+ system_clock_client_.reset(
+ SystemClockClient::Create(client_type_, system_bus_.get()));
update_engine_client_.reset(
UpdateEngineClient::Create(client_type_, system_bus_.get()));
@@ -306,6 +309,10 @@ class DBusThreadManagerImpl : public DBusThreadManager {
return sms_client_.get();
}
+ virtual SystemClockClient* GetSystemClockClient() OVERRIDE {
+ return system_clock_client_.get();
+ }
+
virtual UpdateEngineClient* GetUpdateEngineClient() OVERRIDE {
return update_engine_client_.get();
}
@@ -384,6 +391,7 @@ class DBusThreadManagerImpl : public DBusThreadManager {
scoped_ptr<IntrospectableClient> introspectable_client_;
scoped_ptr<ModemMessagingClient> modem_messaging_client_;
scoped_ptr<PermissionBrokerClient> permission_broker_client_;
+ scoped_ptr<SystemClockClient> system_clock_client_;
scoped_ptr<PowerManagerClient> power_manager_client_;
scoped_ptr<SessionManagerClient> session_manager_client_;
scoped_ptr<SMSClient> sms_client_;
diff --git a/chromeos/dbus/dbus_thread_manager.h b/chromeos/dbus/dbus_thread_manager.h
index 8ae4fab..94509dc 100644
--- a/chromeos/dbus/dbus_thread_manager.h
+++ b/chromeos/dbus/dbus_thread_manager.h
@@ -55,6 +55,7 @@ class ShillIPConfigClient;
class ShillManagerClient;
class ShillProfileClient;
class ShillServiceClient;
+class SystemClockClient;
class UpdateEngineClient;
// DBusThreadManager manages the D-Bus thread, the thread dedicated to
@@ -149,6 +150,7 @@ class CHROMEOS_EXPORT DBusThreadManager {
virtual ShillProfileClient* GetShillProfileClient() = 0;
virtual ShillServiceClient* GetShillServiceClient() = 0;
virtual SMSClient* GetSMSClient() = 0;
+ virtual SystemClockClient* GetSystemClockClient() = 0;
virtual UpdateEngineClient* GetUpdateEngineClient() = 0;
// Removes the ibus engine services for |object_path|.
diff --git a/chromeos/dbus/mock_dbus_thread_manager.cc b/chromeos/dbus/mock_dbus_thread_manager.cc
index e269fd5..59f90ed 100644
--- a/chromeos/dbus/mock_dbus_thread_manager.cc
+++ b/chromeos/dbus/mock_dbus_thread_manager.cc
@@ -27,6 +27,7 @@
#include "chromeos/dbus/mock_power_manager_client.h"
#include "chromeos/dbus/mock_session_manager_client.h"
#include "chromeos/dbus/mock_sms_client.h"
+#include "chromeos/dbus/mock_system_clock_client.h"
#include "chromeos/dbus/mock_update_engine_client.h"
#include "chromeos/dbus/power_policy_controller.h"
@@ -60,6 +61,7 @@ MockDBusThreadManager::MockDBusThreadManager()
mock_power_manager_client_(new MockPowerManagerClient),
mock_session_manager_client_(new MockSessionManagerClient),
mock_sms_client_(new MockSMSClient),
+ mock_system_clock_client_(new MockSystemClockClient),
mock_update_engine_client_(new MockUpdateEngineClient) {
EXPECT_CALL(*this, GetBluetoothAdapterClient())
.WillRepeatedly(Return(mock_bluetooth_adapter_client_.get()));
@@ -103,6 +105,8 @@ MockDBusThreadManager::MockDBusThreadManager()
.WillRepeatedly(Return(mock_session_manager_client_.get()));
EXPECT_CALL(*this, GetSMSClient())
.WillRepeatedly(Return(mock_sms_client_.get()));
+ EXPECT_CALL(*this, GetSystemClockClient())
+ .WillRepeatedly(Return(mock_system_clock_client()));
EXPECT_CALL(*this, GetUpdateEngineClient())
.WillRepeatedly(Return(mock_update_engine_client_.get()));
EXPECT_CALL(*this, GetIBusInputContextClient())
@@ -141,6 +145,12 @@ MockDBusThreadManager::MockDBusThreadManager()
.Times(AnyNumber());
EXPECT_CALL(*mock_update_engine_client_.get(), AddObserver(_))
.Times(AnyNumber());
+ EXPECT_CALL(*mock_system_clock_client_.get(), AddObserver(_))
+ .Times(AnyNumber());
+ EXPECT_CALL(*mock_system_clock_client_.get(), RemoveObserver(_))
+ .Times(AnyNumber());
+ EXPECT_CALL(*mock_system_clock_client_.get(), HasObserver(_))
+ .Times(AnyNumber());
EXPECT_CALL(*mock_update_engine_client_.get(), RemoveObserver(_))
.Times(AnyNumber());
EXPECT_CALL(*mock_bluetooth_manager_client_.get(), AddObserver(_))
diff --git a/chromeos/dbus/mock_dbus_thread_manager.h b/chromeos/dbus/mock_dbus_thread_manager.h
index ee6aeb5..85d752f 100644
--- a/chromeos/dbus/mock_dbus_thread_manager.h
+++ b/chromeos/dbus/mock_dbus_thread_manager.h
@@ -42,6 +42,7 @@ class MockPermissionBrokerClient;
class MockPowerManagerClient;
class MockSessionManagerClient;
class MockSMSClient;
+class MockSystemClockClient;
class MockUpdateEngineClient;
class PowerPolicyController;
@@ -82,6 +83,7 @@ class MockDBusThreadManager : public DBusThreadManager {
MOCK_METHOD0(GetPowerPolicyController, PowerPolicyController*(void));
MOCK_METHOD0(GetSessionManagerClient, SessionManagerClient*(void));
MOCK_METHOD0(GetSMSClient, SMSClient*(void));
+ MOCK_METHOD0(GetSystemClockClient, SystemClockClient*(void));
MOCK_METHOD0(GetUpdateEngineClient, UpdateEngineClient*(void));
MOCK_METHOD0(GetIBusClient, IBusClient*(void));
MOCK_METHOD0(GetIBusConfigClient, IBusConfigClient*(void));
@@ -159,6 +161,9 @@ class MockDBusThreadManager : public DBusThreadManager {
MockSMSClient* mock_sms_client() {
return mock_sms_client_.get();
}
+ MockSystemClockClient* mock_system_clock_client() {
+ return mock_system_clock_client_.get();
+ }
MockUpdateEngineClient* mock_update_engine_client() {
return mock_update_engine_client_.get();
}
@@ -190,6 +195,7 @@ class MockDBusThreadManager : public DBusThreadManager {
scoped_ptr<MockPowerManagerClient> mock_power_manager_client_;
scoped_ptr<MockSessionManagerClient> mock_session_manager_client_;
scoped_ptr<MockSMSClient> mock_sms_client_;
+ scoped_ptr<MockSystemClockClient> mock_system_clock_client_;
scoped_ptr<MockUpdateEngineClient> mock_update_engine_client_;
scoped_ptr<PowerPolicyController> power_policy_controller_;
diff --git a/chromeos/dbus/mock_dbus_thread_manager_without_gmock.cc b/chromeos/dbus/mock_dbus_thread_manager_without_gmock.cc
index 3e0234e..692d703 100644
--- a/chromeos/dbus/mock_dbus_thread_manager_without_gmock.cc
+++ b/chromeos/dbus/mock_dbus_thread_manager_without_gmock.cc
@@ -177,6 +177,11 @@ SMSClient* MockDBusThreadManagerWithoutGMock::GetSMSClient() {
return NULL;
}
+SystemClockClient* MockDBusThreadManagerWithoutGMock::GetSystemClockClient() {
+ NOTIMPLEMENTED();
+ return NULL;
+}
+
UpdateEngineClient* MockDBusThreadManagerWithoutGMock::GetUpdateEngineClient() {
NOTIMPLEMENTED();
return NULL;
diff --git a/chromeos/dbus/mock_dbus_thread_manager_without_gmock.h b/chromeos/dbus/mock_dbus_thread_manager_without_gmock.h
index 6fe4551..dc69937 100644
--- a/chromeos/dbus/mock_dbus_thread_manager_without_gmock.h
+++ b/chromeos/dbus/mock_dbus_thread_manager_without_gmock.h
@@ -63,6 +63,7 @@ class MockDBusThreadManagerWithoutGMock : public DBusThreadManager {
virtual PowerPolicyController* GetPowerPolicyController() OVERRIDE;
virtual SessionManagerClient* GetSessionManagerClient() OVERRIDE;
virtual SMSClient* GetSMSClient() OVERRIDE;
+ virtual SystemClockClient* GetSystemClockClient() OVERRIDE;
virtual UpdateEngineClient* GetUpdateEngineClient() OVERRIDE;
virtual BluetoothOutOfBandClient* GetBluetoothOutOfBandClient() OVERRIDE;
virtual IBusClient* GetIBusClient() OVERRIDE;
diff --git a/chromeos/dbus/mock_system_clock_client.cc b/chromeos/dbus/mock_system_clock_client.cc
new file mode 100644
index 0000000..5269719
--- /dev/null
+++ b/chromeos/dbus/mock_system_clock_client.cc
@@ -0,0 +1,13 @@
+// Copyright (c) 2013 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 "chromeos/dbus/mock_system_clock_client.h"
+
+
+namespace chromeos {
+
+MockSystemClockClient::MockSystemClockClient() {}
+MockSystemClockClient::~MockSystemClockClient() {}
+
+} // namespace chromeos
diff --git a/chromeos/dbus/mock_system_clock_client.h b/chromeos/dbus/mock_system_clock_client.h
new file mode 100644
index 0000000..547c385
--- /dev/null
+++ b/chromeos/dbus/mock_system_clock_client.h
@@ -0,0 +1,29 @@
+// Copyright (c) 2013 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 CHROMEOS_DBUS_MOCK_SYSTEM_CLOCK_CLIENT_H_
+#define CHROMEOS_DBUS_MOCK_SYSTEM_CLOCK_CLIENT_H_
+
+#include "chromeos/dbus/system_clock_client.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace chromeos {
+
+// SystemClockClient is used to communicate with the system clock.
+class MockSystemClockClient : public SystemClockClient {
+ public:
+ MockSystemClockClient();
+ virtual ~MockSystemClockClient();
+
+ MOCK_METHOD1(AddObserver, void(Observer*));
+ MOCK_METHOD1(RemoveObserver, void(Observer*));
+ MOCK_METHOD1(HasObserver, bool(Observer*));
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockSystemClockClient);
+};
+
+} // namespace chromeos
+
+#endif // CHROMEOS_DBUS_MOCK_SYSTEM_CLOCK_CLIENT_H_
diff --git a/chromeos/dbus/system_clock_client.cc b/chromeos/dbus/system_clock_client.cc
new file mode 100644
index 0000000..a9daa2f
--- /dev/null
+++ b/chromeos/dbus/system_clock_client.cc
@@ -0,0 +1,111 @@
+// Copyright (c) 2013 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 "chromeos/dbus/system_clock_client.h"
+
+#include "base/bind.h"
+#include "dbus/bus.h"
+#include "dbus/message.h"
+#include "dbus/object_path.h"
+#include "dbus/object_proxy.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
+
+namespace chromeos {
+
+// The SystemClockClient implementation used in production.
+class SystemClockClientImpl : public SystemClockClient {
+ public:
+ explicit SystemClockClientImpl(dbus::Bus* bus)
+ : system_clock_proxy_(NULL),
+ weak_ptr_factory_(this) {
+ system_clock_proxy_ = bus->GetObjectProxy(
+ system_clock::kSystemClockServiceName,
+ dbus::ObjectPath(system_clock::kSystemClockServicePath));
+
+ // Monitor the D-Bus signal for TimeUpdated changes.
+ system_clock_proxy_->ConnectToSignal(
+ system_clock::kSystemClockInterface,
+ system_clock::kSystemClockUpdated,
+ base::Bind(&SystemClockClientImpl::TimeUpdatedReceived,
+ weak_ptr_factory_.GetWeakPtr()),
+ base::Bind(&SystemClockClientImpl::TimeUpdatedConnected,
+ weak_ptr_factory_.GetWeakPtr()));
+ }
+
+ virtual ~SystemClockClientImpl() {
+ }
+
+ // SystemClockClient overrides:
+ virtual void AddObserver(Observer* observer) OVERRIDE {
+ observers_.AddObserver(observer);
+ }
+
+ virtual void RemoveObserver(Observer* observer) OVERRIDE {
+ observers_.RemoveObserver(observer);
+ }
+
+ virtual bool HasObserver(Observer* observer) OVERRIDE {
+ return observers_.HasObserver(observer);
+ }
+
+ private:
+ // Called when a TimeUpdated signal is received.
+ void TimeUpdatedReceived(dbus::Signal* signal) {
+ VLOG(1) << "TimeUpdated signal received: " << signal->ToString();
+ dbus::MessageReader reader(signal);
+ FOR_EACH_OBSERVER(Observer, observers_, SystemClockUpdated());
+ }
+
+ // Called when the TimeUpdated signal is initially connected.
+ void TimeUpdatedConnected(const std::string& interface_name,
+ const std::string& signal_name,
+ bool success) {
+ LOG_IF(ERROR, !success)
+ << "Failed to connect to TimeUpdated signal.";
+ }
+
+ dbus::ObjectProxy* system_clock_proxy_;
+ ObserverList<Observer> observers_;
+
+ // Note: This should remain the last member so it'll be destroyed and
+ // invalidate its weak pointers before any other members are destroyed.
+ base::WeakPtrFactory<SystemClockClientImpl> weak_ptr_factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(SystemClockClientImpl);
+};
+
+// The SystemClockClient implementation used on Linux desktop,
+// which does nothing.
+class SystemClockClientStubImpl : public SystemClockClient {
+ public:
+ SystemClockClientStubImpl() {}
+ ~SystemClockClientStubImpl() {}
+
+ // SystemClockClient overrides:
+ virtual void AddObserver(Observer* observer) OVERRIDE {}
+ virtual void RemoveObserver(Observer* observer) OVERRIDE {}
+ virtual bool HasObserver(Observer* observer) OVERRIDE { return false; }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(SystemClockClientStubImpl);
+};
+
+SystemClockClient::SystemClockClient() {
+}
+
+SystemClockClient::~SystemClockClient() {
+}
+
+// static
+SystemClockClient* SystemClockClient::Create(
+ DBusClientImplementationType type,
+ dbus::Bus* bus) {
+ if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) {
+ return new SystemClockClientImpl(bus);
+ }
+ DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type);
+ return new SystemClockClientStubImpl();
+}
+
+} // namespace chromeos
diff --git a/chromeos/dbus/system_clock_client.h b/chromeos/dbus/system_clock_client.h
new file mode 100644
index 0000000..38158da
--- /dev/null
+++ b/chromeos/dbus/system_clock_client.h
@@ -0,0 +1,52 @@
+// Copyright (c) 2013 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 CHROMEOS_DBUS_SYSTEM_CLOCK_CLIENT_H_
+#define CHROMEOS_DBUS_SYSTEM_CLOCK_CLIENT_H_
+
+#include "base/observer_list.h"
+#include "chromeos/chromeos_export.h"
+#include "chromeos/dbus/dbus_client_implementation_type.h"
+
+namespace dbus {
+class Bus;
+} // namespace
+
+namespace chromeos {
+
+// SystemClockClient is used to communicate with the system clock.
+class CHROMEOS_EXPORT SystemClockClient {
+ public:
+ // Interface for observing changes from the system clock.
+ class Observer {
+ public:
+ // Called when the status is updated.
+ virtual void SystemClockUpdated() {}
+ protected:
+ virtual ~Observer() {}
+ };
+
+ virtual ~SystemClockClient();
+
+ // Adds and removes the observer.
+ virtual void AddObserver(Observer* observer) = 0;
+ virtual void RemoveObserver(Observer* observer) = 0;
+ // Returns true if this object has the given observer.
+ virtual bool HasObserver(Observer* observer) = 0;
+
+ // Creates the instance.
+ static SystemClockClient* Create(DBusClientImplementationType type,
+ dbus::Bus* bus);
+
+ protected:
+ // Create() should be used instead.
+ SystemClockClient();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(SystemClockClient);
+};
+
+} // namespace chromeos
+
+#endif // CHROMEOS_DBUS_SYSTEM_CLOCK_CLIENT_H_