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

#ifndef CAMERA_HAL_ADAPTER_CAMERA_MODULE_CALLBACKS_DELEGATE_H_
#define CAMERA_HAL_ADAPTER_CAMERA_MODULE_CALLBACKS_DELEGATE_H_

#include "cros-camera/future.h"
#include "hal_adapter/cros_camera_mojo_utils.h"
#include "mojo/camera_common.mojom.h"

namespace cros {

class CameraModuleCallbacksDelegate
    : public internal::MojoChannel<mojom::CameraModuleCallbacks> {
 public:
  CameraModuleCallbacksDelegate(
      scoped_refptr<base::SingleThreadTaskRunner> task_runner);

  ~CameraModuleCallbacksDelegate() = default;

  void CameraDeviceStatusChange(int camera_id, int new_status);

  void TorchModeStatusChange(int camera_id, int new_status);

 private:
  void CameraDeviceStatusChangeOnThread(int camera_id,
                                        int new_status,
                                        base::Closure callback);

  void TorchModeStatusChangeOnThread(int camera_id,
                                     int new_status,
                                     base::Closure callback);

  cros::CancellationRelay relay_;

  DISALLOW_IMPLICIT_CONSTRUCTORS(CameraModuleCallbacksDelegate);
};

}  // namespace cros

#endif  // CAMERA_HAL_ADAPTER_CAMERA_MODULE_CALLBACKS_DELEGATE_H_
