• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
CameraPresenceNotifier()21 CameraPresenceNotifier::CameraPresenceNotifier() :
22     camera_present_on_last_check_(false),
23     weak_factory_(this) {}
24 
~CameraPresenceNotifier()25 CameraPresenceNotifier::~CameraPresenceNotifier() {}
26 
27 // static
GetInstance()28 CameraPresenceNotifier* CameraPresenceNotifier::GetInstance() {
29   return Singleton<CameraPresenceNotifier>::get();
30 }
31 
AddObserver(CameraPresenceNotifier::Observer * observer)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 
RemoveObserver(CameraPresenceNotifier::Observer * observer)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 
CheckCameraPresence()56 void CameraPresenceNotifier::CheckCameraPresence() {
57   CameraDetector::StartPresenceCheck(
58       base::Bind(&CameraPresenceNotifier::OnCameraPresenceCheckDone,
59                  weak_factory_.GetWeakPtr()));
60 }
61 
OnCameraPresenceCheckDone()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