1 /*
2 * Copyright (c) 2023 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 "session_manager/include/screen_session_manager_lite.h"
17 #include <system_ability_definition.h>
18 #include <iservice_registry.h>
19 #include <transaction/rs_interfaces.h>
20 #include "window_manager_hilog.h"
21
22 namespace OHOS::Rosen {
23 namespace {
24 std::recursive_mutex g_instanceMutex;
25 } // namespace
26
~ScreenSessionManagerLite()27 ScreenSessionManagerLite::~ScreenSessionManagerLite()
28 {
29 TLOGD(WmsLogTag::DMS, "ScreenSessionManagerLite destroy");
30 std::lock_guard<std::recursive_mutex> lock(mutex_);
31 destroyed_ = true;
32 }
33
ConnectToServer()34 void ScreenSessionManagerLite::ConnectToServer()
35 {
36 if (screenSessionManager_) {
37 return;
38 }
39 auto systemAbilityMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
40 if (!systemAbilityMgr) {
41 TLOGE(WmsLogTag::DMS, "Failed to get system ability mgr");
42 return;
43 }
44
45 auto remoteObject = systemAbilityMgr->GetSystemAbility(DISPLAY_MANAGER_SERVICE_SA_ID);
46 if (!remoteObject) {
47 TLOGE(WmsLogTag::DMS, "Failed to get display manager service");
48 return;
49 }
50
51 screenSessionManager_ = iface_cast<IScreenSessionManager>(remoteObject);
52 if (screenSessionManager_) {
53 ssmDeath_ = new (std::nothrow) ScreenSMDeathRecipient();
54 if (!ssmDeath_) {
55 TLOGE(WmsLogTag::DMS, "Failed to create death Recipient ptr WMSDeathRecipient");
56 return;
57 }
58 if (remoteObject->IsProxyObject() && !remoteObject->AddDeathRecipient(ssmDeath_)) {
59 TLOGE(WmsLogTag::DMS, "Failed to add death recipient");
60 return;
61 }
62 }
63 if (!screenSessionManager_) {
64 TLOGE(WmsLogTag::DMS, "Failed to get screen session manager proxy");
65 return;
66 }
67 }
68
GetInstance()69 ScreenSessionManagerLite& ScreenSessionManagerLite::GetInstance()
70 {
71 std::lock_guard<std::recursive_mutex> lock(g_instanceMutex);
72 static ScreenSessionManagerLite* instance = nullptr;
73 if (instance == nullptr) {
74 instance = new ScreenSessionManagerLite();
75 }
76 return *instance;
77 }
78
RegisterDisplayManagerAgent(const sptr<IDisplayManagerAgent> & displayManagerAgent,DisplayManagerAgentType type)79 DMError ScreenSessionManagerLite::RegisterDisplayManagerAgent(
80 const sptr<IDisplayManagerAgent>& displayManagerAgent, DisplayManagerAgentType type)
81 {
82 ConnectToServer();
83 if (screenSessionManager_) {
84 return screenSessionManager_->RegisterDisplayManagerAgent(displayManagerAgent, type);
85 }
86 return DMError::DM_ERROR_NULLPTR;
87 }
88
UnregisterDisplayManagerAgent(const sptr<IDisplayManagerAgent> & displayManagerAgent,DisplayManagerAgentType type)89 DMError ScreenSessionManagerLite::UnregisterDisplayManagerAgent(
90 const sptr<IDisplayManagerAgent>& displayManagerAgent, DisplayManagerAgentType type)
91 {
92 ConnectToServer();
93 if (screenSessionManager_) {
94 return screenSessionManager_->UnregisterDisplayManagerAgent(displayManagerAgent, type);
95 }
96 return DMError::DM_ERROR_NULLPTR;
97 }
98
GetFoldDisplayMode()99 FoldDisplayMode ScreenSessionManagerLite::GetFoldDisplayMode()
100 {
101 ConnectToServer();
102 if (screenSessionManager_) {
103 return screenSessionManager_->GetFoldDisplayMode();
104 }
105 return FoldDisplayMode::UNKNOWN;
106 }
107
SetFoldDisplayMode(const FoldDisplayMode displayMode)108 void ScreenSessionManagerLite::SetFoldDisplayMode(const FoldDisplayMode displayMode)
109 {
110 ConnectToServer();
111 if (screenSessionManager_) {
112 screenSessionManager_->SetFoldDisplayMode(displayMode);
113 }
114 }
115
IsFoldable()116 bool ScreenSessionManagerLite::IsFoldable()
117 {
118 ConnectToServer();
119 if (screenSessionManager_) {
120 return screenSessionManager_->IsFoldable();
121 }
122 return false;
123 }
124
GetFoldStatus()125 FoldStatus ScreenSessionManagerLite::GetFoldStatus()
126 {
127 ConnectToServer();
128 if (screenSessionManager_) {
129 return screenSessionManager_->GetFoldStatus();
130 }
131 return FoldStatus::UNKNOWN;
132 }
133
GetDefaultDisplayInfo()134 sptr<DisplayInfo> ScreenSessionManagerLite::GetDefaultDisplayInfo()
135 {
136 ConnectToServer();
137 if (screenSessionManager_) {
138 return screenSessionManager_->GetDefaultDisplayInfo();
139 }
140 return nullptr;
141 }
142
GetDisplayInfoById(DisplayId displayId)143 sptr<DisplayInfo> ScreenSessionManagerLite::GetDisplayInfoById(DisplayId displayId)
144 {
145 ConnectToServer();
146 if (screenSessionManager_) {
147 return screenSessionManager_->GetDisplayInfoById(displayId);
148 }
149 return nullptr;
150 }
151
GetCutoutInfo(DisplayId displayId)152 sptr<CutoutInfo> ScreenSessionManagerLite::GetCutoutInfo(DisplayId displayId)
153 {
154 ConnectToServer();
155 if (screenSessionManager_) {
156 return screenSessionManager_->GetCutoutInfo(displayId);
157 }
158 return nullptr;
159 }
160
Clear()161 void ScreenSessionManagerLite::Clear()
162 {
163 std::lock_guard<std::recursive_mutex> lock(mutex_);
164 if ((screenSessionManager_ != nullptr) && (screenSessionManager_->AsObject() != nullptr)) {
165 screenSessionManager_->AsObject()->RemoveDeathRecipient(ssmDeath_);
166 }
167 if (destroyed_) {
168 TLOGD(WmsLogTag::DMS, "Already destroyed");
169 return;
170 }
171 screenSessionManager_ = nullptr;
172 }
173
OnRemoteDied(const wptr<IRemoteObject> & wptrDeath)174 void ScreenSMDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& wptrDeath)
175 {
176 if (wptrDeath == nullptr) {
177 TLOGE(WmsLogTag::DMS, "ScreenSMDeathRecipient wptrDeath is null");
178 return;
179 }
180
181 sptr<IRemoteObject> object = wptrDeath.promote();
182 if (!object) {
183 TLOGE(WmsLogTag::DMS, "ScreenSMDeathRecipient object is null");
184 return;
185 }
186 TLOGI(WmsLogTag::DMS, "ScreenSessionManagerLite OnRemoteDied");
187 ScreenSessionManagerLite::GetInstance().Clear();
188 }
189 } // namespace OHOS::Rosen
190