// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "media/audio/power_observer_helper.h"

#include <utility>

#include "base/bind.h"
#include "base/logging.h"
#include "base/power_monitor/power_monitor.h"

namespace media {

PowerObserverHelper::PowerObserverHelper(
    scoped_refptr<base::SequencedTaskRunner> task_runner,
    base::RepeatingClosure suspend_callback,
    base::RepeatingClosure resume_callback)
    : task_runner_(std::move(task_runner)),
      suspend_callback_(std::move(suspend_callback)),
      resume_callback_(std::move(resume_callback)) {
  DCHECK(!suspend_callback_.is_null());
  DCHECK(!resume_callback_.is_null());

  // The PowerMonitor requires significant setup (a CFRunLoop and preallocated
  // IO ports) so it's not available under unit tests.  See the OSX impl of
  // base::PowerMonitorDeviceSource for more details.
  // TODO(grunell): We could be suspending when adding this as observer, and
  // we won't be notified about that. See if we can add
  // PowerMonitorSource::IsSuspending() so that this can be checked here.
  base::PowerMonitor::AddPowerSuspendObserver(this);
}

PowerObserverHelper::~PowerObserverHelper() {
  DCHECK(task_runner_->RunsTasksInCurrentSequence());
  base::PowerMonitor::RemovePowerSuspendObserver(this);
}

bool PowerObserverHelper::IsSuspending() const {
  DCHECK(task_runner_->RunsTasksInCurrentSequence());
  return is_suspending_;
}

void PowerObserverHelper::OnSuspend() {
  DVLOG(1) << "OnSuspend";
  if (!task_runner_->RunsTasksInCurrentSequence()) {
    task_runner_->PostTask(FROM_HERE,
                           base::BindOnce(&PowerObserverHelper::OnSuspend,
                                          weak_factory_.GetWeakPtr()));
    return;
  }

  is_suspending_ = true;
  suspend_callback_.Run();
}

void PowerObserverHelper::OnResume() {
  DVLOG(1) << "OnResume";
  if (!task_runner_->RunsTasksInCurrentSequence()) {
    task_runner_->PostTask(FROM_HERE,
                           base::BindOnce(&PowerObserverHelper::OnResume,
                                          weak_factory_.GetWeakPtr()));
    return;
  }

  is_suspending_ = false;
  resume_callback_.Run();
}

}  // namespace media
