!358 fix window snapshot nullptr bug

Merge pull request !358 from Klaus_q/master_wq
This commit is contained in:
openharmony_ci
2022-02-25 23:53:40 +00:00
committed by Gitee
15 changed files with 80 additions and 14 deletions
+1
View File
@@ -56,6 +56,7 @@ WM_DECLARE_SINGLE_INSTANCE(DisplayManagerAdapter);
public:
virtual DisplayId GetDefaultDisplayId();
virtual sptr<DisplayInfo> GetDisplayInfoByScreenId(ScreenId screenId);
virtual std::vector<DisplayId> GetAllDisplayIds();
virtual std::shared_ptr<Media::PixelMap> GetDisplaySnapshot(DisplayId displayId);
virtual bool WakeUpBegin(PowerStateChangeReason reason);
virtual bool WakeUpEnd();
+1 -4
View File
@@ -315,10 +315,7 @@ sptr<Display> DisplayManager::GetDefaultDisplay()
std::vector<DisplayId> DisplayManager::GetAllDisplayIds()
{
std::vector<DisplayId> res;
res.push_back(GetDefaultDisplayId());
// 获取所有displayIds
return res;
return SingletonContainer::Get<DisplayManagerAdapter>().GetAllDisplayIds();
}
std::vector<const sptr<Display>> DisplayManager::GetAllDisplays()
+9
View File
@@ -326,6 +326,15 @@ sptr<ScreenInfo> ScreenManagerAdapter::GetScreenInfo(ScreenId screenId)
return screenInfo;
}
std::vector<DisplayId> DisplayManagerAdapter::GetAllDisplayIds()
{
if (!InitDMSProxy()) {
WLOGFE("InitDMSProxyLocked failed!");
return {};
}
return displayManagerServiceProxy_->GetAllDisplayIds();
}
sptr<DisplayInfo> DisplayManagerAdapter::GetDisplayInfo(DisplayId displayId)
{
if (displayId == DISPLAY_ID_INVALD) {
@@ -41,6 +41,7 @@ public:
std::shared_ptr<Media::PixelMap> GetScreenSnapshot(DisplayId displayId);
sptr<AbstractDisplay> GetAbstractDisplay(DisplayId displayId) const;
sptr<AbstractDisplay> GetAbstractDisplayByScreen(ScreenId screenId) const;
std::vector<DisplayId> GetAllDisplayIds() const;
void AddDisplayForExpandScreen(sptr<AbstractScreen> absScreen);
private:
@@ -49,6 +49,7 @@ public:
std::vector<ScreenId> GetAllExpandOrMirrorScreenIds(std::vector<ScreenId>) const;
sptr<AbstractScreenGroup> GetAbstractScreenGroup(ScreenId dmsScreenId);
ScreenId GetDefaultAbstractScreenId();
ScreenId GetDefaultScreenId() const; // save default screenID got by GetDefaultAbstractScreenId as cache
ScreenId ConvertToRsScreenId(ScreenId dmsScreenId);
ScreenId ConvertToDmsScreenId(ScreenId rsScreenId);
void RegisterAbstractScreenCallback(sptr<AbstractScreenCallback> cb);
@@ -95,6 +96,7 @@ private:
std::map<ScreenId, sptr<AbstractScreen>> dmsScreenMap_;
std::map<ScreenId, sptr<AbstractScreenGroup>> dmsScreenGroupMap_;
sptr<AbstractScreenCallback> abstractScreenCallback_;
ScreenId defaultScreenId = INVALID_SCREEN_ID;
};
} // namespace OHOS::Rosen
#endif // FOUNDATION_DMSERVER_ABSTRACT_SCREEN_CONTROLLER_H
@@ -46,6 +46,7 @@ public:
TRANS_ID_SET_SCREEN_POWER_FOR_ALL,
TRANS_ID_SET_DISPLAY_STATE,
TRANS_ID_GET_DISPLAY_STATE,
TRANS_ID_GET_ALL_DISPLAYIDS,
TRANS_ID_NOTIFY_DISPLAY_EVENT,
TRANS_ID_SCREEN_BASE = 1000,
TRANS_ID_CREATE_VIRTUAL_SCREEN = TRANS_ID_SCREEN_BASE,
@@ -97,6 +98,7 @@ public:
virtual bool SetScreenPowerForAll(DisplayPowerState state, PowerStateChangeReason reason) = 0;
virtual bool SetDisplayState(DisplayState state) = 0;
virtual DisplayState GetDisplayState(DisplayId displayId) = 0;
virtual std::vector<DisplayId> GetAllDisplayIds() = 0;
virtual void NotifyDisplayEvent(DisplayEvent event) = 0;
virtual sptr<ScreenInfo> GetScreenInfoById(ScreenId screenId) = 0;
virtual sptr<ScreenGroupInfo> GetScreenGroupInfoById(ScreenId screenId) = 0;
+1
View File
@@ -59,6 +59,7 @@ public:
bool SuspendEnd() override;
bool SetScreenPowerForAll(DisplayPowerState state, PowerStateChangeReason reason) override;
bool SetDisplayState(DisplayState state) override;
std::vector<DisplayId> GetAllDisplayIds() override;
DisplayState GetDisplayState(DisplayId displayId) override;
void NotifyDisplayEvent(DisplayEvent event) override;
ScreenId MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId) override;
@@ -89,6 +89,8 @@ public:
sptr<ScreenInfo> GetScreenInfoById(ScreenId screenId) override;
sptr<ScreenGroupInfo> GetScreenGroupInfoById(ScreenId screenId) override;
std::vector<sptr<ScreenInfo>> GetAllScreenInfos() override;
std::vector<DisplayId> GetAllDisplayIds() override;
bool SetScreenActiveMode(ScreenId screenId, uint32_t modeId) override;
private:
@@ -99,6 +99,16 @@ sptr<AbstractDisplay> AbstractDisplayController::GetAbstractDisplayByScreen(Scre
return nullptr;
}
std::vector<DisplayId> AbstractDisplayController::GetAllDisplayIds() const
{
std::lock_guard<std::recursive_mutex> lock(mutex_);
std::vector<DisplayId> res;
for (auto iter = abstractDisplayMap_.begin(); iter != abstractDisplayMap_.end(); ++iter) {
res.push_back(iter->first);
}
return res;
}
std::shared_ptr<Media::PixelMap> AbstractDisplayController::GetScreenSnapshot(DisplayId displayId)
{
sptr<AbstractDisplay> abstractDisplay = GetAbstractDisplay(displayId);
@@ -159,6 +159,7 @@ ScreenId AbstractScreenController::GetDefaultAbstractScreenId()
auto iter = rs2DmsScreenIdMap_.find(rsDefaultId);
if (iter != rs2DmsScreenIdMap_.end()) {
WLOGI("GetDefaultAbstractScreenId, screen:%{public}" PRIu64"", iter->second);
defaultScreenId = iter->second;
return iter->second;
}
WLOGFI("GetDefaultAbstractScreenId, default screen is null, try to get.");
@@ -172,9 +173,15 @@ ScreenId AbstractScreenController::GetDefaultAbstractScreenId()
dms2RsScreenIdMap_.insert(std::make_pair(dmsScreenId, rsDefaultId));
dmsScreenMap_.insert(std::make_pair(dmsScreenId, absScreen));
dmsScreenCount_++;
defaultScreenId = dmsScreenId;
return dmsScreenId;
}
ScreenId AbstractScreenController::GetDefaultScreenId() const
{
return defaultScreenId;
}
ScreenId AbstractScreenController::ConvertToRsScreenId(ScreenId dmsScreenId)
{
std::lock_guard<std::recursive_mutex> lock(mutex_);
+18
View File
@@ -653,6 +653,24 @@ DisplayState DisplayManagerProxy::GetDisplayState(DisplayId displayId)
return static_cast<DisplayState>(reply.ReadUint32());
}
std::vector<DisplayId> DisplayManagerProxy::GetAllDisplayIds()
{
std::vector<DisplayId> allDisplayIds;
MessageParcel data;
MessageParcel reply;
MessageOption option;
if (!data.WriteInterfaceToken(GetDescriptor())) {
WLOGFE("WriteInterfaceToken failed");
return allDisplayIds;
}
if (Remote()->SendRequest(TRANS_ID_GET_ALL_DISPLAYIDS, data, reply, option) != ERR_NONE) {
WLOGFW("SendRequest failed");
return allDisplayIds;
}
reply.ReadUInt64Vector(&allDisplayIds);
return allDisplayIds;
}
void DisplayManagerProxy::NotifyDisplayEvent(DisplayEvent event)
{
MessageParcel data;
+13 -3
View File
@@ -85,9 +85,14 @@ ScreenId DisplayManagerService::GetScreenIdFromDisplayId(DisplayId displayId)
DisplayId DisplayManagerService::GetDefaultDisplayId()
{
ScreenId screenId = abstractDisplayController_->GetDefaultScreenId();
WLOGFI("GetDefaultDisplayId %{public}" PRIu64"", screenId);
return GetDisplayIdFromScreenId(screenId);
ScreenId dmsScreenId = abstractScreenController_->GetDefaultScreenId();
WLOGFI("GetDefaultDisplayId %{public}" PRIu64"", dmsScreenId);
sptr<AbstractDisplay> display = GetDisplayByScreen(dmsScreenId);
if (display == nullptr) {
WLOGFE("fail to get displayInfo by id: invalid display");
return DISPLAY_ID_INVALD;
}
return display->GetId();
}
sptr<DisplayInfo> DisplayManagerService::GetDisplayInfoById(DisplayId displayId)
@@ -458,6 +463,11 @@ sptr<ScreenGroupInfo> DisplayManagerService::GetScreenGroupInfoById(ScreenId scr
return screenGroup->ConvertToScreenGroupInfo();
}
std::vector<DisplayId> DisplayManagerService::GetAllDisplayIds()
{
return abstractDisplayController_->GetAllDisplayIds();
}
std::vector<sptr<ScreenInfo>> DisplayManagerService::GetAllScreenInfos()
{
std::vector<ScreenId> screenIds = abstractScreenController_->GetAllScreenIds();
@@ -41,23 +41,24 @@ const sptr<AbstractDisplay> DisplayManagerServiceInner::GetDisplayById(DisplayId
{
sptr<AbstractDisplay> display = DisplayManagerService::GetInstance().GetAbstractDisplay(displayId);
if (display == nullptr) {
auto displayInfo = DisplayManagerService::GetInstance().GetDisplayInfoById(displayId);
display = new AbstractDisplay(displayInfo);
WLOGFE("GetDisplayById create new!\n");
WLOGFE("GetDisplayById can not find corresponding display!\n");
}
return display;
}
const sptr<AbstractDisplay> DisplayManagerServiceInner::GetDefaultDisplay()
{
DisplayId defaultDisplayId = GetDefaultDisplayId();
if (defaultDisplayId == DISPLAY_ID_INVALD) {
WLOGFE("Fail to get default displayId");
return nullptr;
}
return GetDisplayById(GetDefaultDisplayId());
}
std::vector<DisplayId> DisplayManagerServiceInner::GetAllDisplayIds()
{
std::vector<DisplayId> res;
res.push_back(GetDefaultDisplayId());
return res;
return DisplayManagerService::GetInstance().GetAllDisplayIds();
}
std::vector<const sptr<AbstractDisplay>> DisplayManagerServiceInner::GetAllDisplays()
+5
View File
@@ -202,6 +202,11 @@ int32_t DisplayManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data,
}
break;
}
case TRANS_ID_GET_ALL_DISPLAYIDS: {
std::vector<DisplayId> allDisplayIds = GetAllDisplayIds();
reply.WriteUInt64Vector(allDisplayIds);
break;
}
case TRANS_ID_SCREEN_MAKE_EXPAND: {
std::vector<ScreenId> screenId;
if (!data.ReadUInt64Vector(&screenId)) {
@@ -46,8 +46,8 @@ private:
void OnSurfaceCapture(std::shared_ptr<Media::PixelMap> pixelmap) override
{
if (flag_ == false) {
flag_ = true;
pixelMap_ = pixelmap;
flag_ = true;
}
}
bool IsPixelMapOk()