Home | History | Annotate | Download | only in chromeos
      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.
      4 
      5 #include "chrome/browser/chromeos/camera_presence_notifier.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/memory/singleton.h"
      9 #include "base/time/time.h"
     10 #include "chrome/browser/chromeos/camera_detector.h"
     11 
     12 namespace chromeos {
     13 
     14 namespace {
     15 
     16 // Interval between checks for camera presence.
     17 const int kCameraCheckIntervalSeconds = 3;
     18 
     19 }  // namespace
     20 
     21 CameraPresenceNotifier::CameraPresenceNotifier() :
     22     camera_present_on_last_check_(false),
     23     weak_factory_(this) {}
     24 
     25 CameraPresenceNotifier::~CameraPresenceNotifier() {}
     26 
     27 // static
     28 CameraPresenceNotifier* CameraPresenceNotifier::GetInstance() {
     29   return Singleton<CameraPresenceNotifier>::get();
     30 }
     31 
     32 void CameraPresenceNotifier::AddObserver(
     33     CameraPresenceNotifier::Observer* observer) {
     34   bool had_no_observers = !observers_.might_have_observers();
     35   observers_.AddObserver(observer);
     36   observer->OnCameraPresenceCheckDone(camera_present_on_last_check_);
     37   if (had_no_observers) {
     38     CheckCameraPresence();
     39     camera_check_timer_.Start(
     40         FROM_HERE,
     41         base::TimeDelta::FromSeconds(kCameraCheckIntervalSeconds),
     42         this,
     43         &CameraPresenceNotifier::CheckCameraPresence);
     44   }
     45 }
     46 
     47 void CameraPresenceNotifier::RemoveObserver(
     48     CameraPresenceNotifier::Observer* observer) {
     49   observers_.RemoveObserver(observer);
     50   if (!observers_.might_have_observers()) {
     51     camera_check_timer_.Stop();
     52     camera_present_on_last_check_ = false;
     53   }
     54 }
     55 
     56 void CameraPresenceNotifier::CheckCameraPresence() {
     57   CameraDetector::StartPresenceCheck(
     58       base::Bind(&CameraPresenceNotifier::OnCameraPresenceCheckDone,
     59                  weak_factory_.GetWeakPtr()));
     60 }
     61 
     62 void CameraPresenceNotifier::OnCameraPresenceCheckDone() {
     63   bool is_camera_present =
     64       CameraDetector::camera_presence() == CameraDetector::kCameraPresent;
     65   if (is_camera_present != camera_present_on_last_check_) {
     66     camera_present_on_last_check_ = is_camera_present;
     67     FOR_EACH_OBSERVER(Observer,
     68                       observers_,
     69                       OnCameraPresenceCheckDone(camera_present_on_last_check_));
     70   }
     71 }
     72 
     73 }  // namespace chromeos
     74