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