mirror of
https://github.com/openharmony/windowmanager.git
synced 2026-07-19 17:08:11 -04:00
!1147 refactor virtual screen DeathRecipient
Merge pull request !1147 from xiaojianfeng/master
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user