已合并
fix(dms): sync client available area cache on UpdateAvailableArea #19520
fix(dms): sync client available area cache on UpdateAvailableArea #19520
已合并
mobhot创建于 6月30日
5 个文件变更+158-0
@@ -655,6 +655,10 @@ void ScreenSessionManagerClient::UpdateAvailableArea(ScreenId screenId, DMRect a
655 TLOGE(WmsLogTag::DMS, "screenSessionManager_ is null");655 TLOGE(WmsLogTag::DMS, "screenSessionManager_ is null");
656 return;656 return;
657 }657 }
658+ auto screenSession = GetScreenSession(screenId);
659+ if (screenSession != nullptr) {
660+ screenSession->SetAvailableArea(area);
661+ }
658 screenSessionManager_->UpdateAvailableArea(screenId, area);662 screenSessionManager_->UpdateAvailableArea(screenId, area);
659}663}
660 664 
@@ -664,6 +668,10 @@ void ScreenSessionManagerClient::UpdateSuperFoldAvailableArea(ScreenId screenId,
664 TLOGE(WmsLogTag::DMS, "screenSessionManager_ is null");668 TLOGE(WmsLogTag::DMS, "screenSessionManager_ is null");
665 return;669 return;
666 }670 }
671+ auto screenSession = GetScreenSession(screenId);
672+ if (screenSession != nullptr) {
673+ screenSession->SetAvailableArea(bArea);
674+ }
667 screenSessionManager_->UpdateSuperFoldAvailableArea(screenId, bArea, cArea);675 screenSessionManager_->UpdateSuperFoldAvailableArea(screenId, bArea, cArea);
668}676}
669 677 
@@ -3496,6 +3496,9 @@ void ScreenSession::ProcPropertyChange(ScreenProperty& screenProperty, const Scr
3496 screenProperty.SetDpiPhyBounds(eventPara.GetPhyWidth(), eventPara.GetPhyHeight());3496 screenProperty.SetDpiPhyBounds(eventPara.GetPhyWidth(), eventPara.GetPhyHeight());
3497 screenProperty.SetPhyBounds(eventPara.GetPhyBounds());3497 screenProperty.SetPhyBounds(eventPara.GetPhyBounds());
3498 screenProperty.SetBounds(eventPara.GetBounds());3498 screenProperty.SetBounds(eventPara.GetBounds());
3499+ DMRect calRect = DMRect{0, 0, eventPara.GetBounds().rect_.width_,
3500+ eventPara.GetBounds().rect_.height_};
wulong158
wulong158wulong1587月2日

这里不用换行

likedislike
mobhot
mobhot
7月2日 评论:
3501+ screenProperty.SetAvailableArea(calRect);
3499 if (FoldScreenStateInternel::IsSecondaryDisplayFoldDevice()) {3502 if (FoldScreenStateInternel::IsSecondaryDisplayFoldDevice()) {
3500 DisplayOrientation deviceOrientation =3503 DisplayOrientation deviceOrientation =
3501 CalcDeviceOrientation(screenProperty.GetScreenRotation(), eventPara.GetDisplayMode());3504 CalcDeviceOrientation(screenProperty.GetScreenRotation(), eventPara.GetDisplayMode());
@@ -43,6 +43,7 @@ group("unittest") {
43 deps += [43 deps += [
44 ":ws_screen_session_manager_proxy_test",44 ":ws_screen_session_manager_proxy_test",
45 ":ws_screen_session_manager_client_test",45 ":ws_screen_session_manager_client_test",
46+ ":ws_screen_session_manager_client_available_area_test",
46 ":ws_screen_session_manager_test",47 ":ws_screen_session_manager_test",
47 ":ws_screen_session_manager_test_two",48 ":ws_screen_session_manager_test_two",
48 ":ws_screen_session_manager_test_three",49 ":ws_screen_session_manager_test_three",
@@ -494,6 +495,26 @@ ohos_unittest("ws_screen_session_manager_client_test") {
494 external_deps += [ "init:libbegetutil" ]495 external_deps += [ "init:libbegetutil" ]
495}496}
496 497 
498+ohos_unittest("ws_screen_session_manager_client_available_area_test") {
499+ module_out_path = module_out_path
500+ 
501+ sources = [ "screen_session_manager_client_available_area_test.cpp" ]
502+ 
503+ sanitize = {
504+ cfi = true
505+ cfi_cross_dso = true
506+ debug = false
507+ }
508+ 
509+ deps = [
510+ ":ws_unittest_common",
511+ "${window_base_path}/window_scene/interfaces/innerkits:libwsutils",
512+ ]
513+ 
514+ external_deps = test_external_deps
515+ external_deps += [ "init:libbegetutil" ]
516+}
517+ 
497ohos_unittest("ws_screen_session_manager_lite_proxy_mock_test") {518ohos_unittest("ws_screen_session_manager_lite_proxy_mock_test") {
498 module_out_path = module_out_path519 module_out_path = module_out_path
499 520 
@@ -0,0 +1,91 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#include <gtest/gtest.h>
17+ 
18+#include "iremote_object_mocker.h"
19+#include "screen_session_manager_client.h"
20+#include "zidl/screen_session_manager_proxy.h"
21+ 
22+using namespace testing;
23+using namespace testing::ext;
24+ 
25+namespace OHOS {
26+namespace Rosen {
27+ 
28+class ScreenSessionManagerClientAvailableAreaTest : public testing::Test {
29+public:
30+ void SetUp() override;
31+ void TearDown() override;
32+ ScreenSessionManagerClient* client_ = nullptr;
33+};
34+ 
35+void ScreenSessionManagerClientAvailableAreaTest::SetUp()
36+{
37+ client_ = &ScreenSessionManagerClient::GetInstance();
38+ std::lock_guard<std::mutex> lock(client_->screenSessionMapMutex_);
39+ client_->screenSessionMap_.clear();
40+}
41+ 
42+void ScreenSessionManagerClientAvailableAreaTest::TearDown()
43+{
44+ std::lock_guard<std::mutex> lock(client_->screenSessionMapMutex_);
45+ client_->screenSessionMap_.clear();
46+ client_->screenSessionManager_ = nullptr;
47+ client_ = nullptr;
48+}
49+ 
50+namespace {
51+/**
52+ * @tc.name: UpdateAvailableArea_SyncLocalCache
53+ * @tc.desc: UpdateAvailableArea writes local ScreenSession cache before forwarding to server
54+ * @tc.type: FUNC
55+ */
56+HWTEST_F(ScreenSessionManagerClientAvailableAreaTest, UpdateAvailableArea_SyncLocalCache, TestSize.Level1)
57+{
58+ ScreenId screenId = 0;
59+ DMRect area { 10, 20, 100, 200 };
60+ sptr<IRemoteObject> iRemoteObjectMocker = new IRemoteObjectMocker();
61+ client_->screenSessionManager_ = new ScreenSessionManagerProxy(iRemoteObjectMocker);
62+ sptr<ScreenSession> screenSession = sptr<ScreenSession>::MakeSptr(screenId, ScreenProperty(), 0);
63+ client_->screenSessionMap_.emplace(screenId, screenSession);
64+ 
65+ client_->UpdateAvailableArea(screenId, area);
66+ 
67+ EXPECT_EQ(screenSession->GetScreenProperty().GetAvailableArea(), area);
68+}
69+ 
70+/**
71+ * @tc.name: UpdateSuperFoldAvailableArea_SyncLocalBArea
72+ * @tc.desc: UpdateSuperFoldAvailableArea writes local main screen cache with bArea
73+ * @tc.type: FUNC
74+ */
75+HWTEST_F(ScreenSessionManagerClientAvailableAreaTest, UpdateSuperFoldAvailableArea_SyncLocalBArea, TestSize.Level1)
76+{
77+ ScreenId screenId = 0;
78+ DMRect bArea { 1, 2, 100, 200 };
79+ DMRect cArea { 3, 4, 50, 60 };
80+ sptr<IRemoteObject> iRemoteObjectMocker = new IRemoteObjectMocker();
81+ client_->screenSessionManager_ = new ScreenSessionManagerProxy(iRemoteObjectMocker);
82+ sptr<ScreenSession> screenSession = sptr<ScreenSession>::MakeSptr(screenId, ScreenProperty(), 0);
83+ client_->screenSessionMap_.emplace(screenId, screenSession);
84+ 
85+ client_->UpdateSuperFoldAvailableArea(screenId, bArea, cArea);
86+ 
87+ EXPECT_EQ(screenSession->GetScreenProperty().GetAvailableArea(), bArea);
88+}
89+} // namespace
90+} // namespace Rosen
91+} // namespace OHOS
@@ -5347,6 +5347,41 @@ HWTEST_F(ScreenSessionTest, ProcPropertyChange, TestSize.Level1)
5347 EXPECT_EQ(screenProperty.GetPropertyChangeReason(), eventPara.GetPropertyChangeReason());5347 EXPECT_EQ(screenProperty.GetPropertyChangeReason(), eventPara.GetPropertyChangeReason());
5348}5348}
5349 5349 
5350+/**
5351+ * @tc.name : ProcPropertyChange_SyncAvailableArea
5352+ * @tc.desc : ProcPropertyChange syncs availableArea from eventPara when it is initialized
5353+ * @tc.type: FUNC
5354+ */
5355+HWTEST_F(ScreenSessionTest, ProcPropertyChange_SyncAvailableArea, TestSize.Level1)
5356+{
5357+ ScreenId screenId = 10000;
5358+ ScreenProperty screenProperty;
5359+ ScreenProperty eventPara;
5360+ DMRect area { 10, 20, 300, 400 };
5361+ eventPara.SetAvailableArea(area);
5362+ sptr<ScreenSession> session = sptr<ScreenSession>::MakeSptr(screenId, screenProperty, screenId);
5363+ session->ProcPropertyChange(screenProperty, eventPara);
5364+ EXPECT_EQ(screenProperty.GetAvailableArea(), area);
5365+}
5366+ 
5367+/**
5368+ * @tc.name : ProcPropertyChange_PreserveUninitializedArea
5369+ * @tc.desc : ProcPropertyChange preserves local availableArea when eventPara's is uninitialized
5370+ * @tc.type: FUNC
5371+ */
5372+HWTEST_F(ScreenSessionTest, ProcPropertyChange_PreserveUninitializedArea, TestSize.Level1)
5373+{
5374+ ScreenId screenId = 10000;
5375+ ScreenProperty screenProperty;
5376+ DMRect localArea { 5, 5, 200, 200 };
5377+ screenProperty.SetAvailableArea(localArea);
5378+ ScreenProperty eventPara;
5379+ eventPara.SetAvailableArea(DMRect { 0, 0, 0, 0 }); // uninitialized rect
5380+ sptr<ScreenSession> session = sptr<ScreenSession>::MakeSptr(screenId, screenProperty, screenId);
5381+ session->ProcPropertyChange(screenProperty, eventPara);
5382+ EXPECT_EQ(screenProperty.GetAvailableArea(), localArea);
5383+}
5384+ 
5350/**5385/**
5351 * @tc.name: SetBootingConnect5386 * @tc.name: SetBootingConnect
5352 * @tc.desc: SetBootingConnect5387 * @tc.desc: SetBootingConnect