display_manager_service.cpp revision 3f82d31341f66d0c58e1ec3360ea5f528ffe0ea4
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>
5eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar#include <private/android_filesystem_config.h>
63f82d31341f66d0c58e1ec3360ea5f528ffe0ea4Corey Tabaka#include <private/dvr/display_protocol.h>
7eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar#include <private/dvr/trusted_uids.h>
8a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#include <sys/poll.h>
9a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
10a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko#include <array>
11a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
12a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkousing android::pdx::Channel;
13a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkousing android::pdx::LocalChannelHandle;
14a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkousing android::pdx::Message;
15a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkousing android::pdx::default_transport::Endpoint;
16a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkousing android::pdx::rpc::DispatchRemoteMethod;
17a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkousing android::pdx::rpc::IfAnyOf;
18a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
19a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkonamespace {
20a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
21a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko// As a first line of defense, the display manager endpoint is only accessible
22a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko// to the user and group.
23a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
24a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko// TODO(dnicoara): Remove read/write permission for others. This is in here just
25a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko// to allow us to experiment with cast functionality from a plain old app.
26a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkoconstexpr mode_t kDisplayManagerEndpointFileMode =
27a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
28a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
29a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkoconstexpr size_t kMaxSurfacesPerRequest = 32;
30a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
31a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}  // anonymous namespace
32a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
33a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkonamespace android {
34a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkonamespace dvr {
35a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
36a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkovoid DisplayManager::SetNotificationsPending(bool pending) {
37f0a7bd033941e26e380232a0515e903cf8e678e5Alex Vakulenko  auto status = service_->ModifyChannelEvents(channel_id_, pending ? 0 : POLLIN,
38f0a7bd033941e26e380232a0515e903cf8e678e5Alex Vakulenko                                              pending ? POLLIN : 0);
39f0a7bd033941e26e380232a0515e903cf8e678e5Alex Vakulenko  ALOGE_IF(!status,
40a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko           "DisplayManager::SetNotificationPending: Failed to modify channel "
41a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko           "events: %s",
42f0a7bd033941e26e380232a0515e903cf8e678e5Alex Vakulenko           status.GetErrorMessage().c_str());
43a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
44a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
45a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex VakulenkoDisplayManagerService::DisplayManagerService(
46a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    const std::shared_ptr<DisplayService>& display_service)
47a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    : BASE("DisplayManagerService",
48a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko           Endpoint::Create(DisplayManagerRPC::kClientPath,
49a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko                            kDisplayManagerEndpointFileMode)),
50a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      display_service_(display_service) {
51a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  display_service_->SetDisplayConfigurationUpdateNotifier(
52a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      std::bind(&DisplayManagerService::OnDisplaySurfaceChange, this));
53a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
54a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
55a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkostd::shared_ptr<pdx::Channel> DisplayManagerService::OnChannelOpen(
56a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    pdx::Message& message) {
57a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  // Prevent more than one display manager from registering at a time.
58a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  if (display_manager_)
59a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    REPLY_ERROR_RETURN(message, EPERM, nullptr);
60a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
61a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  display_manager_ =
62a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      std::make_shared<DisplayManager>(this, message.GetChannelId());
63a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  return display_manager_;
64a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
65a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
66a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkovoid DisplayManagerService::OnChannelClose(
67a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    pdx::Message& /*message*/, const std::shared_ptr<pdx::Channel>& channel) {
68a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  // Unregister the display manager when the channel closes.
69a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  if (display_manager_ == channel)
70a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    display_manager_ = nullptr;
71a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
72a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
73f0a7bd033941e26e380232a0515e903cf8e678e5Alex Vakulenkopdx::Status<void> DisplayManagerService::HandleMessage(pdx::Message& message) {
74a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  auto channel = std::static_pointer_cast<DisplayManager>(message.GetChannel());
75a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
76a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  switch (message.GetOp()) {
77a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    case DisplayManagerRPC::GetSurfaceList::Opcode:
78a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      DispatchRemoteMethod<DisplayManagerRPC::GetSurfaceList>(
79a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          *this, &DisplayManagerService::OnGetSurfaceList, message);
80f0a7bd033941e26e380232a0515e903cf8e678e5Alex Vakulenko      return {};
81a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
82a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    case DisplayManagerRPC::UpdateSurfaces::Opcode:
83a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      DispatchRemoteMethod<DisplayManagerRPC::UpdateSurfaces>(
84a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          *this, &DisplayManagerService::OnUpdateSurfaces, message);
85f0a7bd033941e26e380232a0515e903cf8e678e5Alex Vakulenko      return {};
86a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
87eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar    case DisplayManagerRPC::SetupNamedBuffer::Opcode:
88eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar      DispatchRemoteMethod<DisplayManagerRPC::SetupNamedBuffer>(
89eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar          *this, &DisplayManagerService::OnSetupNamedBuffer, message);
90f0a7bd033941e26e380232a0515e903cf8e678e5Alex Vakulenko      return {};
9110e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
92a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    default:
93a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      return Service::DefaultHandleMessage(message);
94a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  }
95a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
96a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
97a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkostd::vector<DisplaySurfaceInfo> DisplayManagerService::OnGetSurfaceList(
98a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    pdx::Message& /*message*/) {
99a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  std::vector<DisplaySurfaceInfo> items;
100a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
10110e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar  display_service_->ForEachDisplaySurface(
10210e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar      [&items](const std::shared_ptr<DisplaySurface>& surface) mutable {
10310e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar        DisplaySurfaceInfo item;
10410e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
10510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar        item.surface_id = surface->surface_id();
10610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar        item.process_id = surface->process_id();
10710e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar        item.type = surface->type();
10810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar        item.flags = 0;  // TODO(eieio)
10910e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar        item.client_attributes = DisplaySurfaceAttributes{
11010e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar            {DisplaySurfaceAttributeEnum::Visible,
11110e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar             DisplaySurfaceAttributeValue{surface->client_visible()}},
11210e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar            {DisplaySurfaceAttributeEnum::ZOrder,
11310e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar             DisplaySurfaceAttributeValue{surface->client_z_order()}},
11410e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar            {DisplaySurfaceAttributeEnum::Blur,
11510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar             DisplaySurfaceAttributeValue{0.f}}};
11610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar        item.manager_attributes = DisplaySurfaceAttributes{
11710e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar            {DisplaySurfaceAttributeEnum::Visible,
11810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar             DisplaySurfaceAttributeValue{surface->manager_visible()}},
11910e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar            {DisplaySurfaceAttributeEnum::ZOrder,
12010e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar             DisplaySurfaceAttributeValue{surface->manager_z_order()}},
12110e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar            {DisplaySurfaceAttributeEnum::Blur,
12210e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar             DisplaySurfaceAttributeValue{surface->manager_blur()}}};
12310e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
12410e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar        items.push_back(item);
12510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar      });
126a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
127a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  // The fact that we're in the message handler implies that display_manager_ is
128a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  // not nullptr. No check required, unless this service becomes multi-threaded.
129a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  display_manager_->SetNotificationsPending(false);
130a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
131a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  return items;
132a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
133a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
134a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkoint DisplayManagerService::OnUpdateSurfaces(
135a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    pdx::Message& /*message*/,
136a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    const std::map<int, DisplaySurfaceAttributes>& updates) {
137a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  for (const auto& surface_update : updates) {
138a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    const int surface_id = surface_update.first;
139a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    const DisplaySurfaceAttributes& attributes = surface_update.second;
140a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
141a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    std::shared_ptr<DisplaySurface> surface =
142a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        display_service_->GetDisplaySurface(surface_id);
143a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
144a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    if (!surface)
145a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      return -ENOENT;
146a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
147a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    for (const auto& attribute : attributes) {
148a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      const auto& key = attribute.first;
149a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      const auto* variant = &attribute.second;
150a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      bool invalid_value = false;
151a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      switch (key) {
152a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        case DisplaySurfaceAttributeEnum::ZOrder:
153a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          invalid_value =
154a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              !IfAnyOf<int32_t>::Call(variant, [&surface](const auto& value) {
155a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko                surface->ManagerSetZOrder(value);
156a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              });
157a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          break;
158a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        case DisplaySurfaceAttributeEnum::Visible:
159a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          invalid_value = !IfAnyOf<int32_t, int64_t, bool>::Call(
160a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              variant, [&surface](const auto& value) {
161a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko                surface->ManagerSetVisible(value);
162a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              });
163a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          break;
164a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        case DisplaySurfaceAttributeEnum::Blur:
165a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          invalid_value = !IfAnyOf<int32_t, int64_t, float>::Call(
166a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              variant, [&surface](const auto& value) {
167a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko                surface->ManagerSetBlur(value);
168a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              });
169a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          break;
170a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        default:
171a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          ALOGW(
172a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              "DisplayManagerService::OnUpdateSurfaces: Attempt to set invalid "
173a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              "attribute %u on surface %d",
174a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko              key, surface_id);
175a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          break;
176a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      }
177a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
178a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      if (invalid_value) {
179a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        ALOGW(
180a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko            "DisplayManagerService::OnUpdateSurfaces: Failed to set display "
181a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko            "surface attribute '%s' because of incompatible type: %d",
182a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko            DisplaySurfaceAttributeEnum::ToString(key).c_str(),
183a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko            variant->index());
184a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko      }
185a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    }
186a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  }
187a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
188a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  // Reconfigure the display layers for any active surface changes.
189a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  display_service_->UpdateActiveDisplaySurfaces();
190a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  return 0;
191a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
192a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
193eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarpdx::Status<BorrowedNativeBufferHandle>
194eaa5522feac452703a0836310047d4b15702487dHendrik WagenaarDisplayManagerService::OnSetupNamedBuffer(pdx::Message& message,
195eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar                                          const std::string& name, size_t size,
1960057fddc71d1c3c3de8f9d0bd45a51bb293bfa3cJiwen 'Steve' Cai                                          uint64_t usage) {
197eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  if (message.GetEffectiveUserId() != AID_ROOT &&
198eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar      !IsTrustedUid(message.GetEffectiveUserId())) {
199eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar    // Only trusted users can setup named buffers.
200eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar    ALOGE("DisplayService::SetupNamedBuffer: Called by untrusted user: uid=%d.",
201eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar          message.GetEffectiveUserId());
202eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar    return {};
203eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  }
2040057fddc71d1c3c3de8f9d0bd45a51bb293bfa3cJiwen 'Steve' Cai  return display_service_->SetupNamedBuffer(name, size, usage);
20510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar}
20610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
207a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenkovoid DisplayManagerService::OnDisplaySurfaceChange() {
208a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  if (display_manager_) {
209a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    display_manager_->SetNotificationsPending(true);
210a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  } else {
211a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    // If there isn't a display manager registered, default all display surfaces
212a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    // to visible.
213a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    display_service_->ForEachDisplaySurface(
214a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        [](const std::shared_ptr<DisplaySurface>& surface) {
215a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko          surface->ManagerSetVisible(true);
216a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko        });
217a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko    display_service_->UpdateActiveDisplaySurfaces();
218a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko  }
219a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}
220a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko
221a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}  // namespace dvr
222a8a92784bc5f6a50ce00311c6161fbcfc0898c5aAlex Vakulenko}  // namespace android
223