1// Copyright (c) 2010 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 "chrome/browser/chromeos/cros/brightness_library.h"
6
7#include "base/message_loop.h"
8#include "base/observer_list.h"
9#include "chrome/browser/chromeos/brightness_bubble.h"
10#include "chrome/browser/chromeos/volume_bubble.h"
11#include "chrome/browser/chromeos/cros/cros_library.h"
12#include "content/browser/browser_thread.h"
13
14namespace chromeos {
15
16class BrightnessLibraryImpl : public BrightnessLibrary {
17 public:
18  BrightnessLibraryImpl() : brightness_connection_(NULL) {
19    if (CrosLibrary::Get()->EnsureLoaded())
20      Init();
21  }
22
23  ~BrightnessLibraryImpl() {
24    if (brightness_connection_) {
25      chromeos::DisconnectBrightness(brightness_connection_);
26      brightness_connection_ = NULL;
27    }
28  }
29
30  void AddObserver(Observer* observer) {
31    observers_.AddObserver(observer);
32  }
33
34  void RemoveObserver(Observer* observer) {
35    observers_.RemoveObserver(observer);
36  }
37
38 private:
39  static void BrightnessChangedHandler(void* object,
40                                       int brightness_level,
41                                       bool user_initiated) {
42    BrightnessLibraryImpl* self = static_cast<BrightnessLibraryImpl*>(object);
43    self->OnBrightnessChanged(brightness_level, user_initiated);
44  }
45
46  void Init() {
47    DCHECK(!brightness_connection_) << "Already intialized";
48    brightness_connection_ =
49        chromeos::MonitorBrightnessV2(&BrightnessChangedHandler, this);
50  }
51
52  void OnBrightnessChanged(int brightness_level, bool user_initiated) {
53    // Make sure we run on the UI thread.
54    if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
55      BrowserThread::PostTask(
56          BrowserThread::UI, FROM_HERE,
57          NewRunnableMethod(this,
58                            &BrightnessLibraryImpl::OnBrightnessChanged,
59                            brightness_level,
60                            user_initiated));
61      return;
62    }
63
64    FOR_EACH_OBSERVER(Observer,
65                      observers_,
66                      BrightnessChanged(brightness_level, user_initiated));
67  }
68
69  chromeos::BrightnessConnection brightness_connection_;
70
71  ObserverList<Observer> observers_;
72
73  DISALLOW_COPY_AND_ASSIGN(BrightnessLibraryImpl);
74};
75
76class BrightnessLibraryStubImpl : public BrightnessLibrary {
77 public:
78  BrightnessLibraryStubImpl() {}
79  ~BrightnessLibraryStubImpl() {}
80  void AddObserver(Observer* observer) {}
81  void RemoveObserver(Observer* observer) {}
82};
83
84// static
85BrightnessLibrary* BrightnessLibrary::GetImpl(bool stub) {
86  if (stub)
87    return new BrightnessLibraryStubImpl();
88  else
89    return new BrightnessLibraryImpl();
90}
91
92}  // namespace chromeos
93
94// Needed for NewRunnableMethod() call above.
95DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::BrightnessLibraryImpl);
96