From 3261e2a4d4f32cda57ca970c3a9794e88eddad03 Mon Sep 17 00:00:00 2001 From: leafly2021 Date: Sat, 26 Feb 2022 18:54:28 +0800 Subject: [PATCH 1/9] modify maxmize Signed-off-by: leafly2021 Change-Id: I0b059541eeeb1eb6a4e4416ffe42a32a638d3548 --- interfaces/innerkits/wm/window_manager.h | 2 +- .../window_manager_napi/js_window_manager.cpp | 10 ++++++--- wm/include/window_adapter.h | 1 + wm/src/window_adapter.cpp | 8 +++++++ wm/src/window_impl.cpp | 14 ++++++++++--- wm/src/window_manager.cpp | 4 ++-- wmserver/include/window_controller.h | 1 + wmserver/include/window_manager_interface.h | 2 ++ wmserver/include/window_manager_proxy.h | 1 + wmserver/include/window_manager_service.h | 1 + wmserver/include/window_node_container.h | 1 + wmserver/include/window_root.h | 1 + wmserver/src/window_controller.cpp | 11 ++++++++++ wmserver/src/window_manager_proxy.cpp | 21 +++++++++++++++++++ wmserver/src/window_manager_service.cpp | 7 +++++++ wmserver/src/window_manager_stub.cpp | 4 ++++ wmserver/src/window_node_container.cpp | 20 ++++++++++++++++++ wmserver/src/window_root.cpp | 16 ++++++++++++++ 18 files changed, 116 insertions(+), 9 deletions(-) diff --git a/interfaces/innerkits/wm/window_manager.h b/interfaces/innerkits/wm/window_manager.h index 989fdae00c..769de08f2d 100644 --- a/interfaces/innerkits/wm/window_manager.h +++ b/interfaces/innerkits/wm/window_manager.h @@ -102,7 +102,7 @@ public: void RegisterVisibilityChangedListener(const sptr& listener); void UnregisterVisibilityChangedListener(const sptr& listener); void MinimizeAllAppWindows(DisplayId displayId); - void SetWindowLayoutMode(WindowLayoutMode mode, DisplayId displayId); + WMError SetWindowLayoutMode(WindowLayoutMode mode, DisplayId displayId); private: WindowManager(); diff --git a/interfaces/kits/napi/window_runtime/window_manager_napi/js_window_manager.cpp b/interfaces/kits/napi/window_runtime/window_manager_napi/js_window_manager.cpp index 3d8145bc01..67646e6b27 100644 --- a/interfaces/kits/napi/window_runtime/window_manager_napi/js_window_manager.cpp +++ b/interfaces/kits/napi/window_runtime/window_manager_napi/js_window_manager.cpp @@ -592,10 +592,14 @@ NativeValue* JsWindowManager::OnSetWindowLayoutMode(NativeEngine& engine, Native task.Reject(engine, CreateJsError(engine, static_cast(errCode), "Invalidate params.")); return; } - SingletonContainer::Get().SetWindowLayoutMode(winLayoutMode, + WMError ret = SingletonContainer::Get().SetWindowLayoutMode(winLayoutMode, static_cast(displayId)); - task.Resolve(engine, engine.CreateUndefined()); - WLOGFI("JsWindowManager::OnSetWindowLayoutMode success"); + if (ret == WMError::WM_OK) { + task.Resolve(engine, engine.CreateUndefined()); + WLOGFI("JsWindowManager::OnSetWindowLayoutMode success"); + } else { + task.Reject(engine, CreateJsError(engine, static_cast(ret), "do failed")); + } }; NativeValue* lastParam = (info.argc < ARGC_THREE) ? nullptr : (info.argv[INDEX_TWO]->TypeOf() == NATIVE_FUNCTION ? info.argv[INDEX_TWO] : nullptr); diff --git a/wm/include/window_adapter.h b/wm/include/window_adapter.h index de04cc9605..5f69e22d66 100644 --- a/wm/include/window_adapter.h +++ b/wm/include/window_adapter.h @@ -52,6 +52,7 @@ public: virtual WMError GetTopWindowId(uint32_t mainWinId, uint32_t& topWinId); virtual void ProcessWindowTouchedEvent(uint32_t windowId); virtual void MinimizeAllAppWindows(DisplayId displayId); + virtual WMError MaxmizeWindow(uint32_t windowId); virtual WMError SetWindowLayoutMode(DisplayId displayId, WindowLayoutMode mode); virtual void RegisterWindowManagerAgent(WindowManagerAgentType type, diff --git a/wm/src/window_adapter.cpp b/wm/src/window_adapter.cpp index e1f493b856..f1b3325141 100644 --- a/wm/src/window_adapter.cpp +++ b/wm/src/window_adapter.cpp @@ -166,6 +166,14 @@ void WindowAdapter::MinimizeAllAppWindows(DisplayId displayId) windowManagerServiceProxy_->MinimizeAllAppWindows(displayId); } +WMError WindowAdapter::MaxmizeWindow(uint32_t windowId) +{ + if (!InitWMSProxy()) { + return WMError::WM_ERROR_SAMGR; + } + return windowManagerServiceProxy_->MaxmizeWindow(windowId); +} + bool WindowAdapter::InitWMSProxy() { std::lock_guard lock(mutex_); diff --git a/wm/src/window_impl.cpp b/wm/src/window_impl.cpp index 0b25c802a3..3f4c1f915b 100644 --- a/wm/src/window_impl.cpp +++ b/wm/src/window_impl.cpp @@ -269,7 +269,7 @@ WMError WindowImpl::SetWindowMode(WindowMode mode) property_->SetWindowMode(mode); WMError ret = SingletonContainer::Get().SetWindowMode(property_->GetWindowId(), mode); if (ret == WMError::WM_OK) { - WLOGFD("notify window mode changed"); + WLOGFI("notify window mode changed"); for (auto& listener : windowChangeListeners_) { if (listener != nullptr) { listener->OnModeChange(mode); @@ -723,9 +723,15 @@ WMError WindowImpl::Maximize() return WMError::WM_ERROR_INVALID_WINDOW; } if (WindowHelper::IsMainWindow(property_->GetWindowType())) { - SetFullScreen(true); + WMError ret = SingletonContainer::Get().MaxmizeWindow(property_->GetWindowId()); + if (ret == WMError::WM_OK) { + UpdateMode(WindowMode::WINDOW_MODE_FULLSCREEN); + } + return ret; + } else { + WLOGFI("Maximize Window failed. The window is not main window"); + return WMError::WM_ERROR_INVALID_PARAM; } - return WMError::WM_OK; } WMError WindowImpl::Minimize() @@ -1260,6 +1266,8 @@ void WindowImpl::SetDefaultOption() property_->SetWindowFlags(0); break; } + case WindowType::WINDOW_TYPE_TOAST: + case WindowType::WINDOW_TYPE_SEARCHING_BAR: case WindowType::WINDOW_TYPE_VOLUME_OVERLAY: { property_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING); break; diff --git a/wm/src/window_manager.cpp b/wm/src/window_manager.cpp index 6774bcaf19..da13194cc1 100644 --- a/wm/src/window_manager.cpp +++ b/wm/src/window_manager.cpp @@ -238,14 +238,14 @@ void WindowManager::MinimizeAllAppWindows(DisplayId displayId) SingletonContainer::Get().MinimizeAllAppWindows(displayId); } -void WindowManager::SetWindowLayoutMode(WindowLayoutMode mode, DisplayId displayId) +WMError WindowManager::SetWindowLayoutMode(WindowLayoutMode mode, DisplayId displayId) { WLOGFI("set window layout mode: %{public}d, displayId %{public}" PRIu64"", mode, displayId); WMError ret = SingletonContainer::Get().SetWindowLayoutMode(displayId, mode); if (ret != WMError::WM_OK) { WLOGFE("set layout mode failed"); } - return; + return ret; } void WindowManager::RegisterWindowUpdateListener(const sptr &listener) diff --git a/wmserver/include/window_controller.h b/wmserver/include/window_controller.h index a61f87273a..b4f4bdb892 100644 --- a/wmserver/include/window_controller.h +++ b/wmserver/include/window_controller.h @@ -49,6 +49,7 @@ public: void NotifyDisplayStateChange(DisplayId id, DisplayStateChangeType type); WMError ProcessWindowTouchedEvent(uint32_t windowId); void MinimizeAllAppWindows(DisplayId displayId); + WMError MaxmizeWindow(uint32_t windowId); WMError SetWindowLayoutMode(DisplayId displayId, WindowLayoutMode mode); void NotifySystemBarTints(); diff --git a/wmserver/include/window_manager_interface.h b/wmserver/include/window_manager_interface.h index 34da3e13c5..5e063d3ec3 100644 --- a/wmserver/include/window_manager_interface.h +++ b/wmserver/include/window_manager_interface.h @@ -51,6 +51,7 @@ public: TRANS_ID_SET_BACKGROUND_BLUR, TRANS_ID_SET_APLPHA, TRANS_ID_UPDATE_LAYOUT_MODE, + TRANS_ID_MAXMIZE_WINDOW, }; virtual WMError CreateWindow(sptr& window, sptr& property, const std::shared_ptr& surfaceNode, uint32_t& windowId) = 0; @@ -72,6 +73,7 @@ public: virtual WMError GetTopWindowId(uint32_t mainWinId, uint32_t& topWinId) = 0; virtual void ProcessWindowTouchedEvent(uint32_t windowId) = 0; virtual void MinimizeAllAppWindows(DisplayId displayId) = 0; + virtual WMError MaxmizeWindow(uint32_t windowId) = 0; virtual WMError SetWindowLayoutMode(DisplayId displayId, WindowLayoutMode mode) = 0; virtual void RegisterWindowManagerAgent(WindowManagerAgentType type, diff --git a/wmserver/include/window_manager_proxy.h b/wmserver/include/window_manager_proxy.h index 73e191bc04..00590c5bd8 100644 --- a/wmserver/include/window_manager_proxy.h +++ b/wmserver/include/window_manager_proxy.h @@ -47,6 +47,7 @@ public: WMError GetTopWindowId(uint32_t mainWinId, uint32_t& topWinId) override; void ProcessWindowTouchedEvent(uint32_t windowId) override; void MinimizeAllAppWindows(DisplayId displayId) override; + WMError MaxmizeWindow(uint32_t windowId) override; WMError SetWindowLayoutMode(DisplayId displayId, WindowLayoutMode mode) override; void RegisterWindowManagerAgent(WindowManagerAgentType type, diff --git a/wmserver/include/window_manager_service.h b/wmserver/include/window_manager_service.h index 1d72729348..aa8ee42d77 100644 --- a/wmserver/include/window_manager_service.h +++ b/wmserver/include/window_manager_service.h @@ -67,6 +67,7 @@ public: void ProcessWindowTouchedEvent(uint32_t windowId) override; WMError GetTopWindowId(uint32_t mainWinId, uint32_t& topWinId) override; void MinimizeAllAppWindows(DisplayId displayId) override; + WMError MaxmizeWindow(uint32_t windowId) override; WMError SetWindowLayoutMode(DisplayId displayId, WindowLayoutMode mode) override; void RegisterWindowManagerAgent(WindowManagerAgentType type, diff --git a/wmserver/include/window_node_container.h b/wmserver/include/window_node_container.h index 76c4d95a84..bf5cd5fe6a 100644 --- a/wmserver/include/window_node_container.h +++ b/wmserver/include/window_node_container.h @@ -57,6 +57,7 @@ public: void MinimizeAllAppWindows(); void NotifyWindowStateChange(WindowState state, WindowStateChangeReason reason); void NotifySystemBarTints(); + void NotifySystemBarDismiss(sptr& node); WMError MinimizeAppNodeExceptOptions(const std::vector &exceptionalIds = {}, const std::vector &exceptionalModes = {}); WMError EnterSplitWindowMode(sptr& node); diff --git a/wmserver/include/window_root.h b/wmserver/include/window_root.h index 4f965cdddf..7abcee0692 100644 --- a/wmserver/include/window_root.h +++ b/wmserver/include/window_root.h @@ -55,6 +55,7 @@ public: std::shared_ptr GetSurfaceNodeByAbilityToken(const sptr& abilityToken) const; WMError GetTopWindowId(uint32_t mainWinId, uint32_t& topWinId); void MinimizeAllAppWindows(DisplayId displayId); + WMError MaxmizeWindow(uint32_t windowId); WMError SetWindowLayoutMode(DisplayId displayId, WindowLayoutMode mode); void NotifyWindowStateChange(WindowState state, WindowStateChangeReason reason); diff --git a/wmserver/src/window_controller.cpp b/wmserver/src/window_controller.cpp index a4cea5219e..991af7eb86 100644 --- a/wmserver/src/window_controller.cpp +++ b/wmserver/src/window_controller.cpp @@ -397,6 +397,17 @@ void WindowController::MinimizeAllAppWindows(DisplayId displayId) windowRoot_->MinimizeAllAppWindows(displayId); } +WMError WindowController::MaxmizeWindow(uint32_t windowId) +{ + WMError ret = SetWindowMode(windowId, WindowMode::WINDOW_MODE_FULLSCREEN); + if (ret != WMError::WM_OK) { + return ret; + } + ret = windowRoot_->MaxmizeWindow(windowId); + FlushWindowInfo(windowId); + return ret; +} + WMError WindowController::GetTopWindowId(uint32_t mainWinId, uint32_t& topWinId) { return windowRoot_->GetTopWindowId(mainWinId, topWinId); diff --git a/wmserver/src/window_manager_proxy.cpp b/wmserver/src/window_manager_proxy.cpp index 4897f558cb..626f724668 100644 --- a/wmserver/src/window_manager_proxy.cpp +++ b/wmserver/src/window_manager_proxy.cpp @@ -492,6 +492,27 @@ void WindowManagerProxy::MinimizeAllAppWindows(DisplayId displayId) } } +WMError WindowManagerProxy::MaxmizeWindow(uint32_t windowId) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!data.WriteInterfaceToken(GetDescriptor())) { + WLOGFE("WriteInterfaceToken failed"); + return WMError::WM_ERROR_IPC_FAILED; + } + if (!data.WriteUint32(windowId)) { + WLOGFE("Write windowId failed"); + return WMError::WM_ERROR_IPC_FAILED; + } + if (Remote()->SendRequest(TRANS_ID_MAXMIZE_WINDOW, data, reply, option) != ERR_NONE) { + return WMError::WM_ERROR_IPC_FAILED; + } + + int32_t ret = reply.ReadInt32(); + return static_cast(ret); +} + WMError WindowManagerProxy::SetWindowLayoutMode(DisplayId displayId, WindowLayoutMode mode) { MessageParcel data; diff --git a/wmserver/src/window_manager_service.cpp b/wmserver/src/window_manager_service.cpp index 3d35aa9422..8be6f6e406 100644 --- a/wmserver/src/window_manager_service.cpp +++ b/wmserver/src/window_manager_service.cpp @@ -301,6 +301,13 @@ void WindowManagerService::MinimizeAllAppWindows(DisplayId displayId) windowController_->MinimizeAllAppWindows(displayId); } +WMError WindowManagerService::MaxmizeWindow(uint32_t windowId) +{ + WM_SCOPED_TRACE("wms:MaxmizeWindow"); + std::lock_guard lock(mutex_); + return windowController_->MaxmizeWindow(windowId); +} + WMError WindowManagerService::GetTopWindowId(uint32_t mainWinId, uint32_t& topWinId) { WM_SCOPED_TRACE("wms:GetTopWindowId(%d)", mainWinId); diff --git a/wmserver/src/window_manager_stub.cpp b/wmserver/src/window_manager_stub.cpp index 34d931b8d3..3f4ca1d1d0 100644 --- a/wmserver/src/window_manager_stub.cpp +++ b/wmserver/src/window_manager_stub.cpp @@ -173,6 +173,10 @@ int32_t WindowManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, M MinimizeAllAppWindows(data.ReadUint64()); break; } + case TRANS_ID_MAXMIZE_WINDOW: { + MaxmizeWindow(data.ReadUint32()); + break; + } case TRANS_ID_UPDATE_LAYOUT_MODE: { DisplayId displayId = data.ReadUint64(); WindowLayoutMode mode = static_cast(data.ReadUint32()); diff --git a/wmserver/src/window_node_container.cpp b/wmserver/src/window_node_container.cpp index 287e95c35c..90b6bfba2b 100644 --- a/wmserver/src/window_node_container.cpp +++ b/wmserver/src/window_node_container.cpp @@ -480,6 +480,26 @@ void WindowNodeContainer::NotifyIfSystemBarRegionChanged() WindowManagerAgentController::GetInstance().UpdateSystemBarRegionTints(displayId_, tints); } +void WindowNodeContainer::NotifySystemBarDismiss(sptr& node) +{ + WM_FUNCTION_TRACE(); + SystemBarRegionTints tints; + bool isChanged = false; + auto& sysBarPropMapNode = node->GetSystemBarProperty(); + for (auto it : sysBarPropMapNode) { + it.second.enable_ = false; + if (sysBarTintMap_[it.first].prop_.enable_) { + sysBarTintMap_[it.first].prop_.enable_ = false; + isChanged = true; + tints.emplace_back(sysBarTintMap_[it.first]); + WLOGFI("system bar dismiss, type: %{public}d", static_cast(it.first)); + } + } + if (isChanged) { + WindowManagerAgentController::GetInstance().UpdateSystemBarRegionTints(displayId_, tints); + } +} + void WindowNodeContainer::NotifySystemBarTints() { WM_FUNCTION_TRACE(); diff --git a/wmserver/src/window_root.cpp b/wmserver/src/window_root.cpp index ecd6af15fd..a1715f31b7 100644 --- a/wmserver/src/window_root.cpp +++ b/wmserver/src/window_root.cpp @@ -147,6 +147,22 @@ void WindowRoot::MinimizeAllAppWindows(DisplayId displayId) return container->MinimizeAllAppWindows(); } +WMError WindowRoot::MaxmizeWindow(uint32_t windowId) +{ + auto node = GetWindowNode(windowId); + if (node == nullptr) { + WLOGFE("could not find window"); + return WMError::WM_ERROR_NULLPTR; + } + auto container = GetOrCreateWindowNodeContainer(node->GetDisplayId()); + if (container == nullptr) { + WLOGFE("add window failed, window container could not be found"); + return WMError::WM_ERROR_NULLPTR; + } + container->NotifySystemBarDismiss(node); + return WMError::WM_OK; +} + WMError WindowRoot::AddWindowNode(uint32_t parentId, sptr& node) { if (node == nullptr) { -- Gitee From e919d423b94989d1ea946738d8d135fa4d51d0ea Mon Sep 17 00:00:00 2001 From: xiahaiqin Date: Tue, 1 Mar 2022 16:45:32 +0800 Subject: [PATCH 2/9] modify stop boot animation Signed-off-by: xiahaiqin Change-Id: I269d04a96ce45e8ffd18e0c8f9c04b47f0c4e008 --- wmserver/include/window_controller.h | 1 + wmserver/include/window_manager_service.h | 1 - wmserver/src/window_controller.cpp | 13 ++++++++++++- wmserver/src/window_manager_service.cpp | 1 - 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/wmserver/include/window_controller.h b/wmserver/include/window_controller.h index a61f87273a..483a68799b 100644 --- a/wmserver/include/window_controller.h +++ b/wmserver/include/window_controller.h @@ -58,6 +58,7 @@ private: void FlushWindowInfoWithDisplayId(DisplayId displayId); void UpdateWindowAnimation(const sptr& node); void ProcessDisplayChange(DisplayId displayId, DisplayStateChangeType type); + void StopBootAnimationIfNeed(WindowType type) const; sptr windowRoot_; sptr inputWindowMonitor_; diff --git a/wmserver/include/window_manager_service.h b/wmserver/include/window_manager_service.h index 1d72729348..59741cd4ab 100644 --- a/wmserver/include/window_manager_service.h +++ b/wmserver/include/window_manager_service.h @@ -21,7 +21,6 @@ #include #include -#include #include #include "display_change_listener.h" #include "drag_controller.h" diff --git a/wmserver/src/window_controller.cpp b/wmserver/src/window_controller.cpp index 5f50772945..aa7346afc1 100644 --- a/wmserver/src/window_controller.cpp +++ b/wmserver/src/window_controller.cpp @@ -14,6 +14,7 @@ */ #include "window_controller.h" +#include #include #include "window_manager_hilog.h" #include "window_helper.h" @@ -86,9 +87,11 @@ WMError WindowController::AddWindowNode(sptr& property) WM_SCOPED_TRACE_END(); if (res != WMError::WM_OK) { WLOGFE("Minimize other structured window failed"); + return res; } } - return res; + StopBootAnimationIfNeed(node->GetWindowType()); + return WMError::WM_OK; } WMError WindowController::RemoveWindowNode(uint32_t windowId) @@ -312,6 +315,14 @@ void WindowController::ProcessDisplayChange(DisplayId displayId, DisplayStateCha WLOGFI("Finish ProcessDisplayChange"); } +void WindowController::StopBootAnimationIfNeed(WindowType type) const +{ + if (WindowType::WINDOW_TYPE_DESKTOP == type) { + WLOGFD("stop boot animation"); + system::SetParameter("persist.window.boot.inited", "1"); + } +} + WMError WindowController::SetWindowType(uint32_t windowId, WindowType type) { auto node = windowRoot_->GetWindowNode(windowId); diff --git a/wmserver/src/window_manager_service.cpp b/wmserver/src/window_manager_service.cpp index 3d35aa9422..efc0381e8c 100644 --- a/wmserver/src/window_manager_service.cpp +++ b/wmserver/src/window_manager_service.cpp @@ -135,7 +135,6 @@ WMError WindowManagerService::AddWindow(sptr& property) WM_SCOPED_TRACE("wms:AddWindow(%d)", windowId); std::lock_guard lock(mutex_); WMError res = windowController_->AddWindowNode(property); - system::SetParameter("persist.window.boot.inited", "1"); if (property->GetWindowType() == WindowType::WINDOW_TYPE_DRAGGING_EFFECT) { dragController_->StartDrag(windowId); } -- Gitee From d3bfb96045c7ea971fb917c3c70137f1e43092db Mon Sep 17 00:00:00 2001 From: xiaojianfeng Date: Mon, 28 Feb 2022 11:54:23 +0800 Subject: [PATCH 3/9] callback screen event and display event Change-Id: I871dfb23e2afd67aa27847412bb52598fc0cb054 Signed-off-by: xiaojianfeng --- dmserver/include/abstract_screen_controller.h | 4 + dmserver/src/abstract_screen_controller.cpp | 110 ++++++++++++------ dmserver/src/display_manager_service.cpp | 4 - 3 files changed, 80 insertions(+), 38 deletions(-) diff --git a/dmserver/include/abstract_screen_controller.h b/dmserver/include/abstract_screen_controller.h index 1cceb94793..70a38b3577 100644 --- a/dmserver/include/abstract_screen_controller.h +++ b/dmserver/include/abstract_screen_controller.h @@ -85,6 +85,10 @@ private: sptr AddAsFirstScreenLocked(sptr newScreen); sptr AddAsSuccedentScreenLocked(sptr newScreen); void ProcessScreenModeChanged(ScreenId dmsScreenId); + void ChangeScreenGroup(sptr group, const std::vector& screens, + const std::vector& startPoints, bool filterScreen, ScreenCombination combination); + void AddScreenToGroup(sptr, const std::vector&, + const std::vector&, std::map&); std::recursive_mutex& mutex_; OHOS::Rosen::RSInterfaces& rsInterface_; diff --git a/dmserver/src/abstract_screen_controller.cpp b/dmserver/src/abstract_screen_controller.cpp index fff8599f8c..d7ce6e28e1 100644 --- a/dmserver/src/abstract_screen_controller.cpp +++ b/dmserver/src/abstract_screen_controller.cpp @@ -460,8 +460,6 @@ ScreenId AbstractScreenController::CreateVirtualScreen(VirtualScreenOption optio DMError AbstractScreenController::DestroyVirtualScreen(ScreenId screenId) { - WLOGFI("DumpScreenInfo before Destroy VirtualScreen"); - DumpScreenInfo(); WLOGFI("AbstractScreenController::DestroyVirtualScreen"); std::lock_guard lock(mutex_); ScreenId rsScreenId = SCREEN_ID_INVALID; @@ -690,25 +688,85 @@ bool AbstractScreenController::MakeMirror(ScreenId screenId, std::vectorcombination_ = ScreenCombination::SCREEN_MIRROR; - group->mirrorScreenId_ = screen->dmsId_; Point point; - for (ScreenId mirrorScreenId : screens) { - WLOGI("GetAbstractScreen: mirrorScreenId: %{public}" PRIu64"", mirrorScreenId); - auto mirrorScreen = GetAbstractScreen(mirrorScreenId); - if (mirrorScreen == nullptr) { - WLOGFE("mirrorScreen:%{public}" PRIu64" is nullptr", mirrorScreenId); + std::vector startPoints; + startPoints.insert(startPoints.begin(), screens.size(), point); + bool filterMirroredScreen = + group->combination_ == ScreenCombination::SCREEN_MIRROR && group->mirrorScreenId_ == screen->dmsId_; + ChangeScreenGroup(group, screens, startPoints, filterMirroredScreen, ScreenCombination::SCREEN_MIRROR); + WLOGFI("MakeMirror success"); + return true; +} + +void AbstractScreenController::ChangeScreenGroup(sptr group, const std::vector& screens, + const std::vector& startPoints, bool filterScreen, ScreenCombination combination) +{ + std::map removeChildResMap; + std::vector addScreens; + std::vector addChildPos; + for (uint64_t i = 0; i != screens.size(); i++) { + ScreenId screenId = screens[i]; + WLOGFI("ChangeScreenGroup: screenId: %{public}" PRIu64"", screenId); + auto screen = GetAbstractScreen(screenId); + if (screen == nullptr) { + WLOGFE("screen:%{public}" PRIu64" is nullptr", screenId); + continue; + } + WLOGFI("ChangeScreenGroup: screen->groupDmsId_: %{public}" PRIu64"", screen->groupDmsId_); + if (filterScreen && screen->groupDmsId_ == group->dmsId_ && group->HasChild(screen->dmsId_)) { continue; } - WLOGI("GetAbstractScreen: mirrorScreen->groupDmsId_: %{public}" PRIu64"", mirrorScreen->groupDmsId_); - auto originGroup = GetAbstractScreenGroup(mirrorScreen->groupDmsId_); + auto originGroup = GetAbstractScreenGroup(screen->groupDmsId_); + bool removeChildRes = false; if (originGroup != nullptr) { - originGroup->RemoveChild(mirrorScreen); + removeChildRes = originGroup->RemoveChild(screen); + abstractScreenCallback_->onDisconnect_(screen); } - group->AddChild(mirrorScreen, point); + addChildPos.emplace_back(startPoints[i]); + removeChildResMap[screenId] = removeChildRes; + addScreens.emplace_back(screenId); } - WLOGFI("MakeMirror success"); - return true; + group->combination_ = combination; + AddScreenToGroup(group, addScreens, addChildPos, removeChildResMap); +} + +void AbstractScreenController::AddScreenToGroup(sptr group, + const std::vector& addScreens, const std::vector& addChildPos, + std::map& removeChildResMap) +{ + std::vector> addToGroup; + std::vector> removeFromGroup; + std::vector> changeGroup; + for (uint64_t i = 0; i != addScreens.size(); i++) { + ScreenId screenId = addScreens[i]; + sptr screen = GetAbstractScreen(screenId); + if (screen == nullptr) { + continue; + } + Point expandPoint = addChildPos[i]; + WLOGFI("screenId: %{public}" PRIu64", Point: %{public}d, %{public}d", + screen->dmsId_, expandPoint.posX_, expandPoint.posY_); + bool addChildRes = group->AddChild(screen, expandPoint); + if (removeChildResMap[screenId] && addChildRes) { + changeGroup.emplace_back(screen->ConvertToScreenInfo()); + WLOGFI("changeGroup"); + } else if (removeChildResMap[screenId]) { + WLOGFI("removeChild"); + removeFromGroup.emplace_back(screen->ConvertToScreenInfo()); + } else if (addChildRes) { + WLOGFI("AddChild"); + addToGroup.emplace_back(screen->ConvertToScreenInfo()); + } else { + WLOGFI("default, AddChild failed"); + } + abstractScreenCallback_->onConnect_(screen); + } + DisplayManagerAgentController::GetInstance(). + OnScreenGroupChange(removeFromGroup, ScreenGroupChangeEvent::REMOVE_FROM_GROUP); + DisplayManagerAgentController::GetInstance(). + OnScreenGroupChange(changeGroup, ScreenGroupChangeEvent::CHANGE_GROUP); + DisplayManagerAgentController::GetInstance(). + OnScreenGroupChange(addToGroup, ScreenGroupChangeEvent::ADD_TO_GROUP); } bool AbstractScreenController::MakeExpand(std::vector screenIds, std::vector startPoints) @@ -723,25 +781,9 @@ bool AbstractScreenController::MakeExpand(std::vector screenIds, std:: if (group == nullptr) { return false; } - group->combination_ = ScreenCombination::SCREEN_EXPAND; - for (uint64_t i = 0; i != screenIds.size(); i++) { - ScreenId expandScreenId = screenIds[i]; - Point expandPoint = startPoints[i]; - WLOGFI("expandScreenId: %{public}" PRIu64", Point: %{public}d, %{public}d", - expandScreenId, expandPoint.posX_, expandPoint.posY_); - auto expandScreen = GetAbstractScreen(expandScreenId); - if (expandScreen == nullptr) { - WLOGFE("expandScreen:%{public}" PRIu64" is nullptr", expandScreenId); - continue; - } - WLOGI("expandScreen->groupDmsId_: %{public}" PRIu64"", expandScreen->groupDmsId_); - auto originGroup = GetAbstractScreenGroup(expandScreen->groupDmsId_); - if (originGroup != nullptr) { - originGroup->RemoveChild(expandScreen); - } - group->AddChild(expandScreen, expandPoint); - } - WLOGI("MakeExpand success"); + bool filterMirroredScreen = group->combination_ == ScreenCombination::SCREEN_EXPAND; + ChangeScreenGroup(group, screenIds, startPoints, filterMirroredScreen, ScreenCombination::SCREEN_MIRROR); + WLOGFI("MakeExpand success"); return true; } diff --git a/dmserver/src/display_manager_service.cpp b/dmserver/src/display_manager_service.cpp index e349da009e..38f2f39452 100644 --- a/dmserver/src/display_manager_service.cpp +++ b/dmserver/src/display_manager_service.cpp @@ -123,8 +123,6 @@ sptr DisplayManagerService::GetAbstractDisplay(DisplayId displa ScreenId DisplayManagerService::CreateVirtualScreen(VirtualScreenOption option) { WM_SCOPED_TRACE("dms:CreateVirtualScreen(%s)", option.name_.c_str()); - WLOGFI("DumpScreenInfo before Create VirtualScreen"); - abstractScreenController_->DumpScreenInfo(); ScreenId screenId = abstractScreenController_->CreateVirtualScreen(option); if (screenId == SCREEN_ID_INVALID) { WLOGFE("DisplayManagerService::CreateVirtualScreen: Get virtualScreenId failed"); @@ -406,7 +404,6 @@ void DisplayManagerService::SetShotScreen(ScreenId mainScreenId, std::vector mirrorScreenIds) { WLOGFI("MakeMirror. mainScreenId :%{public}" PRIu64"", mainScreenId); - abstractScreenController_->DumpScreenInfo(); auto shotScreenIds = abstractScreenController_->GetShotScreenIds(mirrorScreenIds); auto iter = std::find(shotScreenIds.begin(), shotScreenIds.end(), mainScreenId); if (iter != shotScreenIds.end()) { @@ -496,7 +493,6 @@ ScreenId DisplayManagerService::MakeExpand(std::vector expandScreenIds static_cast(expandScreenIds.size()), static_cast(startPoints.size())); return SCREEN_ID_INVALID; } - abstractScreenController_->DumpScreenInfo(); ScreenId defaultScreenId = abstractScreenController_->GetDefaultAbstractScreenId(); WLOGI("MakeExpand, defaultScreenId:%{public}" PRIu64"", defaultScreenId); auto shotScreenIds = abstractScreenController_->GetShotScreenIds(expandScreenIds); -- Gitee From aeaf4553c801dde6dbb863ab0c329d580d329269 Mon Sep 17 00:00:00 2001 From: lu Date: Tue, 1 Mar 2022 17:04:57 +0800 Subject: [PATCH 4/9] Add 'Screen.GetName' Signed-off-by: lu Change-Id: Ie2ae5404770f966a00ce3a7cf12a1cb7031bdbf1 --- dm/src/display_manager_adapter.cpp | 4 ++-- dm/src/screen.cpp | 11 ++++++++++ dm/src/screen_manager.cpp | 14 ++++++------- dm/test/systemtest/screen_manager_test.cpp | 2 +- dmserver/include/abstract_screen.h | 11 +++------- dmserver/include/display_manager_interface.h | 2 +- dmserver/include/display_manager_proxy.h | 2 +- dmserver/include/display_manager_service.h | 2 +- dmserver/src/abstract_screen.cpp | 14 +++++++++---- dmserver/src/abstract_screen_controller.cpp | 22 ++++++++++---------- dmserver/src/display_manager_proxy.cpp | 10 ++++----- dmserver/src/display_manager_service.cpp | 4 ++-- dmserver/src/display_manager_stub.cpp | 2 +- interfaces/innerkits/dm/dm_common.h | 7 +++++-- interfaces/innerkits/dm/screen.h | 2 ++ interfaces/innerkits/dm/screen_manager.h | 2 +- utils/include/screen_info.h | 7 +++++++ utils/src/screen_info.cpp | 8 +++++-- 18 files changed, 77 insertions(+), 49 deletions(-) diff --git a/dm/src/display_manager_adapter.cpp b/dm/src/display_manager_adapter.cpp index 1b3af59fa2..293f583371 100644 --- a/dm/src/display_manager_adapter.cpp +++ b/dm/src/display_manager_adapter.cpp @@ -49,11 +49,11 @@ sptr DisplayManagerAdapter::GetDisplayInfoByScreenId(ScreenId scree std::shared_ptr DisplayManagerAdapter::GetDisplaySnapshot(DisplayId displayId) { if (!InitDMSProxy()) { - WLOGFE("displayManagerAdapter::GetDisplaySnapshot: InitDMSProxy failed!"); + WLOGFE("GetDisplaySnapshot: init dms proxy failed!"); return nullptr; } - return displayManagerServiceProxy_->GetDispalySnapshot(displayId); + return displayManagerServiceProxy_->GetDisplaySnapshot(displayId); } DMError ScreenManagerAdapter::GetScreenSupportedColorGamuts(ScreenId screenId, diff --git a/dm/src/screen.cpp b/dm/src/screen.cpp index 082d2685ab..d82b920c93 100644 --- a/dm/src/screen.cpp +++ b/dm/src/screen.cpp @@ -48,6 +48,11 @@ bool Screen::IsGroup() const return pImpl_->GetScreenInfo()->GetCanHasChild(); } +const std::string& Screen::GetName() const +{ + return pImpl_->GetScreenInfo()->GetName(); +} + ScreenId Screen::GetId() const { return pImpl_->GetScreenInfo()->GetScreenId(); @@ -105,6 +110,12 @@ Orientation Screen::GetOrientation() const return pImpl_->GetScreenInfo()->GetOrientation(); } +bool Screen::IsReal() const +{ + UpdateScreenInfo(); + return pImpl_->GetScreenInfo()->GetType() == ScreenType::REAL; +} + bool Screen::SetOrientation(Orientation orientation) const { WLOGFD("set orientation %{public}u", orientation); diff --git a/dm/src/screen_manager.cpp b/dm/src/screen_manager.cpp index e42d57e76f..369dfa287c 100644 --- a/dm/src/screen_manager.cpp +++ b/dm/src/screen_manager.cpp @@ -34,8 +34,8 @@ public: bool UnregisterScreenListener(sptr listener); bool RegisterScreenGroupListener(sptr listener); bool UnregisterScreenGroupListener(sptr listener); - sptr GetScreenById(ScreenId screenId); - sptr GetScreenGroupById(ScreenId screenId); + sptr GetScreen(ScreenId screenId); + sptr GetScreenGroup(ScreenId screenId); std::vector> GetAllScreens(); private: @@ -145,7 +145,7 @@ ScreenManager::~ScreenManager() { } -sptr ScreenManager::Impl::GetScreenById(ScreenId screenId) +sptr ScreenManager::Impl::GetScreen(ScreenId screenId) { auto screenInfo = SingletonContainer::Get().GetScreenInfo(screenId); std::lock_guard lock(mutex_); @@ -158,10 +158,10 @@ sptr ScreenManager::Impl::GetScreenById(ScreenId screenId) sptr ScreenManager::GetScreenById(ScreenId screenId) { - return pImpl_->GetScreenById(screenId); + return pImpl_->GetScreen(screenId); } -sptr ScreenManager::Impl::GetScreenGroupById(ScreenId screenId) +sptr ScreenManager::Impl::GetScreenGroup(ScreenId screenId) { auto screenGroupInfo = SingletonContainer::Get().GetScreenGroupInfoById(screenId); std::lock_guard lock(mutex_); @@ -181,9 +181,9 @@ sptr ScreenManager::Impl::GetScreenGroupById(ScreenId screenId) return screenGroup; } -sptr ScreenManager::GetScreenGroupById(ScreenId screenId) +sptr ScreenManager::GetScreenGroup(ScreenId screenId) { - return pImpl_->GetScreenGroupById(screenId); + return pImpl_->GetScreenGroup(screenId); } std::vector> ScreenManager::Impl::GetAllScreens() diff --git a/dm/test/systemtest/screen_manager_test.cpp b/dm/test/systemtest/screen_manager_test.cpp index f58612ea5b..249a99a4bf 100644 --- a/dm/test/systemtest/screen_manager_test.cpp +++ b/dm/test/systemtest/screen_manager_test.cpp @@ -365,7 +365,7 @@ HWTEST_F(ScreenManagerTest, ScreenManager11, Function | MediumTest | Level2) } /** - * @tc.name: ScreenManager11 + * @tc.name: ScreenManager12 * @tc.desc: Screen orientatin. * @tc.type: FUNC */ diff --git a/dmserver/include/abstract_screen.h b/dmserver/include/abstract_screen.h index 9f767485a2..5a8218188c 100644 --- a/dmserver/include/abstract_screen.h +++ b/dmserver/include/abstract_screen.h @@ -30,17 +30,11 @@ #include "screen_info.h" namespace OHOS::Rosen { -enum class ScreenType : uint32_t { - UNDEFINE, - REAL, - VIRTUAL -}; - class AbstractScreenGroup; class AbstractScreenController; class AbstractScreen : public RefBase { public: - AbstractScreen(ScreenId dmsId, ScreenId rsId); + AbstractScreen(const std::string& name, ScreenId dmsId, ScreenId rsId); AbstractScreen() = delete; ~AbstractScreen(); sptr GetActiveScreenMode() const; @@ -61,6 +55,7 @@ public: DMError SetScreenGamutMap(ScreenGamutMap gamutMap); DMError SetScreenColorTransform(); + const std::string name_; ScreenId dmsId_; ScreenId rsId_; bool canHasChild_ { false }; @@ -69,8 +64,8 @@ public: ScreenId groupDmsId_ { SCREEN_ID_INVALID }; ScreenType type_ { ScreenType::REAL }; int32_t activeIdx_ { 0 }; - float virtualPixelRatio = { 1.0 }; std::vector> modes_ = {}; + float virtualPixelRatio = { 1.0 }; Orientation orientation_ { Orientation::UNSPECIFIED }; Rotation rotation_ { Rotation::ROTATION_0 }; protected: diff --git a/dmserver/include/display_manager_interface.h b/dmserver/include/display_manager_interface.h index 7f5043d65a..dda8dd1042 100644 --- a/dmserver/include/display_manager_interface.h +++ b/dmserver/include/display_manager_interface.h @@ -77,7 +77,7 @@ public: virtual DMError DestroyVirtualScreen(ScreenId screenId) = 0; virtual DMError SetVirtualScreenSurface(ScreenId screenId, sptr surface) = 0; virtual bool SetOrientation(ScreenId screenId, Orientation orientation) = 0; - virtual std::shared_ptr GetDispalySnapshot(DisplayId displayId) = 0; + virtual std::shared_ptr GetDisplaySnapshot(DisplayId displayId) = 0; // colorspace, gamut virtual DMError GetScreenSupportedColorGamuts(ScreenId screenId, std::vector& colorGamuts) = 0; diff --git a/dmserver/include/display_manager_proxy.h b/dmserver/include/display_manager_proxy.h index 65afd1bdc4..79c862891e 100644 --- a/dmserver/include/display_manager_proxy.h +++ b/dmserver/include/display_manager_proxy.h @@ -39,7 +39,7 @@ public: DMError DestroyVirtualScreen(ScreenId screenId) override; DMError SetVirtualScreenSurface(ScreenId screenId, sptr surface) override; bool SetOrientation(ScreenId screenId, Orientation orientation) override; - std::shared_ptr GetDispalySnapshot(DisplayId displayId) override; + std::shared_ptr GetDisplaySnapshot(DisplayId displayId) override; // colorspace, gamut DMError GetScreenSupportedColorGamuts(ScreenId screenId, std::vector& colorGamuts) override; diff --git a/dmserver/include/display_manager_service.h b/dmserver/include/display_manager_service.h index 6dd84b4898..4f1d7219cf 100644 --- a/dmserver/include/display_manager_service.h +++ b/dmserver/include/display_manager_service.h @@ -54,7 +54,7 @@ public: sptr GetDisplayInfoById(DisplayId displayId) override; sptr GetDisplayInfoByScreen(ScreenId screenId) override; bool SetOrientation(ScreenId screenId, Orientation orientation) override; - std::shared_ptr GetDispalySnapshot(DisplayId displayId) override; + std::shared_ptr GetDisplaySnapshot(DisplayId displayId) override; ScreenId GetRSScreenId(DisplayId displayId) const; // colorspace, gamut diff --git a/dmserver/src/abstract_screen.cpp b/dmserver/src/abstract_screen.cpp index 75e399a815..b56d46532d 100644 --- a/dmserver/src/abstract_screen.cpp +++ b/dmserver/src/abstract_screen.cpp @@ -25,8 +25,9 @@ namespace { constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "AbstractScreenGroup"}; } -AbstractScreen::AbstractScreen(ScreenId dmsId, ScreenId rsId) - : dmsId_(dmsId), rsId_(rsId), screenController_(DisplayManagerService::GetInstance().abstractScreenController_) +AbstractScreen::AbstractScreen(const std::string& name, ScreenId dmsId, ScreenId rsId) + : name_(name), dmsId_(dmsId), rsId_(rsId), + screenController_(DisplayManagerService::GetInstance().abstractScreenController_) { } @@ -189,6 +190,7 @@ void AbstractScreen::FillScreenInfo(sptr info) const info->canHasChild_ = canHasChild_; info->rotation_ = rotation_; info->orientation_ = orientation_; + info->type_ = type_; info->modeId_ = activeIdx_; info->modes_ = modes_; } @@ -201,7 +203,11 @@ bool AbstractScreen::SetOrientation(Orientation orientation) Rotation AbstractScreen::CalcRotation(Orientation orientation) const { - sptr info = AbstractScreen::GetActiveScreenMode(); + if (activeIdx_ < 0 || activeIdx_ >= modes_.size()) { + WLOGE("active mode index is wrong: %{public}d", activeIdx_); + return Rotation::ROTATION_0; + } + sptr info = modes_[activeIdx_]; // virtical: phone(Plugin screen); horizontal: pad & external screen bool isVerticalScreen = info->width_ < info->height_; switch (orientation) { @@ -228,7 +234,7 @@ Rotation AbstractScreen::CalcRotation(Orientation orientation) const } AbstractScreenGroup::AbstractScreenGroup(ScreenId dmsId, ScreenId rsId, ScreenCombination combination) - : AbstractScreen(dmsId, rsId), combination_(combination) + : AbstractScreen("", dmsId, rsId), combination_(combination) { type_ = ScreenType::UNDEFINE; canHasChild_ = true; diff --git a/dmserver/src/abstract_screen_controller.cpp b/dmserver/src/abstract_screen_controller.cpp index fff8599f8c..1c4972fcc1 100644 --- a/dmserver/src/abstract_screen_controller.cpp +++ b/dmserver/src/abstract_screen_controller.cpp @@ -164,7 +164,7 @@ ScreenId AbstractScreenController::GetDefaultAbstractScreenId() } WLOGFI("GetDefaultAbstractScreenId, default screen is null, try to get."); ScreenId dmsScreenId = dmsScreenCount_; - sptr absScreen = new AbstractScreen(dmsScreenId, rsDefaultId); + sptr absScreen = new AbstractScreen(DEFAULT_SCREEN_NAME, dmsScreenId, rsDefaultId); if (!FillAbstractScreen(absScreen, rsDefaultId)) { WLOGFW("GetDefaultAbstractScreenId, FillAbstractScreen failed."); return INVALID_SCREEN_ID; @@ -218,7 +218,7 @@ void AbstractScreenController::OnRsScreenConnectionChange(ScreenId rsScreenId, S if (iter == rs2DmsScreenIdMap_.end()) { WLOGFD("connect new screen"); dmsScreenId = dmsScreenCount_; - sptr absScreen = new AbstractScreen(dmsScreenId, rsScreenId); + sptr absScreen = new AbstractScreen(DEFAULT_SCREEN_NAME, dmsScreenId, rsScreenId); if (!FillAbstractScreen(absScreen, rsScreenId)) { return; } @@ -417,20 +417,20 @@ sptr AbstractScreenController::AddAsSuccedentScreenLocked(s ScreenId AbstractScreenController::CreateVirtualScreen(VirtualScreenOption option) { - ScreenId result = rsInterface_.CreateVirtualScreen(option.name_, option.width_, + ScreenId rsId = rsInterface_.CreateVirtualScreen(option.name_, option.width_, option.height_, option.surface_, INVALID_SCREEN_ID, option.flags_); - WLOGFI("AbstractScreenController::CreateVirtualScreen id: %{public}" PRIu64"", result); - if (result == SCREEN_ID_INVALID) { + WLOGFI("CreateVirtualScreen id: %{public}" PRIu64"", rsId); + if (rsId == SCREEN_ID_INVALID) { return SCREEN_ID_INVALID; } std::lock_guard lock(mutex_); ScreenId dmsScreenId = SCREEN_ID_INVALID; - auto iter = rs2DmsScreenIdMap_.find(result); + auto iter = rs2DmsScreenIdMap_.find(rsId); if (iter == rs2DmsScreenIdMap_.end()) { if (!option.isForShot_) { WLOGI("CreateVirtualScreen is not shot"); dmsScreenId = dmsScreenCount_; - sptr absScreen = new AbstractScreen(dmsScreenId, result); + sptr absScreen = new AbstractScreen(option.name_, dmsScreenId, rsId); sptr info = new SupportedScreenModes(); info->width_ = option.width_; info->height_ = option.height_; @@ -442,15 +442,15 @@ ScreenId AbstractScreenController::CreateVirtualScreen(VirtualScreenOption optio absScreen->activeIdx_ = 0; absScreen->type_ = ScreenType::VIRTUAL; dmsScreenCount_++; - rs2DmsScreenIdMap_.insert(std::make_pair(result, dmsScreenId)); - dms2RsScreenIdMap_.insert(std::make_pair(dmsScreenId, result)); + rs2DmsScreenIdMap_.insert(std::make_pair(rsId, dmsScreenId)); + dms2RsScreenIdMap_.insert(std::make_pair(dmsScreenId, rsId)); dmsScreenMap_.insert(std::make_pair(dmsScreenId, absScreen)); DisplayManagerAgentController::GetInstance().OnScreenConnect(absScreen->ConvertToScreenInfo()); } else { WLOGI("CreateVirtualScreen is shot"); dmsScreenId = dmsScreenCount_++; - rs2DmsScreenIdMap_.insert(std::make_pair(result, dmsScreenId)); - dms2RsScreenIdMap_.insert(std::make_pair(dmsScreenId, result)); + rs2DmsScreenIdMap_.insert(std::make_pair(rsId, dmsScreenId)); + dms2RsScreenIdMap_.insert(std::make_pair(dmsScreenId, rsId)); } } else { return iter->second; diff --git a/dmserver/src/display_manager_proxy.cpp b/dmserver/src/display_manager_proxy.cpp index b86a6c977c..c89823dfc4 100644 --- a/dmserver/src/display_manager_proxy.cpp +++ b/dmserver/src/display_manager_proxy.cpp @@ -247,11 +247,11 @@ bool DisplayManagerProxy::SetOrientation(ScreenId screenId, Orientation orientat return reply.ReadBool(); } -std::shared_ptr DisplayManagerProxy::GetDispalySnapshot(DisplayId displayId) +std::shared_ptr DisplayManagerProxy::GetDisplaySnapshot(DisplayId displayId) { sptr remote = Remote(); if (remote == nullptr) { - WLOGFW("GetDispalySnapshot: remote is nullptr"); + WLOGFW("GetDisplaySnapshot: remote is nullptr"); return nullptr; } @@ -259,7 +259,7 @@ std::shared_ptr DisplayManagerProxy::GetDispalySnapshot(Display MessageParcel reply; MessageOption option; if (!data.WriteInterfaceToken(GetDescriptor())) { - WLOGFE("GetDispalySnapshot: WriteInterfaceToken failed"); + WLOGFE("GetDisplaySnapshot: WriteInterfaceToken failed"); return nullptr; } @@ -269,13 +269,13 @@ std::shared_ptr DisplayManagerProxy::GetDispalySnapshot(Display } if (remote->SendRequest(TRANS_ID_GET_DISPLAY_SNAPSHOT, data, reply, option) != ERR_NONE) { - WLOGFW("GetDispalySnapshot: SendRequest failed"); + WLOGFW("GetDisplaySnapshot: SendRequest failed"); return nullptr; } std::shared_ptr pixelMap(reply.ReadParcelable()); if (pixelMap == nullptr) { - WLOGFW("DisplayManagerProxy::GetDispalySnapshot SendRequest nullptr."); + WLOGFW("DisplayManagerProxy::GetDisplaySnapshot SendRequest nullptr."); return nullptr; } return pixelMap; diff --git a/dmserver/src/display_manager_service.cpp b/dmserver/src/display_manager_service.cpp index c4e5ad24eb..b13bc8c3e5 100644 --- a/dmserver/src/display_manager_service.cpp +++ b/dmserver/src/display_manager_service.cpp @@ -176,9 +176,9 @@ bool DisplayManagerService::SetOrientation(ScreenId screenId, Orientation orient return abstractScreenController_->SetOrientation(screenId, orientation); } -std::shared_ptr DisplayManagerService::GetDispalySnapshot(DisplayId displayId) +std::shared_ptr DisplayManagerService::GetDisplaySnapshot(DisplayId displayId) { - WM_SCOPED_TRACE("dms:GetDispalySnapshot(%" PRIu64")", displayId); + WM_SCOPED_TRACE("dms:GetDisplaySnapshot(%" PRIu64")", displayId); std::shared_ptr screenSnapshot = abstractDisplayController_->GetScreenSnapshot(displayId); return screenSnapshot; diff --git a/dmserver/src/display_manager_stub.cpp b/dmserver/src/display_manager_stub.cpp index 03e542d4c5..b4f3b75f8c 100644 --- a/dmserver/src/display_manager_stub.cpp +++ b/dmserver/src/display_manager_stub.cpp @@ -108,7 +108,7 @@ int32_t DisplayManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, } case TRANS_ID_GET_DISPLAY_SNAPSHOT: { DisplayId displayId = data.ReadUint64(); - std::shared_ptr dispalySnapshot = GetDispalySnapshot(displayId); + std::shared_ptr dispalySnapshot = GetDisplaySnapshot(displayId); if (dispalySnapshot == nullptr) { reply.WriteParcelable(nullptr); break; diff --git a/interfaces/innerkits/dm/dm_common.h b/interfaces/innerkits/dm/dm_common.h index 83807bc8d4..20b26f3628 100644 --- a/interfaces/innerkits/dm/dm_common.h +++ b/interfaces/innerkits/dm/dm_common.h @@ -22,8 +22,11 @@ namespace OHOS { namespace Rosen { using DisplayId = uint64_t; using ScreenId = uint64_t; -static constexpr DisplayId DISPLAY_ID_INVALD = -1ULL; -static constexpr ScreenId SCREEN_ID_INVALID = -1ULL; +namespace { + constexpr DisplayId DISPLAY_ID_INVALD = -1ULL; + constexpr ScreenId SCREEN_ID_INVALID = -1ULL; + const static std::string DEFAULT_SCREEN_NAME = "buildIn"; +} enum class PowerStateChangeReason : uint32_t { POWER_BUTTON, diff --git a/interfaces/innerkits/dm/screen.h b/interfaces/innerkits/dm/screen.h index 7819277eb4..27ddbd339f 100644 --- a/interfaces/innerkits/dm/screen.h +++ b/interfaces/innerkits/dm/screen.h @@ -65,6 +65,7 @@ public: Screen& operator=(const Screen&) = delete; Screen& operator=(Screen&&) = delete; bool IsGroup() const; + const std::string& GetName() const; ScreenId GetId() const; uint32_t GetWidth() const; uint32_t GetHeight() const; @@ -73,6 +74,7 @@ public: float GetVirtualPixelRatio() const; Rotation GetRotation() const; Orientation GetOrientation() const; + bool IsReal() const; ScreenId GetParentId() const; uint32_t GetModeId() const; std::vector> GetSupportedModes() const; diff --git a/interfaces/innerkits/dm/screen_manager.h b/interfaces/innerkits/dm/screen_manager.h index 0d3e6879cf..8a9140b15f 100644 --- a/interfaces/innerkits/dm/screen_manager.h +++ b/interfaces/innerkits/dm/screen_manager.h @@ -40,7 +40,7 @@ public: }; sptr GetScreenById(ScreenId screenId); - sptr GetScreenGroupById(ScreenId screenId); + sptr GetScreenGroup(ScreenId groupId); std::vector> GetAllScreens(); bool RegisterScreenListener(sptr listener); diff --git a/utils/include/screen_info.h b/utils/include/screen_info.h index 72e8c181ed..a3965dda7d 100644 --- a/utils/include/screen_info.h +++ b/utils/include/screen_info.h @@ -22,6 +22,11 @@ #include "screen.h" namespace OHOS::Rosen { +enum class ScreenType : uint32_t { + UNDEFINE, + REAL, + VIRTUAL +}; class ScreenInfo : public Parcelable { friend class AbstractScreen; public: @@ -34,6 +39,7 @@ public: virtual bool Marshalling(Parcel& parcel) const override; static ScreenInfo* Unmarshalling(Parcel& parcel); + DEFINE_VAR_FUNC_GET(std::string, Name, name); DEFINE_VAR_DEFAULT_FUNC_GET(ScreenId, ScreenId, id, SCREEN_ID_INVALID); DEFINE_VAR_DEFAULT_FUNC_GET(uint32_t, VirtualWidth, virtualWidth, 0); DEFINE_VAR_DEFAULT_FUNC_GET(uint32_t, VirtualHeight, virtualHeight, 0); @@ -42,6 +48,7 @@ public: DEFINE_VAR_DEFAULT_FUNC_GET(bool, CanHasChild, canHasChild, false); DEFINE_VAR_DEFAULT_FUNC_GET(Rotation, Rotation, rotation, Rotation::ROTATION_0); DEFINE_VAR_DEFAULT_FUNC_GET(Orientation, Orientation, orientation, Orientation::UNSPECIFIED); + DEFINE_VAR_DEFAULT_FUNC_GET(ScreenType, Type, type, ScreenType::REAL); DEFINE_VAR_DEFAULT_FUNC_GET_SET(uint32_t, ModeId, modeId, 0); DEFINE_VAR_FUNC_GET(std::vector>, Modes, modes); protected: diff --git a/utils/src/screen_info.cpp b/utils/src/screen_info.cpp index 374d863686..84e649cc21 100644 --- a/utils/src/screen_info.cpp +++ b/utils/src/screen_info.cpp @@ -18,11 +18,12 @@ namespace OHOS::Rosen { bool ScreenInfo::Marshalling(Parcel &parcel) const { - bool res = parcel.WriteUint64(id_) && + bool res = parcel.WriteString(name_) && parcel.WriteUint64(id_) && parcel.WriteUint32(virtualWidth_) && parcel.WriteUint32(virtualHeight_) && parcel.WriteFloat(virtualPixelRatio_) && parcel.WriteUint64(parent_) && parcel.WriteBool(canHasChild_) && parcel.WriteUint32(static_cast(rotation_)) && parcel.WriteUint32(static_cast(orientation_)) && + parcel.WriteUint32(static_cast(type_)) && parcel.WriteUint32(modeId_) && parcel.WriteUint32(static_cast(modes_.size())); if (!res) { return false; @@ -54,11 +55,13 @@ bool ScreenInfo::InnerUnmarshalling(Parcel& parcel) uint32_t size = 0; uint32_t rotation; uint32_t orientation; + uint32_t type; + name_ = parcel.ReadString(); bool res1 = parcel.ReadUint64(id_) && parcel.ReadUint32(virtualWidth_) && parcel.ReadUint32(virtualHeight_) && parcel.ReadFloat(virtualPixelRatio_) && parcel.ReadUint64(parent_) && parcel.ReadBool(canHasChild_) && parcel.ReadUint32(rotation) && - parcel.ReadUint32(orientation) && + parcel.ReadUint32(orientation) && parcel.ReadUint32(type) && parcel.ReadUint32(modeId_) && parcel.ReadUint32(size); if (!res1) { return false; @@ -76,6 +79,7 @@ bool ScreenInfo::InnerUnmarshalling(Parcel& parcel) } rotation_ = static_cast(rotation); orientation_ = static_cast(orientation); + type_ = static_cast(type); return true; } } // namespace OHOS::Rosen \ No newline at end of file -- Gitee From cad791e92af564bbfe185d55c0c60f22c3347c6d Mon Sep 17 00:00:00 2001 From: chenqinxin Date: Tue, 1 Mar 2022 18:23:54 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=91=8A=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenqinxin Change-Id: Id53f70e5ab77db800b428481c129bc0ee72b0538 --- dmserver/src/abstract_display.cpp | 2 +- interfaces/kits/napi/display/js_display_manager.cpp | 7 ++++++- .../napi/display_runtime/napi/js_screen_manager.cpp | 9 +++++++-- utils/src/surface_reader.cpp | 10 +++++----- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/dmserver/src/abstract_display.cpp b/dmserver/src/abstract_display.cpp index e304934e25..0b85b3323b 100644 --- a/dmserver/src/abstract_display.cpp +++ b/dmserver/src/abstract_display.cpp @@ -33,7 +33,7 @@ AbstractDisplay::AbstractDisplay(const DisplayInfo* info) id_ = info->GetDisplayId(); width_ = info->GetWidth(); height_ = info->GetHeight(); - freshRate_ = info->GetHeight(); + freshRate_ = info->GetFreshRate(); } AbstractDisplay::AbstractDisplay(DisplayId id, ScreenId screenId, int32_t width, int32_t height, uint32_t freshRate) diff --git a/interfaces/kits/napi/display/js_display_manager.cpp b/interfaces/kits/napi/display/js_display_manager.cpp index d53330a4d8..a8afaad061 100644 --- a/interfaces/kits/napi/display/js_display_manager.cpp +++ b/interfaces/kits/napi/display/js_display_manager.cpp @@ -14,6 +14,7 @@ */ #include +#include #include "js_runtime_utils.h" #include "native_engine/native_reference.h" @@ -152,7 +153,11 @@ void RegisterDisplayListenerWithType(NativeEngine& engine, const std::string& ty } std::unique_ptr callbackRef; callbackRef.reset(engine.CreateReference(value, 1)); - sptr displayListener = new JsDisplayListener(&engine); + sptr displayListener = new(std::nothrow) JsDisplayListener(&engine); + if (displayListener == nullptr) { + WLOGFE("displayListener is nullptr"); + return; + } if (type == "add" || type == "remove" || type == "change") { SingletonContainer::Get().RegisterDisplayListener(displayListener); WLOGFI("JsDisplayManager::RegisterDisplayListenerWithType success"); diff --git a/interfaces/kits/napi/display_runtime/napi/js_screen_manager.cpp b/interfaces/kits/napi/display_runtime/napi/js_screen_manager.cpp index b601166e31..8f74813a60 100644 --- a/interfaces/kits/napi/display_runtime/napi/js_screen_manager.cpp +++ b/interfaces/kits/napi/display_runtime/napi/js_screen_manager.cpp @@ -12,10 +12,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + #include "js_screen_manager.h" #include - +#include #include #include "js_runtime_utils.h" #include "js_screen_listener.h" @@ -138,7 +139,11 @@ void RegisterScreenListenerWithType(NativeEngine& engine, const std::string& typ } std::unique_ptr callbackRef; callbackRef.reset(engine.CreateReference(value, 1)); - sptr screenListener = new JsScreenListener(&engine); + sptr screenListener = new(std::nothrow) JsScreenListener(&engine); + if (screenListener == nullptr) { + WLOGFE("screenListener is nullptr"); + return; + } if (type == "connect" || type == "disconnect" || type == "change") { SingletonContainer::Get().RegisterScreenListener(screenListener); WLOGFI("JsScreenManager::RegisterScreenListenerWithType success"); diff --git a/utils/src/surface_reader.cpp b/utils/src/surface_reader.cpp index af49492af1..0ed3e68960 100644 --- a/utils/src/surface_reader.cpp +++ b/utils/src/surface_reader.cpp @@ -117,9 +117,9 @@ bool SurfaceReader::ProcessBuffer(const sptr &buf) return false; } - uint32_t width = bufferHandle->width; - uint32_t height = bufferHandle->height; - uint32_t stride = bufferHandle->stride; + uint32_t width = static_cast(bufferHandle->width); + uint32_t height = static_cast(bufferHandle->height); + uint32_t stride = static_cast(bufferHandle->stride); uint8_t *addr = (uint8_t *)buf->GetVirAddr(); auto data = (uint8_t *)malloc(width * height * BPP); @@ -137,8 +137,8 @@ bool SurfaceReader::ProcessBuffer(const sptr &buf) sptr pixelMap = new PixelMap(); ImageInfo info; - info.size.width = width; - info.size.height = height; + info.size.width = static_cast(width); + info.size.height = static_cast(height); info.pixelFormat = PixelFormat::RGBA_8888; info.colorSpace = ColorSpace::SRGB; pixelMap->SetImageInfo(info); -- Gitee From 2d91b2d7e06cf522e225bb74e5c10bee4ec1f016 Mon Sep 17 00:00:00 2001 From: xiaojianfeng Date: Tue, 1 Mar 2022 18:57:03 +0800 Subject: [PATCH 6/9] add screen manager test and CancelMakeMirrorOrExpand interface Signed-off-by: xiaojianfeng Change-Id: I5b9dba617ca64adf68da71a3d45c86a341c8f4c2 --- dm/include/display_manager_adapter.h | 1 + dm/src/display_manager_adapter.cpp | 8 ++ dm/src/screen_manager.cpp | 5 + dm/test/systemtest/screen_manager_test.cpp | 104 +++++++++++++++++- dmserver/include/abstract_screen_controller.h | 2 + dmserver/include/display_manager_interface.h | 2 + dmserver/include/display_manager_proxy.h | 1 + dmserver/include/display_manager_service.h | 1 + dmserver/src/abstract_screen_controller.cpp | 46 +++++++- dmserver/src/display_manager_proxy.cpp | 25 +++++ dmserver/src/display_manager_service.cpp | 5 + dmserver/src/display_manager_stub.cpp | 9 ++ interfaces/innerkits/dm/screen_manager.h | 1 + utils/include/future.h | 32 ++++++ 14 files changed, 235 insertions(+), 7 deletions(-) diff --git a/dm/include/display_manager_adapter.h b/dm/include/display_manager_adapter.h index a95e23d892..e7e6868a95 100644 --- a/dm/include/display_manager_adapter.h +++ b/dm/include/display_manager_adapter.h @@ -82,6 +82,7 @@ public: virtual std::vector> GetAllScreenInfos(); virtual ScreenId MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId); virtual ScreenId MakeExpand(std::vector screenId, std::vector startPoint); + virtual void CancelMakeMirrorOrExpand(std::vector); virtual bool SetScreenActiveMode(ScreenId screenId, uint32_t modeId); virtual sptr GetScreenInfo(ScreenId screenId); diff --git a/dm/src/display_manager_adapter.cpp b/dm/src/display_manager_adapter.cpp index 293f583371..df45774168 100644 --- a/dm/src/display_manager_adapter.cpp +++ b/dm/src/display_manager_adapter.cpp @@ -378,6 +378,14 @@ ScreenId ScreenManagerAdapter::MakeExpand(std::vector screenId, std::v return displayManagerServiceProxy_->MakeExpand(screenId, startPoint); } +void ScreenManagerAdapter::CancelMakeMirrorOrExpand(std::vector screens) +{ + if (!InitDMSProxy()) { + return; + } + displayManagerServiceProxy_->CancelMakeMirrorOrExpand(screens); +} + bool ScreenManagerAdapter::SetScreenActiveMode(ScreenId screenId, uint32_t modeId) { if (!InitDMSProxy()) { diff --git a/dm/src/screen_manager.cpp b/dm/src/screen_manager.cpp index 369dfa287c..7c73f06567 100644 --- a/dm/src/screen_manager.cpp +++ b/dm/src/screen_manager.cpp @@ -336,6 +336,11 @@ ScreenId ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector return group; } +void ScreenManager::CancelMakeMirrorOrExpand(std::vector screens) +{ + return SingletonContainer::Get().CancelMakeMirrorOrExpand(screens); +} + ScreenId ScreenManager::CreateVirtualScreen(VirtualScreenOption option) { return SingletonContainer::Get().CreateVirtualScreen(option); diff --git a/dm/test/systemtest/screen_manager_test.cpp b/dm/test/systemtest/screen_manager_test.cpp index 249a99a4bf..6ffbf29515 100644 --- a/dm/test/systemtest/screen_manager_test.cpp +++ b/dm/test/systemtest/screen_manager_test.cpp @@ -17,6 +17,7 @@ #include #include "display_test_utils.h" +#include "future.h" #include "screen.h" #include "window.h" #include "window_option.h" @@ -47,6 +48,38 @@ public: const uint32_t execTimes_ = 10; const uint32_t acquireFrames_ = 1; static constexpr uint32_t TEST_SPEEP_S = 1; // test spleep time + static constexpr long TIME_OUT = 1000; +}; + +class ScreenChangeListener : public ScreenManager::IScreenListener { +public: + virtual void OnConnect(ScreenId screenId) override + { + connectFuture_.SetValue(screenId); + } + virtual void OnDisconnect(ScreenId screenId) override + { + disconnectFuture_.SetValue(screenId); + } + virtual void OnChange(ScreenId screenId) override + { + changeFuture_.SetValue(screenId); + } + RunnableFuture connectFuture_; + RunnableFuture disconnectFuture_; + RunnableFuture changeFuture_; +}; + +class ScreenGroupChangeListener : public ScreenManager::IScreenGroupListener { +public: + virtual void OnChange(const std::vector& screenIds, ScreenGroupChangeEvent event) override + { + for (auto screenId : screenIds) { + changeFuture_.SetValue(std::make_pair(screenId, event)); + usleep(10 * 1000); // wait 10000 us + } + } + RunnableFuture> changeFuture_; }; sptr ScreenManagerTest::defaultDisplay_ = nullptr; @@ -275,13 +308,33 @@ HWTEST_F(ScreenManagerTest, ScreenManager08, Function | MediumTest | Level2) ASSERT_TRUE(utils.CreateSurface()); defaultOption_.surface_ = utils.psurface_; defaultOption_.isForShot_ = false; + sptr screenListener = new ScreenChangeListener(); + sptr screenGroupChangeListener = new ScreenGroupChangeListener(); + ScreenManager::GetInstance().RegisterScreenListener(screenListener); + ScreenManager::GetInstance().RegisterScreenGroupListener(screenGroupChangeListener); ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); + ScreenId screenId = screenListener->connectFuture_.GetResult(TIME_OUT); + screenListener->connectFuture_.Reset(); + ASSERT_EQ(virtualScreenId, screenId); std::vector> screens = ScreenManager::GetInstance().GetAllScreens(); sptr DefaultScreen = screens.front(); std::vector options = {{DefaultScreen->GetId(), 0, 0}, {virtualScreenId, defaultWidth_, 0}}; ScreenId expansionId = ScreenManager::GetInstance().MakeExpand(options); ASSERT_NE(SCREEN_ID_INVALID, expansionId); + auto pair = screenGroupChangeListener->changeFuture_.GetResult(TIME_OUT); + screenGroupChangeListener->changeFuture_.Reset(); + ASSERT_EQ(virtualScreenId, pair.first); + ASSERT_EQ(ScreenGroupChangeEvent::ADD_TO_GROUP, pair.second); ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId)); + screenId = screenListener->disconnectFuture_.GetResult(TIME_OUT); + screenListener->disconnectFuture_.Reset(); + ASSERT_EQ(virtualScreenId, screenId); + pair = screenGroupChangeListener->changeFuture_.GetResult(TIME_OUT); + screenGroupChangeListener->changeFuture_.Reset(); + ASSERT_EQ(virtualScreenId, pair.first); + ASSERT_EQ(ScreenGroupChangeEvent::REMOVE_FROM_GROUP, pair.second); + ScreenManager::GetInstance().UnregisterScreenListener(screenListener); + ScreenManager::GetInstance().UnregisterScreenGroupListener(screenGroupChangeListener); } /** @@ -296,7 +349,14 @@ HWTEST_F(ScreenManagerTest, ScreenManager09, Function | MediumTest | Level2) ASSERT_TRUE(utils.CreateSurface()); defaultOption_.surface_ = utils.psurface_; defaultOption_.isForShot_ = false; + sptr screenListener = new ScreenChangeListener(); + sptr screenGroupChangeListener = new ScreenGroupChangeListener(); + ScreenManager::GetInstance().RegisterScreenListener(screenListener); + ScreenManager::GetInstance().RegisterScreenGroupListener(screenGroupChangeListener); ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); + ScreenId screenId = screenListener->connectFuture_.GetResult(TIME_OUT); + screenListener->connectFuture_.Reset(); + ASSERT_EQ(virtualScreenId, screenId); std::vector> screens = ScreenManager::GetInstance().GetAllScreens(); sptr DefaultScreen = screens.front(); DisplayId virtualDisplayId = DISPLAY_ID_INVALD; @@ -311,9 +371,22 @@ HWTEST_F(ScreenManagerTest, ScreenManager09, Function | MediumTest | Level2) sleep(TEST_SPEEP_S); std::vector options = {{DefaultScreen->GetId(), 0, 0}, {virtualScreenId, defaultWidth_, 0}}; ScreenId expansionId = ScreenManager::GetInstance().MakeExpand(options); + auto pair = screenGroupChangeListener->changeFuture_.GetResult(TIME_OUT); + screenGroupChangeListener->changeFuture_.Reset(); + ASSERT_EQ(virtualScreenId, pair.first); + ASSERT_EQ(ScreenGroupChangeEvent::ADD_TO_GROUP, pair.second); sleep(TEST_SPEEP_S); ASSERT_NE(SCREEN_ID_INVALID, expansionId); ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId)); + screenId = screenListener->disconnectFuture_.GetResult(TIME_OUT); + screenListener->disconnectFuture_.Reset(); + ASSERT_EQ(virtualScreenId, screenId); + pair = screenGroupChangeListener->changeFuture_.GetResult(TIME_OUT); + screenGroupChangeListener->changeFuture_.Reset(); + ASSERT_EQ(virtualScreenId, pair.first); + ASSERT_EQ(ScreenGroupChangeEvent::REMOVE_FROM_GROUP, pair.second); + ScreenManager::GetInstance().UnregisterScreenListener(screenListener); + ScreenManager::GetInstance().UnregisterScreenGroupListener(screenGroupChangeListener); sleep(TEST_SPEEP_S); window->Destroy(); // will add NotifyExpandDisconnect check logic. @@ -330,13 +403,22 @@ HWTEST_F(ScreenManagerTest, ScreenManager10, Function | MediumTest | Level2) ASSERT_TRUE(utils.CreateSurface()); defaultOption_.surface_ = utils.psurface_; defaultOption_.isForShot_ = false; + sptr screenListener = new ScreenChangeListener(); for (uint32_t i = 0; i < execTimes_; i++) { + ScreenManager::GetInstance().RegisterScreenListener(screenListener); ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId); + ScreenId screenId = screenListener->connectFuture_.GetResult(TIME_OUT); + screenListener->connectFuture_.Reset(); + ASSERT_EQ(virtualScreenId, screenId); auto screen = ScreenManager::GetInstance().GetScreenById(virtualScreenId); ASSERT_EQ(virtualScreenId, screen->GetId()); ASSERT_EQ(SCREEN_ID_INVALID, screen->GetParentId()); ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId)); + screenId = screenListener->disconnectFuture_.GetResult(TIME_OUT); + screenListener->disconnectFuture_.Reset(); + ASSERT_EQ(virtualScreenId, screenId); + ScreenManager::GetInstance().UnregisterScreenListener(screenListener); } } @@ -351,16 +433,36 @@ HWTEST_F(ScreenManagerTest, ScreenManager11, Function | MediumTest | Level2) ASSERT_TRUE(utils.CreateSurface()); defaultOption_.surface_ = utils.psurface_; defaultOption_.isForShot_ = false; + sptr screenListener = new ScreenChangeListener(); + sptr screenGroupChangeListener = new ScreenGroupChangeListener(); for (uint32_t i = 0; i < 10; i++) { + ScreenManager::GetInstance().RegisterScreenListener(screenListener); + ScreenManager::GetInstance().RegisterScreenGroupListener(screenGroupChangeListener); ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); + ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId); + ScreenId screenId = screenListener->connectFuture_.GetResult(TIME_OUT); + screenListener->connectFuture_.Reset(); + ASSERT_EQ(virtualScreenId, screenId); std::vector mirrorIds; mirrorIds.push_back(virtualScreenId); ScreenManager::GetInstance().MakeMirror(defaultScreenId_, mirrorIds); - ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId); + auto pair = screenGroupChangeListener->changeFuture_.GetResult(TIME_OUT); + screenGroupChangeListener->changeFuture_.Reset(); + ASSERT_EQ(virtualScreenId, pair.first); + ASSERT_EQ(ScreenGroupChangeEvent::ADD_TO_GROUP, pair.second); auto screen = ScreenManager::GetInstance().GetScreenById(virtualScreenId); ASSERT_EQ(virtualScreenId, screen->GetId()); ASSERT_NE(SCREEN_ID_INVALID, screen->GetParentId()); ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId)); + screenId = screenListener->disconnectFuture_.GetResult(TIME_OUT); + screenListener->disconnectFuture_.Reset(); + ASSERT_EQ(virtualScreenId, screenId); + pair = screenGroupChangeListener->changeFuture_.GetResult(TIME_OUT); + screenGroupChangeListener->changeFuture_.Reset(); + ASSERT_EQ(virtualScreenId, pair.first); + ASSERT_EQ(ScreenGroupChangeEvent::REMOVE_FROM_GROUP, pair.second); + ScreenManager::GetInstance().UnregisterScreenListener(screenListener); + ScreenManager::GetInstance().UnregisterScreenGroupListener(screenGroupChangeListener); } } diff --git a/dmserver/include/abstract_screen_controller.h b/dmserver/include/abstract_screen_controller.h index 70a38b3577..cd14a942c3 100644 --- a/dmserver/include/abstract_screen_controller.h +++ b/dmserver/include/abstract_screen_controller.h @@ -64,6 +64,7 @@ public: void UpdateRSTree(ScreenId dmsScreenId, std::shared_ptr& surfaceNode, bool isAdd); bool MakeMirror(ScreenId, std::vector screens); bool MakeExpand(std::vector screenIds, std::vector startPoints); + void CancelMakeMirrorOrExpand(std::vector screens); void DumpScreenInfo() const; void DumpScreenGroupInfo() const; @@ -81,6 +82,7 @@ private: bool FillAbstractScreen(sptr& absScreen, ScreenId rsScreenId); sptr AddToGroupLocked(sptr newScreen); sptr RemoveFromGroupLocked(sptr newScreen); + bool RemoveChildFromGroup(sptr, sptr); bool CheckScreenInScreenGroup(sptr newScreen) const; sptr AddAsFirstScreenLocked(sptr newScreen); sptr AddAsSuccedentScreenLocked(sptr newScreen); diff --git a/dmserver/include/display_manager_interface.h b/dmserver/include/display_manager_interface.h index dda8dd1042..0af1b4985d 100644 --- a/dmserver/include/display_manager_interface.h +++ b/dmserver/include/display_manager_interface.h @@ -60,6 +60,7 @@ public: TRANS_ID_SCREENGROUP_BASE = 1100, TRANS_ID_SCREEN_MAKE_MIRROR = TRANS_ID_SCREENGROUP_BASE, TRANS_ID_SCREEN_MAKE_EXPAND, + TRANS_ID_SCREEN_MAKE_MIRROR_OR_EXPAND_CANCELED, TRANS_ID_SCREEN_GAMUT_BASE = 1200, TRANS_ID_SCREEN_GET_SUPPORTED_COLOR_GAMUTS = TRANS_ID_SCREEN_GAMUT_BASE, TRANS_ID_SCREEN_GET_COLOR_GAMUT, @@ -105,6 +106,7 @@ public: virtual std::vector> GetAllScreenInfos() = 0; virtual ScreenId MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId) = 0; virtual ScreenId MakeExpand(std::vector screenId, std::vector startPoint) = 0; + virtual void CancelMakeMirrorOrExpand(std::vector screens) = 0; virtual bool SetScreenActiveMode(ScreenId screenId, uint32_t modeId) = 0; }; } // namespace OHOS::Rosen diff --git a/dmserver/include/display_manager_proxy.h b/dmserver/include/display_manager_proxy.h index 79c862891e..52da1b90f3 100644 --- a/dmserver/include/display_manager_proxy.h +++ b/dmserver/include/display_manager_proxy.h @@ -67,6 +67,7 @@ public: sptr GetScreenGroupInfoById(ScreenId screenId) override; std::vector> GetAllScreenInfos() override; ScreenId MakeExpand(std::vector screenId, std::vector startPoint) override; + void CancelMakeMirrorOrExpand(std::vector screens) override; bool SetScreenActiveMode(ScreenId screenId, uint32_t modeId) override; private: diff --git a/dmserver/include/display_manager_service.h b/dmserver/include/display_manager_service.h index 4f1d7219cf..f63bd93085 100644 --- a/dmserver/include/display_manager_service.h +++ b/dmserver/include/display_manager_service.h @@ -86,6 +86,7 @@ public: sptr GetDisplayByScreen(ScreenId screenId) const; ScreenId MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId) override; ScreenId MakeExpand(std::vector screenId, std::vector startPoint) override; + void CancelMakeMirrorOrExpand(std::vector screens) override; sptr GetScreenInfoById(ScreenId screenId) override; sptr GetScreenGroupInfoById(ScreenId screenId) override; std::vector> GetAllScreenInfos() override; diff --git a/dmserver/src/abstract_screen_controller.cpp b/dmserver/src/abstract_screen_controller.cpp index 66dbf20766..d0ee1b7cd9 100644 --- a/dmserver/src/abstract_screen_controller.cpp +++ b/dmserver/src/abstract_screen_controller.cpp @@ -336,11 +336,21 @@ sptr AbstractScreenController::RemoveFromGroupLocked(sptr screenGroup = iter->second; + if (!RemoveChildFromGroup(screen, screenGroup)) { + return nullptr; + } + DisplayManagerAgentController::GetInstance().OnScreenGroupChange( + screen->ConvertToScreenInfo(), ScreenGroupChangeEvent::REMOVE_FROM_GROUP); + return screenGroup; +} + +bool AbstractScreenController::RemoveChildFromGroup(sptr screen, sptr screenGroup) +{ bool res = screenGroup->RemoveChild(screen); if (!res) { WLOGE("RemoveFromGroupLocked. remove screen:%{public}" PRIu64" failed from screenGroup:%{public}" PRIu64".", - screen->dmsId_, groupDmsId); - return nullptr; + screen->dmsId_, screen->groupDmsId_); + return false; } if (screen->dmsId_ == screenGroup->mirrorScreenId_) { // Todo: if mirror screen removed and it is SCREEN_MIRROR type, then should make mirror in this group. @@ -351,9 +361,7 @@ sptr AbstractScreenController::RemoveFromGroupLocked(sptrdmsId_); dmsScreenMap_.erase(screenGroup->dmsId_); } - DisplayManagerAgentController::GetInstance().OnScreenGroupChange( - screen->ConvertToScreenInfo(), ScreenGroupChangeEvent::REMOVE_FROM_GROUP); - return screenGroup; + return true; } bool AbstractScreenController::CheckScreenInScreenGroup(sptr screen) const @@ -719,7 +727,7 @@ void AbstractScreenController::ChangeScreenGroup(sptr group auto originGroup = GetAbstractScreenGroup(screen->groupDmsId_); bool removeChildRes = false; if (originGroup != nullptr) { - removeChildRes = originGroup->RemoveChild(screen); + removeChildRes = RemoveChildFromGroup(screen, originGroup); abstractScreenCallback_->onDisconnect_(screen); } addChildPos.emplace_back(startPoints[i]); @@ -787,6 +795,32 @@ bool AbstractScreenController::MakeExpand(std::vector screenIds, std:: return true; } +void AbstractScreenController::CancelMakeMirrorOrExpand(std::vector screens) +{ + if (screens.empty()) { + return; + } + std::vector> removeFromGroup; + for (ScreenId screenId : screens) { + auto screen = GetAbstractScreen(screenId); + if (screen->type_ != ScreenType::VIRTUAL) { + continue; + } + auto originGroup = GetAbstractScreenGroup(screen->groupDmsId_); + if (originGroup == nullptr) { + continue; + } + if (!originGroup->HasChild(screenId)) { + continue; + } + removeFromGroup.emplace_back(screen->ConvertToScreenInfo()); + RemoveChildFromGroup(screen, originGroup); + abstractScreenCallback_->onDisconnect_(screen); + } + DisplayManagerAgentController::GetInstance(). + OnScreenGroupChange(removeFromGroup, ScreenGroupChangeEvent::REMOVE_FROM_GROUP); +} + void AbstractScreenController::DumpScreenInfo() const { WLOGI("-------- dump screen info begin---------"); diff --git a/dmserver/src/display_manager_proxy.cpp b/dmserver/src/display_manager_proxy.cpp index c89823dfc4..a4cb9b4a5d 100644 --- a/dmserver/src/display_manager_proxy.cpp +++ b/dmserver/src/display_manager_proxy.cpp @@ -852,6 +852,31 @@ ScreenId DisplayManagerProxy::MakeExpand(std::vector screenId, std::ve return static_cast(reply.ReadUint64()); } +void DisplayManagerProxy::CancelMakeMirrorOrExpand(std::vector screens) +{ + sptr remote = Remote(); + if (remote == nullptr) { + WLOGFW("cancel make mirror or expand fail: remote is null"); + return; + } + + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!data.WriteInterfaceToken(GetDescriptor())) { + WLOGFE("cancel make mirror or expand fail: WriteInterfaceToken failed"); + return; + } + bool res = data.WriteUInt64Vector(screens); + if (!res) { + WLOGFE("cancel make mirror or expand fail: write screens failed."); + return; + } + if (remote->SendRequest(TRANS_ID_SCREEN_MAKE_MIRROR_OR_EXPAND_CANCELED, data, reply, option) != ERR_NONE) { + WLOGFW("cancel make mirror or expand fail: SendRequest failed"); + } +} + bool DisplayManagerProxy::SetScreenActiveMode(ScreenId screenId, uint32_t modeId) { sptr remote = Remote(); diff --git a/dmserver/src/display_manager_service.cpp b/dmserver/src/display_manager_service.cpp index 2197056806..604999222c 100644 --- a/dmserver/src/display_manager_service.cpp +++ b/dmserver/src/display_manager_service.cpp @@ -433,6 +433,11 @@ ScreenId DisplayManagerService::MakeMirror(ScreenId mainScreenId, std::vectorgroupDmsId_; } +void DisplayManagerService::CancelMakeMirrorOrExpand(std::vector screens) +{ + abstractScreenController_->CancelMakeMirrorOrExpand(screens); +} + void DisplayManagerService::UpdateRSTree(DisplayId displayId, std::shared_ptr& surfaceNode, bool isAdd) { diff --git a/dmserver/src/display_manager_stub.cpp b/dmserver/src/display_manager_stub.cpp index b4f3b75f8c..3a3f0742d3 100644 --- a/dmserver/src/display_manager_stub.cpp +++ b/dmserver/src/display_manager_stub.cpp @@ -223,6 +223,15 @@ int32_t DisplayManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, reply.WriteUint64(static_cast(result)); break; } + case TRANS_ID_SCREEN_MAKE_MIRROR_OR_EXPAND_CANCELED: { + std::vector screenId; + if (!data.ReadUInt64Vector(&screenId)) { + WLOGE("fail to receive screens in stub."); + break; + } + CancelMakeMirrorOrExpand(screenId); + break; + } case TRANS_ID_SET_SCREEN_ACTIVE_MODE: { ScreenId screenId = static_cast(data.ReadUint64()); uint32_t modeId = data.ReadUint32(); diff --git a/interfaces/innerkits/dm/screen_manager.h b/interfaces/innerkits/dm/screen_manager.h index 8a9140b15f..75159ee3c9 100644 --- a/interfaces/innerkits/dm/screen_manager.h +++ b/interfaces/innerkits/dm/screen_manager.h @@ -49,6 +49,7 @@ public: bool UnregisterScreenGroupListener(sptr listener); ScreenId MakeExpand(const std::vector& options); ScreenId MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId); + void CancelMakeMirrorOrExpand(std::vector screens); ScreenId CreateVirtualScreen(VirtualScreenOption option); DMError DestroyVirtualScreen(ScreenId screenId); DMError SetVirtualScreenSurface(ScreenId screenId, sptr surface); diff --git a/utils/include/future.h b/utils/include/future.h index 62b006e318..b8c3584efd 100644 --- a/utils/include/future.h +++ b/utils/include/future.h @@ -50,5 +50,37 @@ private: std::condition_variable conditionVariable_; std::mutex mutex_; }; + +template +class RunnableFuture : public Future { +public: + void SetValue(T res) + { + Future::FutureCall(res); + } + void Reset() + { + flag_ = false; + } +protected: + void Call(T res) override + { + if (!flag_) { + flag_ = true; + result_ = res; + } + } + bool IsReady() override + { + return flag_; + } + T FetchResult() override + { + return result_; + } +private: + bool flag_ {false}; + T result_; +}; } // namespace OHOS::Rosen #endif // OHOS_WM_INCLUDE_FUTURE_H -- Gitee From a7c784e72d27d06d119d72e142608cf65fef691e Mon Sep 17 00:00:00 2001 From: lu Date: Tue, 1 Mar 2022 21:03:16 +0800 Subject: [PATCH 7/9] Remove product macro Signed-off-by: lu Change-Id: Ibd73b757756527a1e5269afa8fae4bbc3d752312 --- dm/BUILD.gn | 6 ------ dm/src/display.cpp | 12 +++++++----- wm/BUILD.gn | 6 ------ 3 files changed, 7 insertions(+), 17 deletions(-) diff --git a/dm/BUILD.gn b/dm/BUILD.gn index 3e95f52bca..b0ee459bf6 100644 --- a/dm/BUILD.gn +++ b/dm/BUILD.gn @@ -18,12 +18,6 @@ config("libdm_private_config") { "include", "../dmserver/include", ] - - if (defined(product_name) && - (product_name == "rk3566" || product_name == "rk3568" || - product_name == "Hi3516DV300" || product_name == "watchos")) { - defines = [ "PRODUCT_RK" ] - } } config("libdm_public_config") { diff --git a/dm/src/display.cpp b/dm/src/display.cpp index f668f66b65..6f970bda41 100644 --- a/dm/src/display.cpp +++ b/dm/src/display.cpp @@ -21,6 +21,7 @@ namespace OHOS::Rosen { namespace { constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "Display"}; + constexpr int32_t LARGE_SCREEN_WIDTH = 2560; } class Display::Impl : public RefBase { public: @@ -102,10 +103,11 @@ void Display::UpdateDisplayInfo() const float Display::GetVirtualPixelRatio() const { // TODO: Should get from DMS -#ifdef PRODUCT_RK - return 1.0f; -#else - return 2.0f; -#endif + if ((pImpl_->GetDisplayInfo()->GetWidth() == LARGE_SCREEN_WIDTH) + || (pImpl_->GetDisplayInfo()->GetHeight() == LARGE_SCREEN_WIDTH)) { + return 2.0f; + } else { + return 1.0f; + } } } // namespace OHOS::Rosen \ No newline at end of file diff --git a/wm/BUILD.gn b/wm/BUILD.gn index 0cd6a56809..8f8e1d4c22 100644 --- a/wm/BUILD.gn +++ b/wm/BUILD.gn @@ -27,12 +27,6 @@ config("libwm_private_config") { "//third_party/jsoncpp/include", "//third_party/json/include", ] - - if (defined(product_name) && - (product_name == "rk3566" || product_name == "rk3568" || - product_name == "Hi3516DV300" || product_name == "watchos")) { - defines = [ "PRODUCT_RK" ] - } } config("libwm_public_config") { -- Gitee From 82b5242d0db95ed94aebabc4781e7b39433f6fdf Mon Sep 17 00:00:00 2001 From: xingyanan Date: Tue, 1 Mar 2022 11:34:18 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=80=9A=E7=9F=A5ace?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E6=A8=A1=E5=BC=8Fbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xingyanan Change-Id: I21827624de09115459203b8fc3dc85390fb41f06 Signed-off-by: xingyanan --- wm/src/window_impl.cpp | 19 +++++-------------- wmserver/src/window_controller.cpp | 1 + 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/wm/src/window_impl.cpp b/wm/src/window_impl.cpp index 63363610ae..dce97e1887 100644 --- a/wm/src/window_impl.cpp +++ b/wm/src/window_impl.cpp @@ -264,23 +264,14 @@ WMError WindowImpl::SetWindowMode(WindowMode mode) return WMError::WM_ERROR_INVALID_WINDOW; } if (state_ == WindowState::STATE_CREATED || state_ == WindowState::STATE_HIDDEN) { - property_->SetWindowMode(mode); + UpdateMode(mode); } else if (state_ == WindowState::STATE_SHOWN) { - property_->SetWindowMode(mode); WMError ret = SingletonContainer::Get().SetWindowMode(property_->GetWindowId(), mode); - if (ret == WMError::WM_OK) { - WLOGFD("notify window mode changed"); - for (auto& listener : windowChangeListeners_) { - if (listener != nullptr) { - listener->OnModeChange(mode); - } - } - if (uiContent_ != nullptr) { - uiContent_->UpdateWindowMode(mode); - WLOGFI("notify uiContent window mode change end"); - } + if (ret != WMError::WM_OK) { + return ret; } - return ret; + // set client window mode if success. + UpdateMode(mode); } if (property_->GetWindowMode() != mode) { WLOGFE("set window mode filed! id: %{public}d", property_->GetWindowId()); diff --git a/wmserver/src/window_controller.cpp b/wmserver/src/window_controller.cpp index 5f50772945..0ae5b2b345 100644 --- a/wmserver/src/window_controller.cpp +++ b/wmserver/src/window_controller.cpp @@ -214,6 +214,7 @@ WMError WindowController::SetWindowMode(uint32_t windowId, WindowMode dstMode) WLOGFE("Set window mode failed, update node failed"); return res; } + node->GetWindowToken()->UpdateWindowMode(node->GetWindowMode()); FlushWindowInfo(windowId); return WMError::WM_OK; } -- Gitee From 64880596819ec8188b96b35369c9eb4f4dccf125 Mon Sep 17 00:00:00 2001 From: xiaojianfeng Date: Tue, 1 Mar 2022 21:46:03 +0800 Subject: [PATCH 9/9] fix makeExpand bug and add screen manager test Signed-off-by: xiaojianfeng Change-Id: I09b0e1e2b65d081e06483b0b5e806d531451b6e9 --- dm/include/display_manager_adapter.h | 2 +- dm/src/display_manager_adapter.cpp | 4 +- dm/src/screen_manager.cpp | 7 +- dm/test/systemtest/screen_manager_test.cpp | 193 +++++++++++++++++- dmserver/include/abstract_screen_controller.h | 2 +- dmserver/include/display_manager_interface.h | 2 +- dmserver/include/display_manager_proxy.h | 2 +- dmserver/include/display_manager_service.h | 2 +- dmserver/src/abstract_screen_controller.cpp | 6 +- dmserver/src/display_manager_proxy.cpp | 2 +- dmserver/src/display_manager_service.cpp | 4 +- dmserver/src/display_manager_stub.cpp | 2 +- interfaces/innerkits/dm/screen_manager.h | 1 + 13 files changed, 213 insertions(+), 16 deletions(-) diff --git a/dm/include/display_manager_adapter.h b/dm/include/display_manager_adapter.h index e7e6868a95..ed76222ee8 100644 --- a/dm/include/display_manager_adapter.h +++ b/dm/include/display_manager_adapter.h @@ -82,7 +82,7 @@ public: virtual std::vector> GetAllScreenInfos(); virtual ScreenId MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId); virtual ScreenId MakeExpand(std::vector screenId, std::vector startPoint); - virtual void CancelMakeMirrorOrExpand(std::vector); + virtual void RemoveVirtualScreenFromGroup(std::vector); virtual bool SetScreenActiveMode(ScreenId screenId, uint32_t modeId); virtual sptr GetScreenInfo(ScreenId screenId); diff --git a/dm/src/display_manager_adapter.cpp b/dm/src/display_manager_adapter.cpp index df45774168..b2d5f2dfdc 100644 --- a/dm/src/display_manager_adapter.cpp +++ b/dm/src/display_manager_adapter.cpp @@ -378,12 +378,12 @@ ScreenId ScreenManagerAdapter::MakeExpand(std::vector screenId, std::v return displayManagerServiceProxy_->MakeExpand(screenId, startPoint); } -void ScreenManagerAdapter::CancelMakeMirrorOrExpand(std::vector screens) +void ScreenManagerAdapter::RemoveVirtualScreenFromGroup(std::vector screens) { if (!InitDMSProxy()) { return; } - displayManagerServiceProxy_->CancelMakeMirrorOrExpand(screens); + displayManagerServiceProxy_->RemoveVirtualScreenFromGroup(screens); } bool ScreenManagerAdapter::SetScreenActiveMode(ScreenId screenId, uint32_t modeId) diff --git a/dm/src/screen_manager.cpp b/dm/src/screen_manager.cpp index 7c73f06567..e0b020af35 100644 --- a/dm/src/screen_manager.cpp +++ b/dm/src/screen_manager.cpp @@ -336,9 +336,14 @@ ScreenId ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector return group; } +void ScreenManager::RemoveVirtualScreenFromGroup(std::vector screens) +{ + SingletonContainer::Get().RemoveVirtualScreenFromGroup(screens); +} + void ScreenManager::CancelMakeMirrorOrExpand(std::vector screens) { - return SingletonContainer::Get().CancelMakeMirrorOrExpand(screens); + RemoveVirtualScreenFromGroup(screens); } ScreenId ScreenManager::CreateVirtualScreen(VirtualScreenOption option) diff --git a/dm/test/systemtest/screen_manager_test.cpp b/dm/test/systemtest/screen_manager_test.cpp index 6ffbf29515..f40717c600 100644 --- a/dm/test/systemtest/screen_manager_test.cpp +++ b/dm/test/systemtest/screen_manager_test.cpp @@ -21,11 +21,15 @@ #include "screen.h" #include "window.h" #include "window_option.h" +#include "window_manager_hilog.h" using namespace testing; using namespace testing::ext; namespace OHOS { namespace Rosen { +namespace { + constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "ScreenManagerTest"}; +} class ScreenManagerTest : public testing::Test { public: static void SetUpTestCase(); @@ -55,14 +59,17 @@ class ScreenChangeListener : public ScreenManager::IScreenListener { public: virtual void OnConnect(ScreenId screenId) override { + WLOGFI("OnConnect, screenId:%{public}" PRIu64"", screenId); connectFuture_.SetValue(screenId); } virtual void OnDisconnect(ScreenId screenId) override { + WLOGFI("OnDisconnect, screenId:%{public}" PRIu64"", screenId); disconnectFuture_.SetValue(screenId); } virtual void OnChange(ScreenId screenId) override { + WLOGFI("OnChange, screenId:%{public}" PRIu64"", screenId); changeFuture_.SetValue(screenId); } RunnableFuture connectFuture_; @@ -468,10 +475,194 @@ HWTEST_F(ScreenManagerTest, ScreenManager11, Function | MediumTest | Level2) /** * @tc.name: ScreenManager12 - * @tc.desc: Screen orientatin. + * @tc.desc: Create a virtual screen as expansion of default screen cancel Make mirror, and destroy virtual screen * @tc.type: FUNC */ HWTEST_F(ScreenManagerTest, ScreenManager12, Function | MediumTest | Level2) +{ + DisplayTestUtils utils; + ASSERT_TRUE(utils.CreateSurface()); + defaultOption_.surface_ = utils.psurface_; + defaultOption_.isForShot_ = false; + sptr screenListener = new ScreenChangeListener(); + sptr screenGroupChangeListener = new ScreenGroupChangeListener(); + ScreenManager::GetInstance().RegisterScreenListener(screenListener); + ScreenManager::GetInstance().RegisterScreenGroupListener(screenGroupChangeListener); + ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); + ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId); + ScreenId screenId = screenListener->connectFuture_.GetResult(TIME_OUT); + screenListener->connectFuture_.Reset(); + ASSERT_EQ(virtualScreenId, screenId); + + std::vector mirrorIds; + mirrorIds.push_back(virtualScreenId); + ScreenManager::GetInstance().MakeMirror(defaultScreenId_, mirrorIds); + auto pair = screenGroupChangeListener->changeFuture_.GetResult(TIME_OUT); + screenGroupChangeListener->changeFuture_.Reset(); + ASSERT_EQ(virtualScreenId, pair.first); + ASSERT_EQ(ScreenGroupChangeEvent::ADD_TO_GROUP, pair.second); + auto screen = ScreenManager::GetInstance().GetScreenById(virtualScreenId); + ASSERT_EQ(virtualScreenId, screen->GetId()); + ASSERT_NE(SCREEN_ID_INVALID, screen->GetParentId()); + + ScreenManager::GetInstance().RemoveVirtualScreenFromGroup(mirrorIds); + pair = screenGroupChangeListener->changeFuture_.GetResult(TIME_OUT); + screenGroupChangeListener->changeFuture_.Reset(); + ASSERT_EQ(virtualScreenId, pair.first); + ASSERT_EQ(ScreenGroupChangeEvent::REMOVE_FROM_GROUP, pair.second); + + ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId)); + screenId = screenListener->disconnectFuture_.GetResult(TIME_OUT); + screenListener->disconnectFuture_.Reset(); + ASSERT_EQ(virtualScreenId, screenId); + ScreenManager::GetInstance().UnregisterScreenListener(screenListener); + ScreenManager::GetInstance().UnregisterScreenGroupListener(screenGroupChangeListener); +} + +/** + * @tc.name: ScreenManager13 + * @tc.desc: Create a virtual screen as expansion of default screen cancel MakeExpand, and destroy virtual screen + * @tc.type: FUNC + */ +HWTEST_F(ScreenManagerTest, ScreenManager13, Function | MediumTest | Level2) +{ + DisplayTestUtils utils; + ASSERT_TRUE(utils.CreateSurface()); + defaultOption_.surface_ = utils.psurface_; + defaultOption_.isForShot_ = false; + sptr screenListener = new ScreenChangeListener(); + sptr screenGroupChangeListener = new ScreenGroupChangeListener(); + ScreenManager::GetInstance().RegisterScreenListener(screenListener); + ScreenManager::GetInstance().RegisterScreenGroupListener(screenGroupChangeListener); + ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); + ScreenId screenId = screenListener->connectFuture_.GetResult(TIME_OUT); + screenListener->connectFuture_.Reset(); + ASSERT_EQ(virtualScreenId, screenId); + + std::vector> screens = ScreenManager::GetInstance().GetAllScreens(); + sptr DefaultScreen = screens.front(); + std::vector options = {{DefaultScreen->GetId(), 0, 0}, {virtualScreenId, defaultWidth_, 0}}; + ScreenId expansionId = ScreenManager::GetInstance().MakeExpand(options); + ASSERT_NE(SCREEN_ID_INVALID, expansionId); + auto pair = screenGroupChangeListener->changeFuture_.GetResult(TIME_OUT); + screenGroupChangeListener->changeFuture_.Reset(); + ASSERT_EQ(virtualScreenId, pair.first); + ASSERT_EQ(ScreenGroupChangeEvent::ADD_TO_GROUP, pair.second); + + std::vector cancelScreens; + cancelScreens.emplace_back(virtualScreenId); + ScreenManager::GetInstance().RemoveVirtualScreenFromGroup(cancelScreens); + pair = screenGroupChangeListener->changeFuture_.GetResult(TIME_OUT); + screenGroupChangeListener->changeFuture_.Reset(); + ASSERT_EQ(virtualScreenId, pair.first); + ASSERT_EQ(ScreenGroupChangeEvent::REMOVE_FROM_GROUP, pair.second); + + ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId)); + screenId = screenListener->disconnectFuture_.GetResult(TIME_OUT); + screenListener->disconnectFuture_.Reset(); + ASSERT_EQ(virtualScreenId, screenId); + ScreenManager::GetInstance().UnregisterScreenListener(screenListener); + ScreenManager::GetInstance().UnregisterScreenGroupListener(screenGroupChangeListener); +} + +/** + * @tc.name: ScreenManager14 + * @tc.desc: Create a virtual screen, make expand to make mirror, and destroy virtual screen + * @tc.type: FUNC + */ +HWTEST_F(ScreenManagerTest, ScreenManager14, Function | MediumTest | Level2) +{ + DisplayTestUtils utils; + ASSERT_TRUE(utils.CreateSurface()); + defaultOption_.surface_ = utils.psurface_; + defaultOption_.isForShot_ = false; + sptr screenListener = new ScreenChangeListener(); + sptr screenGroupChangeListener = new ScreenGroupChangeListener(); + ScreenManager::GetInstance().RegisterScreenListener(screenListener); + ScreenManager::GetInstance().RegisterScreenGroupListener(screenGroupChangeListener); + ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); + ScreenId screenId = screenListener->connectFuture_.GetResult(TIME_OUT); + screenListener->connectFuture_.Reset(); + ASSERT_EQ(virtualScreenId, screenId); + + std::vector> screens = ScreenManager::GetInstance().GetAllScreens(); + sptr DefaultScreen = screens.front(); + std::vector options = {{DefaultScreen->GetId(), 0, 0}, {virtualScreenId, defaultWidth_, 0}}; + ScreenId expansionId = ScreenManager::GetInstance().MakeExpand(options); + ASSERT_NE(SCREEN_ID_INVALID, expansionId); + auto pair = screenGroupChangeListener->changeFuture_.GetResult(TIME_OUT); + screenGroupChangeListener->changeFuture_.Reset(); + ASSERT_EQ(virtualScreenId, pair.first); + ASSERT_EQ(ScreenGroupChangeEvent::ADD_TO_GROUP, pair.second); + + std::vector mirrorScreens; + mirrorScreens.emplace_back(virtualScreenId); + ScreenManager::GetInstance().MakeMirror(defaultScreenId_, mirrorScreens); + pair = screenGroupChangeListener->changeFuture_.GetResult(TIME_OUT); + screenGroupChangeListener->changeFuture_.Reset(); + ASSERT_EQ(virtualScreenId, pair.first); + ASSERT_EQ(ScreenGroupChangeEvent::CHANGE_GROUP, pair.second); + + ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId)); + screenId = screenListener->disconnectFuture_.GetResult(TIME_OUT); + screenListener->disconnectFuture_.Reset(); + ASSERT_EQ(virtualScreenId, screenId); + ScreenManager::GetInstance().UnregisterScreenListener(screenListener); + ScreenManager::GetInstance().UnregisterScreenGroupListener(screenGroupChangeListener); +} + +/** + * @tc.name: ScreenManager15 + * @tc.desc: Create a virtual screen, make mirror to make expand, and destroy virtual screen + * @tc.type: FUNC + */ +HWTEST_F(ScreenManagerTest, ScreenManager15, Function | MediumTest | Level2) +{ + DisplayTestUtils utils; + ASSERT_TRUE(utils.CreateSurface()); + defaultOption_.surface_ = utils.psurface_; + defaultOption_.isForShot_ = false; + sptr screenListener = new ScreenChangeListener(); + sptr screenGroupChangeListener = new ScreenGroupChangeListener(); + ScreenManager::GetInstance().RegisterScreenListener(screenListener); + ScreenManager::GetInstance().RegisterScreenGroupListener(screenGroupChangeListener); + ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); + ScreenId screenId = screenListener->connectFuture_.GetResult(TIME_OUT); + screenListener->connectFuture_.Reset(); + ASSERT_EQ(virtualScreenId, screenId); + + std::vector mirrorScreens; + mirrorScreens.emplace_back(virtualScreenId); + ScreenManager::GetInstance().MakeMirror(defaultScreenId_, mirrorScreens); + auto pair = screenGroupChangeListener->changeFuture_.GetResult(TIME_OUT); + screenGroupChangeListener->changeFuture_.Reset(); + ASSERT_EQ(virtualScreenId, pair.first); + ASSERT_EQ(ScreenGroupChangeEvent::ADD_TO_GROUP, pair.second); + + std::vector> screens = ScreenManager::GetInstance().GetAllScreens(); + sptr DefaultScreen = screens.front(); + std::vector options = {{DefaultScreen->GetId(), 0, 0}, {virtualScreenId, defaultWidth_, 0}}; + ScreenId expansionId = ScreenManager::GetInstance().MakeExpand(options); + ASSERT_NE(SCREEN_ID_INVALID, expansionId); + pair = screenGroupChangeListener->changeFuture_.GetResult(TIME_OUT); + screenGroupChangeListener->changeFuture_.Reset(); + ASSERT_EQ(virtualScreenId, pair.first); + ASSERT_EQ(ScreenGroupChangeEvent::CHANGE_GROUP, pair.second); + + ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId)); + screenId = screenListener->disconnectFuture_.GetResult(TIME_OUT); + screenListener->disconnectFuture_.Reset(); + ASSERT_EQ(virtualScreenId, screenId); + ScreenManager::GetInstance().UnregisterScreenListener(screenListener); + ScreenManager::GetInstance().UnregisterScreenGroupListener(screenGroupChangeListener); +} + +/** + * @tc.name: ScreenManager16 + * @tc.desc: Screen orientation. + * @tc.type: FUNC + */ +HWTEST_F(ScreenManagerTest, ScreenManager16, Function | MediumTest | Level2) { auto screens = ScreenManager::GetInstance().GetAllScreens(); auto display = DisplayManager::GetInstance().GetDefaultDisplay(); diff --git a/dmserver/include/abstract_screen_controller.h b/dmserver/include/abstract_screen_controller.h index cd14a942c3..937c238c56 100644 --- a/dmserver/include/abstract_screen_controller.h +++ b/dmserver/include/abstract_screen_controller.h @@ -64,7 +64,7 @@ public: void UpdateRSTree(ScreenId dmsScreenId, std::shared_ptr& surfaceNode, bool isAdd); bool MakeMirror(ScreenId, std::vector screens); bool MakeExpand(std::vector screenIds, std::vector startPoints); - void CancelMakeMirrorOrExpand(std::vector screens); + void RemoveVirtualScreenFromGroup(std::vector screens); void DumpScreenInfo() const; void DumpScreenGroupInfo() const; diff --git a/dmserver/include/display_manager_interface.h b/dmserver/include/display_manager_interface.h index 0af1b4985d..620c40e3c1 100644 --- a/dmserver/include/display_manager_interface.h +++ b/dmserver/include/display_manager_interface.h @@ -106,7 +106,7 @@ public: virtual std::vector> GetAllScreenInfos() = 0; virtual ScreenId MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId) = 0; virtual ScreenId MakeExpand(std::vector screenId, std::vector startPoint) = 0; - virtual void CancelMakeMirrorOrExpand(std::vector screens) = 0; + virtual void RemoveVirtualScreenFromGroup(std::vector screens) = 0; virtual bool SetScreenActiveMode(ScreenId screenId, uint32_t modeId) = 0; }; } // namespace OHOS::Rosen diff --git a/dmserver/include/display_manager_proxy.h b/dmserver/include/display_manager_proxy.h index 52da1b90f3..6db4a7a4ef 100644 --- a/dmserver/include/display_manager_proxy.h +++ b/dmserver/include/display_manager_proxy.h @@ -67,7 +67,7 @@ public: sptr GetScreenGroupInfoById(ScreenId screenId) override; std::vector> GetAllScreenInfos() override; ScreenId MakeExpand(std::vector screenId, std::vector startPoint) override; - void CancelMakeMirrorOrExpand(std::vector screens) override; + void RemoveVirtualScreenFromGroup(std::vector screens) override; bool SetScreenActiveMode(ScreenId screenId, uint32_t modeId) override; private: diff --git a/dmserver/include/display_manager_service.h b/dmserver/include/display_manager_service.h index f63bd93085..9b77df957d 100644 --- a/dmserver/include/display_manager_service.h +++ b/dmserver/include/display_manager_service.h @@ -86,7 +86,7 @@ public: sptr GetDisplayByScreen(ScreenId screenId) const; ScreenId MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId) override; ScreenId MakeExpand(std::vector screenId, std::vector startPoint) override; - void CancelMakeMirrorOrExpand(std::vector screens) override; + void RemoveVirtualScreenFromGroup(std::vector screens) override; sptr GetScreenInfoById(ScreenId screenId) override; sptr GetScreenGroupInfoById(ScreenId screenId) override; std::vector> GetAllScreenInfos() override; diff --git a/dmserver/src/abstract_screen_controller.cpp b/dmserver/src/abstract_screen_controller.cpp index d0ee1b7cd9..6e1d288937 100644 --- a/dmserver/src/abstract_screen_controller.cpp +++ b/dmserver/src/abstract_screen_controller.cpp @@ -789,13 +789,13 @@ bool AbstractScreenController::MakeExpand(std::vector screenIds, std:: if (group == nullptr) { return false; } - bool filterMirroredScreen = group->combination_ == ScreenCombination::SCREEN_EXPAND; - ChangeScreenGroup(group, screenIds, startPoints, filterMirroredScreen, ScreenCombination::SCREEN_MIRROR); + bool filterExpandScreen = group->combination_ == ScreenCombination::SCREEN_EXPAND; + ChangeScreenGroup(group, screenIds, startPoints, filterExpandScreen, ScreenCombination::SCREEN_EXPAND); WLOGFI("MakeExpand success"); return true; } -void AbstractScreenController::CancelMakeMirrorOrExpand(std::vector screens) +void AbstractScreenController::RemoveVirtualScreenFromGroup(std::vector screens) { if (screens.empty()) { return; diff --git a/dmserver/src/display_manager_proxy.cpp b/dmserver/src/display_manager_proxy.cpp index a4cb9b4a5d..d2f60c2fa4 100644 --- a/dmserver/src/display_manager_proxy.cpp +++ b/dmserver/src/display_manager_proxy.cpp @@ -852,7 +852,7 @@ ScreenId DisplayManagerProxy::MakeExpand(std::vector screenId, std::ve return static_cast(reply.ReadUint64()); } -void DisplayManagerProxy::CancelMakeMirrorOrExpand(std::vector screens) +void DisplayManagerProxy::RemoveVirtualScreenFromGroup(std::vector screens) { sptr remote = Remote(); if (remote == nullptr) { diff --git a/dmserver/src/display_manager_service.cpp b/dmserver/src/display_manager_service.cpp index 604999222c..0df7222e95 100644 --- a/dmserver/src/display_manager_service.cpp +++ b/dmserver/src/display_manager_service.cpp @@ -433,9 +433,9 @@ ScreenId DisplayManagerService::MakeMirror(ScreenId mainScreenId, std::vectorgroupDmsId_; } -void DisplayManagerService::CancelMakeMirrorOrExpand(std::vector screens) +void DisplayManagerService::RemoveVirtualScreenFromGroup(std::vector screens) { - abstractScreenController_->CancelMakeMirrorOrExpand(screens); + abstractScreenController_->RemoveVirtualScreenFromGroup(screens); } void DisplayManagerService::UpdateRSTree(DisplayId displayId, std::shared_ptr& surfaceNode, diff --git a/dmserver/src/display_manager_stub.cpp b/dmserver/src/display_manager_stub.cpp index 3a3f0742d3..243e4fe258 100644 --- a/dmserver/src/display_manager_stub.cpp +++ b/dmserver/src/display_manager_stub.cpp @@ -229,7 +229,7 @@ int32_t DisplayManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, WLOGE("fail to receive screens in stub."); break; } - CancelMakeMirrorOrExpand(screenId); + RemoveVirtualScreenFromGroup(screenId); break; } case TRANS_ID_SET_SCREEN_ACTIVE_MODE: { diff --git a/interfaces/innerkits/dm/screen_manager.h b/interfaces/innerkits/dm/screen_manager.h index 75159ee3c9..57ac01eb8e 100644 --- a/interfaces/innerkits/dm/screen_manager.h +++ b/interfaces/innerkits/dm/screen_manager.h @@ -49,6 +49,7 @@ public: bool UnregisterScreenGroupListener(sptr listener); ScreenId MakeExpand(const std::vector& options); ScreenId MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId); + void RemoveVirtualScreenFromGroup(std::vector screens); void CancelMakeMirrorOrExpand(std::vector screens); ScreenId CreateVirtualScreen(VirtualScreenOption option); DMError DestroyVirtualScreen(ScreenId screenId); -- Gitee