From 834823a09b57399d0cbecbcc3953493c87fd21b5 Mon Sep 17 00:00:00 2001 From: xiaojianfeng Date: Fri, 8 Jul 2022 14:37:02 +0800 Subject: [PATCH] refactor virtual screen DeathRecipient Signed-off-by: xiaojianfeng Change-Id: I17b9180c3a199939bd1fd2af8a93beba630fb39e --- .../zidl/display_manager_agent_interface.h | 1 - dmserver/include/abstract_screen_controller.h | 3 +- .../display_manager_agent_controller.h | 2 - dmserver/src/abstract_screen_controller.cpp | 39 +++++++------------ .../src/display_manager_agent_controller.cpp | 6 --- dmserver/src/display_manager_service.cpp | 4 ++ utils/include/client_agent_container.h | 39 +++++-------------- wmserver/src/window_node_container.cpp | 13 ++----- 8 files changed, 33 insertions(+), 74 deletions(-) diff --git a/dm/include/zidl/display_manager_agent_interface.h b/dm/include/zidl/display_manager_agent_interface.h index 69b682d3..e4bb73c4 100644 --- a/dm/include/zidl/display_manager_agent_interface.h +++ b/dm/include/zidl/display_manager_agent_interface.h @@ -28,7 +28,6 @@ enum class DisplayManagerAgentType : uint32_t { DISPLAY_STATE_LISTENER, SCREEN_EVENT_LISTENER, DISPLAY_EVENT_LISTENER, - VIRTUAL_SCREEN_DIED_LISTENER, }; class IDisplayManagerAgent : public IRemoteBroker { diff --git a/dmserver/include/abstract_screen_controller.h b/dmserver/include/abstract_screen_controller.h index ec8eb71b..41f7b73c 100644 --- a/dmserver/include/abstract_screen_controller.h +++ b/dmserver/include/abstract_screen_controller.h @@ -25,6 +25,7 @@ #include #include "abstract_screen.h" +#include "agent_death_recipient.h" #include "display_manager_agent_controller.h" #include "dm_common.h" #include "screen.h" @@ -85,7 +86,6 @@ private: void RegisterRsScreenConnectionChangeListener(); void OnRsScreenConnectionChange(ScreenId rsScreenId, ScreenEvent screenEvent); bool OnRemoteDied(const sptr& agent); - bool RegisterVirtualScreenAgent(const sptr& displayManagerAgent); void ProcessScreenConnected(ScreenId rsScreenId); sptr InitAndGetScreen(ScreenId rsScreenId); void ProcessScreenDisconnected(ScreenId rsScreenId); @@ -133,6 +133,7 @@ private: std::map> dmsScreenGroupMap_; std::map> displayNodeMap_; std::map, std::vector> screenAgentMap_; + sptr deathRecipient_ { nullptr }; sptr abstractScreenCallback_; std::shared_ptr controllerHandler_; std::atomic defaultRsScreenId_ {SCREEN_ID_INVALID }; diff --git a/dmserver/include/display_manager_agent_controller.h b/dmserver/include/display_manager_agent_controller.h index ca723ac3..9761a04e 100644 --- a/dmserver/include/display_manager_agent_controller.h +++ b/dmserver/include/display_manager_agent_controller.h @@ -25,13 +25,11 @@ namespace OHOS { namespace Rosen { class DisplayManagerAgentController { WM_DECLARE_SINGLE_INSTANCE_BASE(DisplayManagerAgentController) -using VirtualScreenDestroyCallback = std::function)>; public: bool RegisterDisplayManagerAgent(const sptr& displayManagerAgent, DisplayManagerAgentType type); bool UnregisterDisplayManagerAgent(const sptr& displayManagerAgent, DisplayManagerAgentType type); - bool SetRemoveAgentCallback(const VirtualScreenDestroyCallback& callback, DisplayManagerAgentType type); bool NotifyDisplayPowerEvent(DisplayPowerEvent event, EventStatus status); bool NotifyDisplayStateChanged(DisplayId id, DisplayState state); diff --git a/dmserver/src/abstract_screen_controller.cpp b/dmserver/src/abstract_screen_controller.cpp index ffed9143..f1871234 100644 --- a/dmserver/src/abstract_screen_controller.cpp +++ b/dmserver/src/abstract_screen_controller.cpp @@ -61,12 +61,6 @@ void AbstractScreenController::RegisterRsScreenConnectionChangeListener() // post task after 50 ms. controllerHandler_->PostTask(task, 50, AppExecFwk::EventQueue::Priority::HIGH); } - bool callbackRegister = DisplayManagerAgentController::GetInstance().SetRemoveAgentCallback( - std::bind(&AbstractScreenController::OnRemoteDied, this, std::placeholders::_1), - DisplayManagerAgentType::VIRTUAL_SCREEN_DIED_LISTENER); - if (!callbackRegister) { - WLOGFE("virtualScreen callback registered failed"); - } } std::vector AbstractScreenController::GetAllScreenIds() const @@ -477,13 +471,6 @@ sptr AbstractScreenController::AddAsSuccedentScreenLocked(s return screenGroup; } -bool AbstractScreenController::RegisterVirtualScreenAgent(const sptr& displayManagerAgent) -{ - return DisplayManagerAgentController::GetInstance().RegisterDisplayManagerAgent( - iface_cast(displayManagerAgent), - DisplayManagerAgentType::VIRTUAL_SCREEN_DIED_LISTENER); -} - ScreenId AbstractScreenController::CreateVirtualScreen(VirtualScreenOption option, const sptr& displayManagerAgent) { @@ -493,16 +480,7 @@ ScreenId AbstractScreenController::CreateVirtualScreen(VirtualScreenOption optio if (rsId == SCREEN_ID_INVALID) { return SCREEN_ID_INVALID; } - std::vector virtualScreenIds; std::lock_guard lock(mutex_); - auto agIter = screenAgentMap_.find(displayManagerAgent); - if (agIter == screenAgentMap_.end()) { - if (!RegisterVirtualScreenAgent(displayManagerAgent)) { - return SCREEN_ID_INVALID; - } - } else { - virtualScreenIds = screenAgentMap_[displayManagerAgent]; - } ScreenId dmsScreenId = SCREEN_ID_INVALID; if (!screenIdManager_.ConvertToDmsScreenId(rsId, dmsScreenId)) { dmsScreenId = screenIdManager_.CreateAndGetNewScreenId(rsId); @@ -511,6 +489,7 @@ ScreenId AbstractScreenController::CreateVirtualScreen(VirtualScreenOption optio if (absScreen == nullptr || info == nullptr) { WLOGFI("new AbstractScreen or SupportedScreenModes failed"); screenIdManager_.DeleteScreenId(dmsScreenId); + rsInterface_.RemoveVirtualScreen(rsId); return SCREEN_ID_INVALID; } info->width_ = option.width_; @@ -524,11 +503,18 @@ ScreenId AbstractScreenController::CreateVirtualScreen(VirtualScreenOption optio absScreen->type_ = ScreenType::VIRTUAL; dmsScreenMap_.insert(std::make_pair(dmsScreenId, absScreen)); NotifyScreenConnected(absScreen->ConvertToScreenInfo()); + if (deathRecipient_ == nullptr) { + deathRecipient_ = new AgentDeathRecipient( + std::bind(&AbstractScreenController::OnRemoteDied, this, std::placeholders::_1)); + } + auto agIter = screenAgentMap_.find(displayManagerAgent); + if (agIter == screenAgentMap_.end()) { + displayManagerAgent->AddDeathRecipient(deathRecipient_); + } + screenAgentMap_[displayManagerAgent].emplace_back(dmsScreenId); } else { WLOGFI("id: %{public}" PRIu64" appears in screenIdManager_. ", rsId); } - virtualScreenIds.emplace_back(dmsScreenId); - screenAgentMap_[displayManagerAgent] = virtualScreenIds; return dmsScreenId; } @@ -550,6 +536,10 @@ DMError AbstractScreenController::DestroyVirtualScreen(ScreenId screenId) } } if (agentFound) { + if (agentIter.first != nullptr && agentIter.second.empty()) { + agentIter.first->RemoveDeathRecipient(deathRecipient_); + screenAgentMap_.erase(agentIter.first); + } break; } } @@ -967,6 +957,7 @@ bool AbstractScreenController::OnRemoteDied(const sptr& agent) if (agent == nullptr) { return false; } + std::lock_guard lock(mutex_); auto agentIter = screenAgentMap_.find(agent); if (agentIter != screenAgentMap_.end()) { while (screenAgentMap_[agent].size() > 0) { diff --git a/dmserver/src/display_manager_agent_controller.cpp b/dmserver/src/display_manager_agent_controller.cpp index a206c53e..82e4b453 100644 --- a/dmserver/src/display_manager_agent_controller.cpp +++ b/dmserver/src/display_manager_agent_controller.cpp @@ -175,11 +175,5 @@ void DisplayManagerAgentController::OnDisplayChange( agent->OnDisplayChange(displayInfo, displayChangeEvent); } } - -bool DisplayManagerAgentController::SetRemoveAgentCallback(const VirtualScreenDestroyCallback& callback, - DisplayManagerAgentType type) -{ - return dmAgentContainer_.SetRemoveAgentCallback(callback, type); -} } } \ No newline at end of file diff --git a/dmserver/src/display_manager_service.cpp b/dmserver/src/display_manager_service.cpp index d3052bd0..d323315e 100644 --- a/dmserver/src/display_manager_service.cpp +++ b/dmserver/src/display_manager_service.cpp @@ -175,6 +175,10 @@ sptr DisplayManagerService::GetDisplayInfoByScreen(ScreenId screenI ScreenId DisplayManagerService::CreateVirtualScreen(VirtualScreenOption option, const sptr& displayManagerAgent) { + if (displayManagerAgent == nullptr) { + WLOGFE("displayManagerAgent invalid"); + return SCREEN_ID_INVALID; + } HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "dms:CreateVirtualScreen(%s)", option.name_.c_str()); ScreenId screenId = abstractScreenController_->CreateVirtualScreen(option, displayManagerAgent); CHECK_SCREEN_AND_RETURN(SCREEN_ID_INVALID); diff --git a/utils/include/client_agent_container.h b/utils/include/client_agent_container.h index 73797941..bca632db 100644 --- a/utils/include/client_agent_container.h +++ b/utils/include/client_agent_container.h @@ -21,25 +21,22 @@ #include #include "agent_death_recipient.h" #include "window_manager_hilog.h" -#include "zidl/display_manager_agent_interface.h" namespace OHOS { namespace Rosen { template class ClientAgentContainer { -using DestroyCallback = std::function)>; public: ClientAgentContainer(); virtual ~ClientAgentContainer() = default; bool RegisterAgent(const sptr& agent, T2 type); bool UnregisterAgent(const sptr& agent, T2 type); - bool SetRemoveAgentCallback(const DestroyCallback& callback, T2 type); std::set> GetAgentsByType(T2 type); private: void RemoveAgent(const sptr& remoteObject); - sptr UnregisterAgentLocked(std::set>& agents, const sptr& agent); + bool UnregisterAgentLocked(std::set>& agents, const sptr& agent); static constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "ClientAgentContainer"}; @@ -56,7 +53,6 @@ private: std::recursive_mutex mutex_; std::map>> agentMap_; - std::map callbackMap_; sptr deathRecipient_; }; @@ -89,20 +85,9 @@ bool ClientAgentContainer::UnregisterAgent(const sptr& agent, T2 typ return false; } auto& agents = agentMap_.at(type); - WLOGFI("UnregisterAgent: agent: %{public}p in ClientAgentContainer", agent->AsObject().GetRefPtr()); - auto ret = UnregisterAgentLocked(agents, agent->AsObject()); - if (ret != nullptr) { - agent->AsObject()->RemoveDeathRecipient(deathRecipient_); - } - return true; -} - -template -bool ClientAgentContainer::SetRemoveAgentCallback(const DestroyCallback& callback, T2 type) -{ - callbackMap_[type] = callback; - WLOG_I("ClientAgentContainer callback registered type:%{public}u", type); - return true; + bool ret = UnregisterAgentLocked(agents, agent->AsObject()); + agent->AsObject()->RemoveDeathRecipient(deathRecipient_); + return ret; } template @@ -117,17 +102,17 @@ std::set> ClientAgentContainer::GetAgentsByType(T2 type) } template -sptr ClientAgentContainer::UnregisterAgentLocked(std::set>& agents, +bool ClientAgentContainer::UnregisterAgentLocked(std::set>& agents, const sptr& agent) { auto iter = std::find_if(agents.begin(), agents.end(), finder_t(agent)); if (iter == agents.end()) { WLOGFW("could not find this agent"); - return nullptr; + return false; } - auto res = *iter; agents.erase(iter); - return res; + WLOGFI("agent unregistered"); + return true; } template @@ -135,14 +120,8 @@ void ClientAgentContainer::RemoveAgent(const sptr& remote { WLOGFI("RemoveAgent"); std::lock_guard lock(mutex_); - DestroyCallback removeAgentCallback = nullptr; for (auto& elem : agentMap_) { - auto agent = UnregisterAgentLocked(elem.second, remoteObject); - if (agent != nullptr) { - if (callbackMap_[elem.first] != nullptr) { - removeAgentCallback = callbackMap_[elem.first]; - removeAgentCallback(remoteObject); - } + if (UnregisterAgentLocked(elem.second, remoteObject)) { break; } } diff --git a/wmserver/src/window_node_container.cpp b/wmserver/src/window_node_container.cpp index 841ae680..2674de12 100644 --- a/wmserver/src/window_node_container.cpp +++ b/wmserver/src/window_node_container.cpp @@ -1395,13 +1395,10 @@ WMError WindowNodeContainer::ToggleShownStateForAllAppWindows( std::function restoreFunc, bool restore) { WLOGFI("ToggleShownStateForAllAppWindows"); - sptr recentWindowNode = nullptr; for (auto node : aboveAppWindowNode_->children_) { - if (node->GetWindowType() == WindowType::WINDOW_TYPE_LAUNCHER_RECENT) { - recentWindowNode = node; - if (node->GetWindowMode() == WindowMode::WINDOW_MODE_FULLSCREEN) { - return WMError::WM_DO_NOTHING; - } + if (node->GetWindowType() == WindowType::WINDOW_TYPE_LAUNCHER_RECENT && + node->GetWindowMode() == WindowMode::WINDOW_MODE_FULLSCREEN && restore) { + return WMError::WM_DO_NOTHING; } } // to do, backup reentry: 1.ToggleShownStateForAllAppWindows fast; 2.this display should reset backupWindowIds_. @@ -1413,10 +1410,6 @@ WMError WindowNodeContainer::ToggleShownStateForAllAppWindows( } if (!restore && !appWindowNode_->children_.empty() && backupWindowIds_.empty()) { WLOGFI("backup"); - if (recentWindowNode != nullptr && recentWindowNode->GetWindowToken() != nullptr) { - WLOGFI("hide recent"); - recentWindowNode->GetWindowToken()->UpdateWindowState(WindowState::STATE_HIDDEN); - } BackUpAllAppWindows(); } else if (restore && !backupWindowIds_.empty()) { WLOGFI("restore");