1#ifndef ANDROID_DVR_VR_FLINGER_H_
2#define ANDROID_DVR_VR_FLINGER_H_
3
4#include <thread>
5#include <memory>
6
7#define HWC2_INCLUDE_STRINGIFICATION
8#define HWC2_USE_CPP11
9#include <hardware/hwcomposer2.h>
10#undef HWC2_INCLUDE_STRINGIFICATION
11#undef HWC2_USE_CPP11
12
13#include <pdx/service_dispatcher.h>
14#include <vr/vr_manager/vr_manager.h>
15
16namespace android {
17
18namespace Hwc2 {
19class Composer;
20}  // namespace Hwc2
21
22namespace dvr {
23
24class DisplayService;
25
26class VrFlinger {
27 public:
28  using RequestDisplayCallback = std::function<void(bool)>;
29  static std::unique_ptr<VrFlinger> Create(
30      Hwc2::Composer* hidl,
31      hwc2_display_t primary_display_id,
32      RequestDisplayCallback request_display_callback);
33  ~VrFlinger();
34
35  // These functions are all called on surface flinger's main thread.
36  void OnBootFinished();
37  void GrantDisplayOwnership();
38  void SeizeDisplayOwnership();
39
40  // dump all vr flinger state.
41  std::string Dump();
42
43 private:
44  VrFlinger();
45  bool Init(Hwc2::Composer* hidl,
46            hwc2_display_t primary_display_id,
47            RequestDisplayCallback request_display_callback);
48
49  // Needs to be a separate class for binder's ref counting
50  class PersistentVrStateCallback : public BnPersistentVrStateCallbacks {
51   public:
52    PersistentVrStateCallback(RequestDisplayCallback request_display_callback)
53        : request_display_callback_(request_display_callback) {}
54    void onPersistentVrStateChanged(bool enabled) override;
55   private:
56    RequestDisplayCallback request_display_callback_;
57  };
58
59  std::thread dispatcher_thread_;
60  std::unique_ptr<android::pdx::ServiceDispatcher> dispatcher_;
61  std::shared_ptr<android::dvr::DisplayService> display_service_;
62  sp<PersistentVrStateCallback> persistent_vr_state_callback_;
63  RequestDisplayCallback request_display_callback_;
64};
65
66} // namespace dvr
67} // namespace android
68
69#endif // ANDROID_DVR_VR_FLINGER_H_
70