chromium/chromeos/ash/components/dbus/media_analytics/fake_media_analytics_client.cc

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

#include "chromeos/ash/components/dbus/media_analytics/fake_media_analytics_client.h"

#include <utility>

#include "base/functional/bind.h"
#include "base/logging.h"
#include "base/task/single_thread_task_runner.h"

namespace ash {

namespace {

FakeMediaAnalyticsClient* g_instance = nullptr;

}  // namespace

FakeMediaAnalyticsClient::FakeMediaAnalyticsClient() : process_running_(false) {
  current_state_.set_status(mri::State::UNINITIALIZED);
  DCHECK(!g_instance);
  g_instance = this;
}

FakeMediaAnalyticsClient::~FakeMediaAnalyticsClient() {
  DCHECK_EQ(this, g_instance);
  g_instance = nullptr;
}

// static
FakeMediaAnalyticsClient* FakeMediaAnalyticsClient::Get() {
  DCHECK(g_instance);
  return g_instance;
}

bool FakeMediaAnalyticsClient::FireMediaPerceptionEvent(
    const mri::MediaPerception& media_perception) {
  if (!process_running_)
    return false;
  base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
      FROM_HERE,
      base::BindOnce(&FakeMediaAnalyticsClient::OnMediaPerception,
                     weak_ptr_factory_.GetWeakPtr(), media_perception));
  return true;
}

void FakeMediaAnalyticsClient::SetDiagnostics(
    const mri::Diagnostics& diagnostics) {
  diagnostics_ = diagnostics;
}

void FakeMediaAnalyticsClient::AddObserver(Observer* observer) {
  observer_list_.AddObserver(observer);
}

void FakeMediaAnalyticsClient::RemoveObserver(Observer* observer) {
  observer_list_.RemoveObserver(observer);
}

void FakeMediaAnalyticsClient::GetState(
    chromeos::DBusMethodCallback<mri::State> callback) {
  if (!process_running_) {
    std::move(callback).Run(std::nullopt);
    return;
  }
  base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
      FROM_HERE,
      base::BindOnce(&FakeMediaAnalyticsClient::OnState,
                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
}

void FakeMediaAnalyticsClient::SetState(
    const mri::State& state,
    chromeos::DBusMethodCallback<mri::State> callback) {
  if (!process_running_) {
    std::move(callback).Run(std::nullopt);
    return;
  }
  DCHECK(state.has_status()) << "Trying to set state without status.";
  DCHECK(state.status() == mri::State::SUSPENDED ||
         state.status() == mri::State::RUNNING ||
         state.status() == mri::State::RESTARTING)
      << "Trying set state to something other than RUNNING, SUSPENDED or "
         "RESTARTING.";
  current_state_ = state;
  base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
      FROM_HERE,
      base::BindOnce(&FakeMediaAnalyticsClient::OnState,
                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
}

void FakeMediaAnalyticsClient::SetStateSuspended() {
  if (!process_running_) {
    return;
  }
  mri::State suspended;
  suspended.set_status(mri::State::SUSPENDED);
  current_state_ = suspended;
}

void FakeMediaAnalyticsClient::OnState(
    chromeos::DBusMethodCallback<mri::State> callback) {
  std::move(callback).Run(current_state_);
}

void FakeMediaAnalyticsClient::GetDiagnostics(
    chromeos::DBusMethodCallback<mri::Diagnostics> callback) {
  if (!process_running_) {
    LOG(ERROR) << "Fake media analytics process not running.";
    std::move(callback).Run(std::nullopt);
    return;
  }
  base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
      FROM_HERE,
      base::BindOnce(&FakeMediaAnalyticsClient::OnGetDiagnostics,
                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
}

void FakeMediaAnalyticsClient::BootstrapMojoConnection(
    base::ScopedFD file_descriptor,
    chromeos::VoidDBusMethodCallback callback) {
  // Fake that the mojo connection has been successfully established.
  base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
      FROM_HERE, base::BindOnce(std::move(callback), true));
}

void FakeMediaAnalyticsClient::OnGetDiagnostics(
    chromeos::DBusMethodCallback<mri::Diagnostics> callback) {
  std::move(callback).Run(diagnostics_);
}

void FakeMediaAnalyticsClient::OnMediaPerception(
    const mri::MediaPerception& media_perception) {
  for (auto& observer : observer_list_)
    observer.OnDetectionSignal(media_perception);
}

}  // namespace ash