Home | History | Annotate | Download | only in cros
      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 
     14 namespace chromeos {
     15 
     16 class 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 
     76 class BrightnessLibraryStubImpl : public BrightnessLibrary {
     77  public:
     78   BrightnessLibraryStubImpl() {}
     79   ~BrightnessLibraryStubImpl() {}
     80   void AddObserver(Observer* observer) {}
     81   void RemoveObserver(Observer* observer) {}
     82 };
     83 
     84 // static
     85 BrightnessLibrary* 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.
     95 DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::BrightnessLibraryImpl);
     96