1#ifndef ANDROID_DVR_SERVICES_VRFLINGER_DISPLAY_MANAGER_SERVICE_H_
2#define ANDROID_DVR_SERVICES_VRFLINGER_DISPLAY_MANAGER_SERVICE_H_
3
4#include <pdx/service.h>
5#include <pdx/status.h>
6#include <private/dvr/display_protocol.h>
7
8#include "display_service.h"
9
10namespace android {
11namespace dvr {
12
13class DisplayManagerService;
14
15// The display manager is a client of the display manager service. This class
16// represents the connected client that the display manager service sends
17// notifications to.
18class DisplayManager : public pdx::Channel {
19 public:
20  DisplayManager(DisplayManagerService* service, int channel_id)
21      : service_(service), channel_id_(channel_id) {}
22
23  int channel_id() const { return channel_id_; }
24
25  // Sets or clears the channel event mask to indicate pending events that the
26  // display manager on the other end of the channel should read and handle.
27  // When |pending| is true the POLLIN bit is set in the event mask; when
28  // |pending| is false the POLLIN bit is cleared in the event mask.
29  void SetNotificationsPending(bool pending);
30
31 private:
32  DisplayManager(const DisplayManager&) = delete;
33  void operator=(const DisplayManager&) = delete;
34
35  DisplayManagerService* service_;
36  int channel_id_;
37};
38
39// The display manager service marshalls state and events from the display
40// service to the display manager.
41class DisplayManagerService : public pdx::ServiceBase<DisplayManagerService> {
42 public:
43  std::shared_ptr<pdx::Channel> OnChannelOpen(pdx::Message& message) override;
44  void OnChannelClose(pdx::Message& message,
45                      const std::shared_ptr<pdx::Channel>& channel) override;
46  pdx::Status<void> HandleMessage(pdx::Message& message) override;
47
48 private:
49  friend BASE;
50
51  explicit DisplayManagerService(
52      const std::shared_ptr<DisplayService>& display_service);
53
54  pdx::Status<std::vector<display::SurfaceState>> OnGetSurfaceState(
55      pdx::Message& message);
56  pdx::Status<pdx::LocalChannelHandle> OnGetSurfaceQueue(pdx::Message& message,
57                                                         int surface_id,
58                                                         int queue_id);
59
60  // Called by the display service to indicate changes to display surfaces that
61  // the display manager should evaluate.
62  void OnDisplaySurfaceChange();
63
64  DisplayManagerService(const DisplayManagerService&) = delete;
65  void operator=(const DisplayManagerService&) = delete;
66
67  std::shared_ptr<DisplayService> display_service_;
68  std::shared_ptr<DisplayManager> display_manager_;
69};
70
71}  // namespace dvr
72}  // namespace android
73
74#endif  // ANDROID_DVR_SERVICES_VRFLINGER_DISPLAY_MANAGER_SERVICE_H_
75