display_manager_service.cpp revision a8a92784bc5f6a50ce00311c6161fbcfc0898c5a
1a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#include "display_manager_service.h"
2a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
3a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#include <pdx/channel_handle.h>
4a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#include <pdx/default_transport/service_endpoint.h>
5a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#include <private/dvr/display_rpc.h>
6a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#include <sys/poll.h>
7a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
8a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#include <array>
9a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
10a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkousing android::pdx::Channel;
11a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkousing android::pdx::LocalChannelHandle;
12a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkousing android::pdx::Message;
13a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkousing android::pdx::default_transport::Endpoint;
14a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkousing android::pdx::rpc::DispatchRemoteMethod;
15a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkousing android::pdx::rpc::IfAnyOf;
16a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
17a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkonamespace {
18a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
19a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko// As a first line of defense, the display manager endpoint is only accessible
20a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko// to the user and group.
21a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
22a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko// TODO(dnicoara): Remove read/write permission for others. This is in here just
23a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko// to allow us to experiment with cast functionality from a plain old app.
24a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkoconstexpr mode_t kDisplayManagerEndpointFileMode =
25a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
26a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
27a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkoconstexpr size_t kMaxSurfacesPerRequest = 32;
28a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
29a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}  // anonymous namespace
30a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
31a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkonamespace android {
32a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkonamespace dvr {
33a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
34a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkovoid DisplayManager::SetNotificationsPending(bool pending) {
35a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  int ret = service_->ModifyChannelEvents(channel_id_, pending ? 0 : POLLIN,
36a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko                                          pending ? POLLIN : 0);
37a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  ALOGE_IF(ret < 0,
38a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko           "DisplayManager::SetNotificationPending: Failed to modify channel "
39a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko           "events: %s",
40a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko           strerror(-ret));
41a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
42a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
43a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex VakulenkoDisplayManagerService::DisplayManagerService(
44a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    const std::shared_ptr<DisplayService>& display_service)
45a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    : BASE("DisplayManagerService",
46a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko           Endpoint::Create(DisplayManagerRPC::kClientPath,
47a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko                            kDisplayManagerEndpointFileMode)),
48a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      display_service_(display_service) {
49a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  display_service_->SetDisplayConfigurationUpdateNotifier(
50a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      std::bind(&DisplayManagerService::OnDisplaySurfaceChange, this));
51a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
52a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
53a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkostd::shared_ptr<pdx::Channel> DisplayManagerService::OnChannelOpen(
54a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    pdx::Message& message) {
55a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  // Prevent more than one display manager from registering at a time.
56a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  if (display_manager_)
57a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    REPLY_ERROR_RETURN(message, EPERM, nullptr);
58a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
59a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  display_manager_ =
60a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      std::make_shared<DisplayManager>(this, message.GetChannelId());
61a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  return display_manager_;
62a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
63a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
64a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkovoid DisplayManagerService::OnChannelClose(
65a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    pdx::Message& /*message*/, const std::shared_ptr<pdx::Channel>& channel) {
66a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  // Unregister the display manager when the channel closes.
67a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  if (display_manager_ == channel)
68a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    display_manager_ = nullptr;
69a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
70a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
71a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkoint DisplayManagerService::HandleMessage(pdx::Message& message) {
72a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  auto channel = std::static_pointer_cast<DisplayManager>(message.GetChannel());
73a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
74a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  switch (message.GetOp()) {
75a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    case DisplayManagerRPC::GetSurfaceList::Opcode:
76a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      DispatchRemoteMethod<DisplayManagerRPC::GetSurfaceList>(
77a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          *this, &DisplayManagerService::OnGetSurfaceList, message);
78a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      return 0;
79a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
80a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    case DisplayManagerRPC::GetSurfaceBuffers::Opcode:
81a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      DispatchRemoteMethod<DisplayManagerRPC::GetSurfaceBuffers>(
82a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          *this, &DisplayManagerService::OnGetSurfaceBuffers, message);
83a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      return 0;
84a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
85a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    case DisplayManagerRPC::UpdateSurfaces::Opcode:
86a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      DispatchRemoteMethod<DisplayManagerRPC::UpdateSurfaces>(
87a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          *this, &DisplayManagerService::OnUpdateSurfaces, message);
88a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      return 0;
89a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
90a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    default:
91a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      return Service::DefaultHandleMessage(message);
92a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  }
93a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
94a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
95a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkostd::vector<DisplaySurfaceInfo> DisplayManagerService::OnGetSurfaceList(
96a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    pdx::Message& /*message*/) {
97a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  std::vector<DisplaySurfaceInfo> items;
98a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
99a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  display_service_->ForEachDisplaySurface([&items](
100a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      const std::shared_ptr<DisplaySurface>& surface) mutable {
101a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    DisplaySurfaceInfo item;
102a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
103a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    item.surface_id = surface->surface_id();
104a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    item.process_id = surface->process_id();
105a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    item.type = surface->type();
106a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    item.flags = 0;  // TODO(eieio)
107a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    item.client_attributes = DisplaySurfaceAttributes{
108a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        {DisplaySurfaceAttributeEnum::Visible,
109a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko         DisplaySurfaceAttributeValue{surface->client_visible()}},
110a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        {DisplaySurfaceAttributeEnum::ZOrder,
111a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko         DisplaySurfaceAttributeValue{surface->client_z_order()}},
112a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        {DisplaySurfaceAttributeEnum::Blur, DisplaySurfaceAttributeValue{0.f}}};
113a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    item.manager_attributes = DisplaySurfaceAttributes{
114a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        {DisplaySurfaceAttributeEnum::Visible,
115a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko         DisplaySurfaceAttributeValue{surface->manager_visible()}},
116a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        {DisplaySurfaceAttributeEnum::ZOrder,
117a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko         DisplaySurfaceAttributeValue{surface->manager_z_order()}},
118a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        {DisplaySurfaceAttributeEnum::Blur,
119a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko         DisplaySurfaceAttributeValue{surface->manager_blur()}}};
120a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
121a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    items.push_back(item);
122a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  });
123a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
124a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  // The fact that we're in the message handler implies that display_manager_ is
125a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  // not nullptr. No check required, unless this service becomes multi-threaded.
126a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  display_manager_->SetNotificationsPending(false);
127a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
128a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  return items;
129a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
130a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
131a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkostd::vector<LocalChannelHandle> DisplayManagerService::OnGetSurfaceBuffers(
132a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    pdx::Message& message, int surface_id) {
133a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  std::shared_ptr<DisplaySurface> surface =
134a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      display_service_->GetDisplaySurface(surface_id);
135a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  if (!surface)
136a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    REPLY_ERROR_RETURN(message, ENOENT, {});
137a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
138a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  std::vector<LocalChannelHandle> consumers;
139a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  int ret = surface->GetConsumers(&consumers);
140a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  if (ret < 0) {
141a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    ALOGE(
142a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        "DisplayManagerService::OnGetDisplaySurfaceBuffers: Failed to get "
143a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        "consumers for surface %d: %s",
144a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        surface_id, strerror(-ret));
145a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    REPLY_ERROR_RETURN(message, -ret, {});
146a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  }
147a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
148a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  return consumers;
149a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
150a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
151a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkoint DisplayManagerService::OnUpdateSurfaces(
152a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    pdx::Message& /*message*/,
153a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    const std::map<int, DisplaySurfaceAttributes>& updates) {
154a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  for (const auto& surface_update : updates) {
155a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    const int surface_id = surface_update.first;
156a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    const DisplaySurfaceAttributes& attributes = surface_update.second;
157a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
158a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    std::shared_ptr<DisplaySurface> surface =
159a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        display_service_->GetDisplaySurface(surface_id);
160a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
161a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    if (!surface)
162a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      return -ENOENT;
163a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
164a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    for (const auto& attribute : attributes) {
165a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      const auto& key = attribute.first;
166a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      const auto* variant = &attribute.second;
167a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      bool invalid_value = false;
168a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      switch (key) {
169a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        case DisplaySurfaceAttributeEnum::ZOrder:
170a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          invalid_value =
171a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              !IfAnyOf<int32_t>::Call(variant, [&surface](const auto& value) {
172a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko                surface->ManagerSetZOrder(value);
173a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              });
174a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          break;
175a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        case DisplaySurfaceAttributeEnum::Visible:
176a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          invalid_value = !IfAnyOf<int32_t, int64_t, bool>::Call(
177a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              variant, [&surface](const auto& value) {
178a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko                surface->ManagerSetVisible(value);
179a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              });
180a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          break;
181a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        case DisplaySurfaceAttributeEnum::Blur:
182a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          invalid_value = !IfAnyOf<int32_t, int64_t, float>::Call(
183a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              variant, [&surface](const auto& value) {
184a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko                surface->ManagerSetBlur(value);
185a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              });
186a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          break;
187a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        default:
188a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          ALOGW(
189a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              "DisplayManagerService::OnUpdateSurfaces: Attempt to set invalid "
190a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              "attribute %u on surface %d",
191a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              key, surface_id);
192a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          break;
193a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      }
194a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
195a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      if (invalid_value) {
196a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        ALOGW(
197a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko            "DisplayManagerService::OnUpdateSurfaces: Failed to set display "
198a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko            "surface attribute '%s' because of incompatible type: %d",
199a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko            DisplaySurfaceAttributeEnum::ToString(key).c_str(),
200a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko            variant->index());
201a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      }
202a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    }
203a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  }
204a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
205a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  // Reconfigure the display layers for any active surface changes.
206a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  display_service_->UpdateActiveDisplaySurfaces();
207a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  return 0;
208a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
209a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
210a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkovoid DisplayManagerService::OnDisplaySurfaceChange() {
211a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  if (display_manager_) {
212a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    display_manager_->SetNotificationsPending(true);
213a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  } else {
214a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    // If there isn't a display manager registered, default all display surfaces
215a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    // to visible.
216a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    display_service_->ForEachDisplaySurface(
217a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        [](const std::shared_ptr<DisplaySurface>& surface) {
218a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          surface->ManagerSetVisible(true);
219a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        });
220a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    display_service_->UpdateActiveDisplaySurfaces();
221a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  }
222a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
223a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
224a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}  // namespace dvr
225a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}  // namespace android
226