!1147 refactor virtual screen DeathRecipient

Merge pull request !1147 from xiaojianfeng/master
This commit is contained in:
openharmony_ci
2022-07-12 03:21:27 +00:00
committed by Gitee
8 changed files with 33 additions and 74 deletions
@@ -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 {
@@ -25,6 +25,7 @@
#include <transaction/rs_interfaces.h>
#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<IRemoteObject>& agent);
bool RegisterVirtualScreenAgent(const sptr<IRemoteObject>& displayManagerAgent);
void ProcessScreenConnected(ScreenId rsScreenId);
sptr<AbstractScreen> InitAndGetScreen(ScreenId rsScreenId);
void ProcessScreenDisconnected(ScreenId rsScreenId);
@@ -133,6 +133,7 @@ private:
std::map<ScreenId, sptr<AbstractScreenGroup>> dmsScreenGroupMap_;
std::map<ScreenId, std::shared_ptr<RSDisplayNode>> displayNodeMap_;
std::map<sptr<IRemoteObject>, std::vector<ScreenId>> screenAgentMap_;
sptr<AgentDeathRecipient> deathRecipient_ { nullptr };
sptr<AbstractScreenCallback> abstractScreenCallback_;
std::shared_ptr<AppExecFwk::EventHandler> controllerHandler_;
std::atomic<ScreenId> defaultRsScreenId_ {SCREEN_ID_INVALID };
@@ -25,13 +25,11 @@ namespace OHOS {
namespace Rosen {
class DisplayManagerAgentController {
WM_DECLARE_SINGLE_INSTANCE_BASE(DisplayManagerAgentController)
using VirtualScreenDestroyCallback = std::function<bool(const sptr<IRemoteObject>)>;
public:
bool RegisterDisplayManagerAgent(const sptr<IDisplayManagerAgent>& displayManagerAgent,
DisplayManagerAgentType type);
bool UnregisterDisplayManagerAgent(const sptr<IDisplayManagerAgent>& displayManagerAgent,
DisplayManagerAgentType type);
bool SetRemoveAgentCallback(const VirtualScreenDestroyCallback& callback, DisplayManagerAgentType type);
bool NotifyDisplayPowerEvent(DisplayPowerEvent event, EventStatus status);
bool NotifyDisplayStateChanged(DisplayId id, DisplayState state);
+15 -24
View File
@@ -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<ScreenId> AbstractScreenController::GetAllScreenIds() const
@@ -477,13 +471,6 @@ sptr<AbstractScreenGroup> AbstractScreenController::AddAsSuccedentScreenLocked(s
return screenGroup;
}
bool AbstractScreenController::RegisterVirtualScreenAgent(const sptr<IRemoteObject>& displayManagerAgent)
{
return DisplayManagerAgentController::GetInstance().RegisterDisplayManagerAgent(
iface_cast<IDisplayManagerAgent>(displayManagerAgent),
DisplayManagerAgentType::VIRTUAL_SCREEN_DIED_LISTENER);
}
ScreenId AbstractScreenController::CreateVirtualScreen(VirtualScreenOption option,
const sptr<IRemoteObject>& displayManagerAgent)
{
@@ -493,16 +480,7 @@ ScreenId AbstractScreenController::CreateVirtualScreen(VirtualScreenOption optio
if (rsId == SCREEN_ID_INVALID) {
return SCREEN_ID_INVALID;
}
std::vector<ScreenId> virtualScreenIds;
std::lock_guard<std::recursive_mutex> 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<IRemoteObject>& agent)
if (agent == nullptr) {
return false;
}
std::lock_guard<std::recursive_mutex> lock(mutex_);
auto agentIter = screenAgentMap_.find(agent);
if (agentIter != screenAgentMap_.end()) {
while (screenAgentMap_[agent].size() > 0) {
@@ -175,11 +175,5 @@ void DisplayManagerAgentController::OnDisplayChange(
agent->OnDisplayChange(displayInfo, displayChangeEvent);
}
}
bool DisplayManagerAgentController::SetRemoveAgentCallback(const VirtualScreenDestroyCallback& callback,
DisplayManagerAgentType type)
{
return dmAgentContainer_.SetRemoveAgentCallback(callback, type);
}
}
}
+4
View File
@@ -182,6 +182,10 @@ sptr<DisplayInfo> DisplayManagerService::GetDisplayInfoByScreen(ScreenId screenI
ScreenId DisplayManagerService::CreateVirtualScreen(VirtualScreenOption option,
const sptr<IRemoteObject>& 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);
+9 -30
View File
@@ -21,25 +21,22 @@
#include <set>
#include "agent_death_recipient.h"
#include "window_manager_hilog.h"
#include "zidl/display_manager_agent_interface.h"
namespace OHOS {
namespace Rosen {
template <typename T1, typename T2>
class ClientAgentContainer {
using DestroyCallback = std::function<bool(const sptr<IRemoteObject>)>;
public:
ClientAgentContainer();
virtual ~ClientAgentContainer() = default;
bool RegisterAgent(const sptr<T1>& agent, T2 type);
bool UnregisterAgent(const sptr<T1>& agent, T2 type);
bool SetRemoveAgentCallback(const DestroyCallback& callback, T2 type);
std::set<sptr<T1>> GetAgentsByType(T2 type);
private:
void RemoveAgent(const sptr<IRemoteObject>& remoteObject);
sptr<T1> UnregisterAgentLocked(std::set<sptr<T1>>& agents, const sptr<IRemoteObject>& agent);
bool UnregisterAgentLocked(std::set<sptr<T1>>& agents, const sptr<IRemoteObject>& agent);
static constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "ClientAgentContainer"};
@@ -56,7 +53,6 @@ private:
std::recursive_mutex mutex_;
std::map<T2, std::set<sptr<T1>>> agentMap_;
std::map<T2, DestroyCallback> callbackMap_;
sptr<AgentDeathRecipient> deathRecipient_;
};
@@ -89,20 +85,9 @@ bool ClientAgentContainer<T1, T2>::UnregisterAgent(const sptr<T1>& 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<typename T1, typename T2>
bool ClientAgentContainer<T1, T2>::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<typename T1, typename T2>
@@ -117,17 +102,17 @@ std::set<sptr<T1>> ClientAgentContainer<T1, T2>::GetAgentsByType(T2 type)
}
template<typename T1, typename T2>
sptr<T1> ClientAgentContainer<T1, T2>::UnregisterAgentLocked(std::set<sptr<T1>>& agents,
bool ClientAgentContainer<T1, T2>::UnregisterAgentLocked(std::set<sptr<T1>>& agents,
const sptr<IRemoteObject>& 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<typename T1, typename T2>
@@ -135,14 +120,8 @@ void ClientAgentContainer<T1, T2>::RemoveAgent(const sptr<IRemoteObject>& remote
{
WLOGFI("RemoveAgent");
std::lock_guard<std::recursive_mutex> 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;
}
}
+3 -10
View File
@@ -1395,13 +1395,10 @@ WMError WindowNodeContainer::ToggleShownStateForAllAppWindows(
std::function<bool(uint32_t, WindowMode)> restoreFunc, bool restore)
{
WLOGFI("ToggleShownStateForAllAppWindows");
sptr<WindowNode> 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");