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
12namespace chromeos {
13
14namespace {
15
16// Interval between checks for camera presence.
17const int kCameraCheckIntervalSeconds = 3;
18
19}  // namespace
20
21CameraPresenceNotifier::CameraPresenceNotifier() :
22    camera_present_on_last_check_(false),
23    weak_factory_(this) {}
24
25CameraPresenceNotifier::~CameraPresenceNotifier() {}
26
27// static
28CameraPresenceNotifier* CameraPresenceNotifier::GetInstance() {
29  return Singleton<CameraPresenceNotifier>::get();
30}
31
32void 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
47void 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
56void CameraPresenceNotifier::CheckCameraPresence() {
57  CameraDetector::StartPresenceCheck(
58      base::Bind(&CameraPresenceNotifier::OnCameraPresenceCheckDone,
59                 weak_factory_.GetWeakPtr()));
60}
61
62void 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