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.
5 #include "chrome/browser/chromeos/device/input_service_proxy.h"
7 #include "base/task_runner_util.h"
8 #include "content/public/browser/browser_thread.h"
10 using content::BrowserThread;
11 using device::InputServiceLinux;
13 typedef device::InputServiceLinux::InputDeviceInfo InputDeviceInfo;
17 class InputServiceProxy::ServiceObserver : public InputServiceLinux::Observer {
19 ServiceObserver() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); }
20 virtual ~ServiceObserver() { DCHECK(CalledOnValidThread()); }
22 void Initialize(const base::WeakPtr<InputServiceProxy>& proxy) {
23 DCHECK(CalledOnValidThread());
24 InputServiceLinux::GetInstance()->AddObserver(this);
29 DCHECK(CalledOnValidThread());
30 if (InputServiceLinux::HasInstance())
31 InputServiceLinux::GetInstance()->RemoveObserver(this);
35 std::vector<InputDeviceInfo> GetDevices() {
36 DCHECK(CalledOnValidThread());
37 std::vector<InputDeviceInfo> devices;
38 if (InputServiceLinux::HasInstance())
39 InputServiceLinux::GetInstance()->GetDevices(&devices);
43 void GetDeviceInfo(const std::string& id,
44 const InputServiceProxy::GetDeviceInfoCallback& callback) {
45 DCHECK(CalledOnValidThread());
49 if (InputServiceLinux::HasInstance())
50 success = InputServiceLinux::GetInstance()->GetDeviceInfo(id, &info);
51 BrowserThread::PostTask(
52 BrowserThread::UI, FROM_HERE, base::Bind(callback, success, info));
55 // InputServiceLinux::Observer implementation:
56 virtual void OnInputDeviceAdded(
57 const InputServiceLinux::InputDeviceInfo& info) OVERRIDE {
58 DCHECK(CalledOnValidThread());
59 BrowserThread::PostTask(
62 base::Bind(&InputServiceProxy::OnDeviceAdded, proxy_, info));
65 virtual void OnInputDeviceRemoved(const std::string& id) OVERRIDE {
66 DCHECK(CalledOnValidThread());
67 BrowserThread::PostTask(
70 base::Bind(&InputServiceProxy::OnDeviceRemoved, proxy_, id));
74 bool CalledOnValidThread() const {
75 return BrowserThread::CurrentlyOn(BrowserThread::FILE);
78 base::WeakPtr<InputServiceProxy> proxy_;
80 DISALLOW_COPY_AND_ASSIGN(ServiceObserver);
83 InputServiceProxy::InputServiceProxy()
84 : service_observer_(new ServiceObserver()), weak_factory_(this) {
85 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
86 BrowserThread::PostTask(
89 base::Bind(&InputServiceProxy::ServiceObserver::Initialize,
90 base::Unretained(service_observer_.get()),
91 weak_factory_.GetWeakPtr()));
94 InputServiceProxy::~InputServiceProxy() {
95 DCHECK(thread_checker_.CalledOnValidThread());
96 BrowserThread::PostTask(
99 base::Bind(&InputServiceProxy::ServiceObserver::Shutdown,
100 base::Unretained(service_observer_.release())));
103 void InputServiceProxy::AddObserver(Observer* observer) {
104 DCHECK(thread_checker_.CalledOnValidThread());
106 observers_.AddObserver(observer);
109 void InputServiceProxy::RemoveObserver(Observer* observer) {
110 DCHECK(thread_checker_.CalledOnValidThread());
112 observers_.RemoveObserver(observer);
115 void InputServiceProxy::GetDevices(const GetDevicesCallback& callback) {
116 DCHECK(thread_checker_.CalledOnValidThread());
117 BrowserThread::PostTaskAndReplyWithResult(
120 base::Bind(&InputServiceProxy::ServiceObserver::GetDevices,
121 base::Unretained(service_observer_.get())),
125 void InputServiceProxy::GetDeviceInfo(const std::string& id,
126 const GetDeviceInfoCallback& callback) {
127 DCHECK(thread_checker_.CalledOnValidThread());
128 BrowserThread::PostTask(
131 base::Bind(&InputServiceProxy::ServiceObserver::GetDeviceInfo,
132 base::Unretained(service_observer_.release()),
137 void InputServiceProxy::OnDeviceAdded(
138 const InputServiceLinux::InputDeviceInfo& info) {
139 DCHECK(thread_checker_.CalledOnValidThread());
140 FOR_EACH_OBSERVER(Observer, observers_, OnInputDeviceAdded(info));
143 void InputServiceProxy::OnDeviceRemoved(const std::string& id) {
144 DCHECK(thread_checker_.CalledOnValidThread());
145 FOR_EACH_OBSERVER(Observer, observers_, OnInputDeviceRemoved(id));
148 } // namespace chromeos