#ifndef ANDROID_DVR_VR_FLINGER_H_
#define ANDROID_DVR_VR_FLINGER_H_

#include <thread>
#include <memory>

#define HWC2_INCLUDE_STRINGIFICATION
#define HWC2_USE_CPP11
#include <hardware/hwcomposer2.h>
#undef HWC2_INCLUDE_STRINGIFICATION
#undef HWC2_USE_CPP11

#include <pdx/service_dispatcher.h>
#include <vr/vr_manager/vr_manager.h>

namespace android {

namespace Hwc2 {
class Composer;
}  // namespace Hwc2

namespace dvr {

class DisplayService;

class VrFlinger {
 public:
  using RequestDisplayCallback = std::function<void(bool)>;
  static std::unique_ptr<VrFlinger> Create(
      Hwc2::Composer* hidl,
      hwc2_display_t primary_display_id,
      RequestDisplayCallback request_display_callback);
  ~VrFlinger();

  // These functions are all called on surface flinger's main thread.
  void OnBootFinished();
  void GrantDisplayOwnership();
  void SeizeDisplayOwnership();

  // dump all vr flinger state.
  std::string Dump();

 private:
  VrFlinger();
  bool Init(Hwc2::Composer* hidl,
            hwc2_display_t primary_display_id,
            RequestDisplayCallback request_display_callback);

  // Needs to be a separate class for binder's ref counting
  class PersistentVrStateCallback : public BnPersistentVrStateCallbacks {
   public:
    PersistentVrStateCallback(RequestDisplayCallback request_display_callback)
        : request_display_callback_(request_display_callback) {}
    void onPersistentVrStateChanged(bool enabled) override;
   private:
    RequestDisplayCallback request_display_callback_;
  };

  std::thread dispatcher_thread_;
  std::unique_ptr<android::pdx::ServiceDispatcher> dispatcher_;
  std::shared_ptr<android::dvr::DisplayService> display_service_;
  sp<PersistentVrStateCallback> persistent_vr_state_callback_;
  RequestDisplayCallback request_display_callback_;
};

} // namespace dvr
} // namespace android

#endif // ANDROID_DVR_VR_FLINGER_H_
