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