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 "screen_setting_helper.h"
17
18 #include "window_manager_hilog.h"
19 #include "setting_provider.h"
20 #include "system_ability_definition.h"
21 #include "screen_session_manager/include/screen_session_manager.h"
22 #include <parameters.h>
23
24 namespace OHOS {
25 namespace Rosen {
26 sptr<SettingObserver> ScreenSettingHelper::dpiObserver_;
27 sptr<SettingObserver> ScreenSettingHelper::castObserver_;
28 sptr<SettingObserver> ScreenSettingHelper::rotationObserver_;
29 sptr<SettingObserver> ScreenSettingHelper::halfScreenObserver_;
30 sptr<SettingObserver> ScreenSettingHelper::screenSkipProtectedWindowObserver_;
31 sptr<SettingObserver> ScreenSettingHelper::wireCastObserver_;
32 constexpr int32_t PARAM_NUM_TEN = 10;
33 constexpr uint32_t EXPECT_SCREEN_MODE_SIZE = 2;
34 constexpr uint32_t EXPECT_RELATIVE_POSITION_SIZE = 3;
35 constexpr uint32_t VALID_MULTI_SCREEN_INFO_SIZE = 4;
36 constexpr uint32_t INDEX_SCREEN_INFO = 0;
37 constexpr uint32_t INDEX_SCREEN_MODE = 1;
38 constexpr uint32_t INDEX_FIRST_RELATIVE_POSITION = 2;
39 constexpr uint32_t INDEX_SECOND_RELATIVE_POSITION = 3;
40 constexpr uint32_t DATA_INDEX_ZERO = 0;
41 constexpr uint32_t DATA_INDEX_ONE = 1;
42 constexpr uint32_t DATA_INDEX_TWO = 2;
43 constexpr uint32_t SCREEN_MAIN_IN_DATA = 0;
44 constexpr uint32_t SCREEN_MIRROR_IN_DATA = 1;
45 constexpr uint32_t SCREEN_EXTEND_IN_DATA = 2;
46 const std::string SCREEN_SHAPE = system::GetParameter("const.window.screen_shape", "0:0");
47 const std::string SCREEN_SHARE_PROTECT_TABLE = "USER_SETTINGDATA_SECURE_";
48
RegisterSettingDpiObserver(SettingObserver::UpdateFunc func)49 void ScreenSettingHelper::RegisterSettingDpiObserver(SettingObserver::UpdateFunc func)
50 {
51 if (dpiObserver_) {
52 TLOGD(WmsLogTag::DMS, "setting dpi observer is registered");
53 return;
54 }
55 SettingProvider& provider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
56 dpiObserver_ = provider.CreateObserver(SETTING_DPI_KEY, func);
57 if (dpiObserver_ == nullptr) {
58 TLOGE(WmsLogTag::DMS, "create observer failed");
59 }
60 ErrCode ret = provider.RegisterObserver(dpiObserver_);
61 if (ret != ERR_OK) {
62 TLOGW(WmsLogTag::DMS, "failed, ret=%{public}d", ret);
63 dpiObserver_ = nullptr;
64 }
65 }
66
UnregisterSettingDpiObserver()67 void ScreenSettingHelper::UnregisterSettingDpiObserver()
68 {
69 if (dpiObserver_ == nullptr) {
70 TLOGD(WmsLogTag::DMS, "dpiObserver_ is nullptr");
71 return;
72 }
73 SettingProvider& provider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
74 ErrCode ret = provider.UnregisterObserver(dpiObserver_);
75 if (ret != ERR_OK) {
76 TLOGW(WmsLogTag::DMS, "failed, ret=%{public}d", ret);
77 }
78 dpiObserver_ = nullptr;
79 }
80
GetSettingDpi(uint32_t & dpi,const std::string & key)81 bool ScreenSettingHelper::GetSettingDpi(uint32_t& dpi, const std::string& key)
82 {
83 return GetSettingValue(dpi, key);
84 }
85
GetSettingValue(uint32_t & value,const std::string & key)86 bool ScreenSettingHelper::GetSettingValue(uint32_t& value, const std::string& key)
87 {
88 SettingProvider& settingData = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
89 int32_t getValue;
90 ErrCode ret = settingData.GetIntValue(key, getValue);
91 if (ret != ERR_OK) {
92 TLOGW(WmsLogTag::DMS, "failed, ret=%{public}d", ret);
93 return false;
94 }
95 value = static_cast<uint32_t>(getValue);
96 return true;
97 }
98
GetSettingValue(const std::string & key,std::string & value)99 bool ScreenSettingHelper::GetSettingValue(const std::string& key, std::string& value)
100 {
101 SettingProvider& provider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
102 std::string getValue = "";
103 ErrCode ret = provider.GetStringValue(key, getValue);
104 if (ret != ERR_OK) {
105 TLOGE(WmsLogTag::DMS, "failed, ret=%{public}d", ret);
106 return false;
107 }
108 value = getValue;
109 return true;
110 }
111
SetSettingValue(const std::string & key,uint32_t value)112 bool ScreenSettingHelper::SetSettingValue(const std::string& key, uint32_t value)
113 {
114 SettingProvider& provider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
115 ErrCode ret = provider.PutIntValue(key, value, false);
116 if (ret != ERR_OK) {
117 TLOGE(WmsLogTag::DMS, "failed, ret:%{public}d", ret);
118 return false;
119 }
120 return true;
121 }
122
SetSettingValue(const std::string & key,const std::string & value)123 bool ScreenSettingHelper::SetSettingValue(const std::string& key, const std::string& value)
124 {
125 SettingProvider& provider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
126 ErrCode ret = provider.PutStringValue(key, value, false);
127 if (ret != ERR_OK) {
128 TLOGE(WmsLogTag::DMS, "failed, ret:%{public}d", ret);
129 return false;
130 }
131 return true;
132 }
133
SetSettingDefaultDpi(uint32_t & dpi,const std::string & key)134 bool ScreenSettingHelper::SetSettingDefaultDpi(uint32_t& dpi, const std::string& key)
135 {
136 SettingProvider& provider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
137 ErrCode ret = provider.PutIntValue(key, dpi, false);
138 if (ret != ERR_OK) {
139 TLOGW(WmsLogTag::DMS, "put int value failed, ret=%{public}d", ret);
140 return false;
141 }
142 return true;
143 }
144
RegisterSettingCastObserver(SettingObserver::UpdateFunc func)145 void ScreenSettingHelper::RegisterSettingCastObserver(SettingObserver::UpdateFunc func)
146 {
147 if (castObserver_) {
148 TLOGD(WmsLogTag::DMS, "setting cast observer is registered");
149 return;
150 }
151 SettingProvider& castProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
152 castObserver_ = castProvider.CreateObserver(SETTING_CAST_KEY, func);
153 if (castObserver_ == nullptr) {
154 TLOGE(WmsLogTag::DMS, "create observer failed");
155 }
156 ErrCode ret = castProvider.RegisterObserver(castObserver_);
157 if (ret != ERR_OK) {
158 TLOGW(WmsLogTag::DMS, "failed, ret=%{public}d", ret);
159 castObserver_ = nullptr;
160 }
161 }
162
UnregisterSettingCastObserver()163 void ScreenSettingHelper::UnregisterSettingCastObserver()
164 {
165 if (castObserver_ == nullptr) {
166 TLOGD(WmsLogTag::DMS, "castObserver_ is nullptr");
167 return;
168 }
169 SettingProvider& castProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
170 ErrCode ret = castProvider.UnregisterObserver(castObserver_);
171 if (ret != ERR_OK) {
172 TLOGW(WmsLogTag::DMS, "failed, ret=%{public}d", ret);
173 }
174 castObserver_ = nullptr;
175 }
176
GetSettingCast(bool & enable,const std::string & key)177 bool ScreenSettingHelper::GetSettingCast(bool& enable, const std::string& key)
178 {
179 SettingProvider& castProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
180 ErrCode ret = castProvider.GetBoolValue(key, enable);
181 if (ret != ERR_OK) {
182 TLOGW(WmsLogTag::DMS, "failed, ret=%{public}d", ret);
183 return false;
184 }
185 return true;
186 }
187
RegisterSettingRotationObserver(SettingObserver::UpdateFunc func)188 void ScreenSettingHelper::RegisterSettingRotationObserver(SettingObserver::UpdateFunc func)
189 {
190 if (rotationObserver_ != nullptr) {
191 TLOGI(WmsLogTag::DMS, "setting rotation observer is registered");
192 return;
193 }
194 SettingProvider& settingProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
195 rotationObserver_ = settingProvider.CreateObserver(SETTING_ROTATION_KEY, func);
196 if (rotationObserver_ == nullptr) {
197 TLOGE(WmsLogTag::DMS, "create observer failed");
198 }
199 ErrCode ret = settingProvider.RegisterObserver(rotationObserver_);
200 if (ret != ERR_OK) {
201 TLOGE(WmsLogTag::DMS, "failed, ret:%{public}d", ret);
202 rotationObserver_ = nullptr;
203 }
204 }
205
UnregisterSettingRotationObserver()206 void ScreenSettingHelper::UnregisterSettingRotationObserver()
207 {
208 if (rotationObserver_ == nullptr) {
209 TLOGI(WmsLogTag::DMS, "rotationObserver_ is nullptr");
210 return;
211 }
212 SettingProvider& settingProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
213 ErrCode ret = settingProvider.UnregisterObserver(rotationObserver_);
214 if (ret != ERR_OK) {
215 TLOGE(WmsLogTag::DMS, "failed, ret:%{public}d", ret);
216 }
217 rotationObserver_ = nullptr;
218 }
219
SetSettingRotation(int32_t rotation)220 void ScreenSettingHelper::SetSettingRotation(int32_t rotation)
221 {
222 SettingProvider& settingProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
223 ErrCode ret = settingProvider.PutIntValue(SETTING_ROTATION_KEY, rotation, true);
224 if (ret != ERR_OK) {
225 TLOGE(WmsLogTag::DMS, "failed, ret:%{public}d", ret);
226 return;
227 }
228 TLOGE(WmsLogTag::DMS, "succeed, ret:%{public}d", ret);
229 }
230
GetSettingRotation(int32_t & rotation,const std::string & key)231 bool ScreenSettingHelper::GetSettingRotation(int32_t& rotation, const std::string& key)
232 {
233 SettingProvider& settingProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
234 ErrCode ret = settingProvider.GetIntValue(key, rotation);
235 if (ret != ERR_OK) {
236 TLOGE(WmsLogTag::DMS, "failed, ret:%{public}d", ret);
237 return false;
238 }
239 TLOGE(WmsLogTag::DMS, "current rotation:%{public}d", rotation);
240 return true;
241 }
242
SetSettingRotationScreenId(int32_t screenId)243 void ScreenSettingHelper::SetSettingRotationScreenId(int32_t screenId)
244 {
245 SettingProvider& settingProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
246 ErrCode ret = settingProvider.PutIntValue(SETTING_ROTATION_SCREEN_ID_KEY, screenId, false);
247 if (ret != ERR_OK) {
248 TLOGE(WmsLogTag::DMS, "failed, ret:%{public}d", ret);
249 return;
250 }
251 TLOGE(WmsLogTag::DMS, "succeed, ret:%{public}d", ret);
252 }
253
GetSettingRotationScreenID(int32_t & screenId,const std::string & key)254 bool ScreenSettingHelper::GetSettingRotationScreenID(int32_t& screenId, const std::string& key)
255 {
256 SettingProvider& settingProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
257 ErrCode ret = settingProvider.GetIntValue(key, screenId);
258 if (ret != ERR_OK) {
259 TLOGE(WmsLogTag::DMS, "failed, ret:%{public}d", ret);
260 return false;
261 }
262 TLOGE(WmsLogTag::DMS, "current rotation screen id:%{public}d", screenId);
263 return true;
264 }
265
RemoveInvalidChar(const std::string & input)266 std::string ScreenSettingHelper::RemoveInvalidChar(const std::string& input)
267 {
268 TLOGW(WmsLogTag::DMS, "input string: %{public}s", input.c_str());
269 std::string resultString = "";
270 for (char character : input) {
271 if (std::isdigit(character) || character == ' ' || character == ',' ||
272 character == '.' || character == ';' || character == '_') {
273 resultString += character;
274 }
275 }
276 return resultString;
277 }
278
SplitString(std::vector<std::string> & splitValues,const std::string & input,char delimiter)279 bool ScreenSettingHelper::SplitString(std::vector<std::string>& splitValues, const std::string& input,
280 char delimiter)
281 {
282 TLOGI(WmsLogTag::DMS, "input string: %{public}s", input.c_str());
283 if (input.size() == 0) {
284 TLOGE(WmsLogTag::DMS, "noting in input string");
285 return false;
286 }
287 std::stringstream stream(input);
288 std::string token = "";
289 while (std::getline(stream, token, delimiter)) {
290 splitValues.push_back(token);
291 }
292 if (splitValues.size() == 0) {
293 TLOGE(WmsLogTag::DMS, "failed, noting split");
294 return false;
295 }
296 return true;
297 }
298
IsNumber(const std::string & str)299 bool ScreenSettingHelper::IsNumber(const std::string& str)
300 {
301 int32_t length = static_cast<int32_t>(str.size());
302 int32_t start = 0;
303 while (start < length && isspace(str[start])) {
304 start++;
305 }
306 bool hasDot = false;
307 bool hasDigit = false;
308 if (start < length && str[start] == '-') {
309 start++;
310 }
311 for (int32_t i = start; i < length; ++i) {
312 if (str[i] == '.') {
313 if (hasDot) {
314 return false;
315 }
316 hasDot = true;
317 } else if (isdigit(str[i])) {
318 hasDigit = true;
319 } else {
320 return false;
321 }
322 }
323 return hasDigit;
324 }
325
GetMultiScreenInfo(const std::string & key)326 std::map<std::string, MultiScreenInfo> ScreenSettingHelper::GetMultiScreenInfo(const std::string& key)
327 {
328 std::map<std::string, MultiScreenInfo> multiScreenInfoMap = {};
329 std::string value = "";
330 SettingProvider& settingProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
331 ErrCode ret = settingProvider.GetStringValueMultiUser(key, value);
332 if (ret != ERR_OK) {
333 TLOGE(WmsLogTag::DMS, "failed, ret=%{public}d", ret);
334 return multiScreenInfoMap;
335 }
336 std::string validString = RemoveInvalidChar(value);
337 std::vector<std::string> restoredScreen = {};
338 bool split = SplitString(restoredScreen, validString, ',');
339 if (!split) {
340 TLOGE(WmsLogTag::DMS, "split screen failed");
341 return multiScreenInfoMap;
342 }
343 for (auto infoString : restoredScreen) {
344 std::vector<std::string> infoVector = {};
345 split = SplitString(infoVector, infoString, ';');
346 if (!split || infoVector.size() != VALID_MULTI_SCREEN_INFO_SIZE) {
347 TLOGE(WmsLogTag::DMS, "split info failed");
348 continue;
349 }
350 MultiScreenInfo info = {};
351 if (!GetScreenMode(info, infoVector[INDEX_SCREEN_MODE])) {
352 continue;
353 }
354 if (!GetScreenRelativePosition(info, infoVector[INDEX_FIRST_RELATIVE_POSITION])) {
355 continue;
356 }
357 if (!GetScreenRelativePosition(info, infoVector[INDEX_SECOND_RELATIVE_POSITION])) {
358 continue;
359 }
360 if (info.mainScreenOption.screenId_ == info.secondaryScreenOption.screenId_) {
361 TLOGE(WmsLogTag::DMS, "invalid screen of relative position!");
362 continue;
363 }
364 multiScreenInfoMap[infoVector[INDEX_SCREEN_INFO]] = info;
365 }
366 return multiScreenInfoMap;
367 }
368
GetScreenMode(MultiScreenInfo & info,const std::string & inputString)369 bool ScreenSettingHelper::GetScreenMode(MultiScreenInfo& info, const std::string& inputString)
370 {
371 std::vector<std::string> screenMode = {};
372 bool split = SplitString(screenMode, inputString, ' ');
373 uint32_t dataSize = screenMode.size();
374 if (!split || dataSize != EXPECT_SCREEN_MODE_SIZE) {
375 TLOGE(WmsLogTag::DMS, "split failed, data size: %{public}d", dataSize);
376 return false;
377 }
378
379 uint32_t mode = 0;
380 if (!IsNumber(screenMode[DATA_INDEX_ZERO])) {
381 TLOGE(WmsLogTag::DMS, "not number");
382 return false;
383 } else {
384 mode = static_cast<uint32_t>(strtoll(screenMode[DATA_INDEX_ZERO].c_str(), nullptr, PARAM_NUM_TEN));
385 TLOGW(WmsLogTag::DMS, "internal screen mode: %{public}d", mode);
386 if (!UpdateScreenMode(info, mode, false)) {
387 return false;
388 }
389 }
390 if (!IsNumber(screenMode[DATA_INDEX_ONE])) {
391 TLOGE(WmsLogTag::DMS, "not number");
392 return false;
393 } else {
394 mode = static_cast<uint32_t>(strtoll(screenMode[DATA_INDEX_ONE].c_str(), nullptr, PARAM_NUM_TEN));
395 TLOGW(WmsLogTag::DMS, "external screen mode: %{public}d", mode);
396 if (!UpdateScreenMode(info, mode, true)) {
397 return false;
398 }
399 }
400 return true;
401 }
402
UpdateScreenMode(MultiScreenInfo & info,uint32_t mode,bool isExternal)403 bool ScreenSettingHelper::UpdateScreenMode(MultiScreenInfo& info, uint32_t mode, bool isExternal)
404 {
405 if (mode == SCREEN_MAIN_IN_DATA) {
406 info.isExtendMain = isExternal;
407 } else if (mode == SCREEN_MIRROR_IN_DATA) {
408 info.multiScreenMode = MultiScreenMode::SCREEN_MIRROR;
409 } else if (mode == SCREEN_EXTEND_IN_DATA) {
410 info.multiScreenMode = MultiScreenMode::SCREEN_EXTEND;
411 } else {
412 TLOGE(WmsLogTag::DMS, "invalid mode!");
413 return false;
414 }
415 return true;
416 }
417
GetScreenRelativePosition(MultiScreenInfo & info,const std::string & inputString)418 bool ScreenSettingHelper::GetScreenRelativePosition(MultiScreenInfo& info, const std::string& inputString)
419 {
420 std::vector<std::string> relativePosition = {};
421 bool split = SplitString(relativePosition, inputString, ' ');
422 uint32_t dataSize = relativePosition.size();
423 if (!split || dataSize != EXPECT_RELATIVE_POSITION_SIZE) {
424 TLOGE(WmsLogTag::DMS, "split failed, data size: %{public}d", dataSize);
425 return false;
426 }
427
428 ScreenId screenId = SCREEN_ID_INVALID;
429 uint32_t startX = 0;
430 uint32_t startY = 0;
431 if (!IsNumber(relativePosition[DATA_INDEX_ZERO])) {
432 TLOGE(WmsLogTag::DMS, "not number");
433 return false;
434 } else {
435 screenId = static_cast<ScreenId>(strtoll(relativePosition[DATA_INDEX_ZERO].c_str(), nullptr, PARAM_NUM_TEN));
436 }
437 if (!IsNumber(relativePosition[DATA_INDEX_ONE])) {
438 TLOGE(WmsLogTag::DMS, "not number");
439 return false;
440 } else {
441 startX = static_cast<uint32_t>(strtoll(relativePosition[DATA_INDEX_ONE].c_str(), nullptr, PARAM_NUM_TEN));
442 }
443 if (!IsNumber(relativePosition[DATA_INDEX_TWO])) {
444 TLOGE(WmsLogTag::DMS, "not number");
445 return false;
446 } else {
447 startY = static_cast<uint32_t>(strtoll(relativePosition[DATA_INDEX_TWO].c_str(), nullptr, PARAM_NUM_TEN));
448 }
449 TLOGW(WmsLogTag::DMS, "screenId: %{public}" PRIu64 ", startX: %{public}d, startY: %{public}d",
450 screenId, startX, startY);
451
452 ScreenId internalScreenId = ScreenSessionManager::GetInstance().GetInternalScreenId();
453 if ((info.isExtendMain && screenId != internalScreenId) || (!info.isExtendMain && screenId == internalScreenId)) {
454 info.mainScreenOption.screenId_ = screenId;
455 info.mainScreenOption.startX_ = startX;
456 info.mainScreenOption.startY_ = startY;
457 } else {
458 info.secondaryScreenOption.screenId_ = screenId;
459 info.secondaryScreenOption.startX_ = startX;
460 info.secondaryScreenOption.startY_ = startY;
461 }
462 return true;
463 }
464
GetScreenShape(ScreenId screenId)465 ScreenShape ScreenSettingHelper::GetScreenShape(ScreenId screenId)
466 {
467 std::istringstream iss(SCREEN_SHAPE);
468 std::string id;
469 std::string shape;
470 while (std::getline(iss, id, ':')) {
471 std::getline(iss, shape, ';');
472 if (screenId == static_cast<ScreenId>(std::stoi(id))) {
473 return static_cast<ScreenShape>(std::stoi(shape));
474 }
475 }
476 TLOGI(WmsLogTag::DMS, "Can not find screen shape info. ccm:%{public}s", SCREEN_SHAPE.c_str());
477 return ScreenShape::RECTANGLE;
478 }
479
RegisterSettingHalfScreenObserver(SettingObserver::UpdateFunc func)480 void ScreenSettingHelper::RegisterSettingHalfScreenObserver(SettingObserver::UpdateFunc func)
481 {
482 if (halfScreenObserver_ != nullptr) {
483 TLOGI(WmsLogTag::DMS, "setting halfScreen observer is registered");
484 return;
485 }
486 SettingProvider& halfScreenProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
487 halfScreenObserver_ = halfScreenProvider.CreateObserver(SETTING_HALF_SCREEN_SWITCH_KEY, func);
488 ErrCode ret = halfScreenProvider.RegisterObserver(halfScreenObserver_);
489 if (ret != ERR_OK) {
490 TLOGE(WmsLogTag::DMS, "halfScreen failed, ret:%{public}d", ret);
491 halfScreenObserver_ = nullptr;
492 }
493 }
494
UnregisterSettingHalfScreenObserver()495 void ScreenSettingHelper::UnregisterSettingHalfScreenObserver()
496 {
497 if (halfScreenObserver_ == nullptr) {
498 TLOGI(WmsLogTag::DMS, "halfScreenObserver_ is nullptr");
499 return;
500 }
501 SettingProvider& halfScreenProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
502 ErrCode ret = halfScreenProvider.UnregisterObserver(halfScreenObserver_);
503 if (ret != ERR_OK) {
504 TLOGE(WmsLogTag::DMS, "failed, ret:%{public}d", ret);
505 }
506 halfScreenObserver_ = nullptr;
507 }
508
GetHalfScreenSwitchState(const std::string & key)509 bool ScreenSettingHelper::GetHalfScreenSwitchState(const std::string& key)
510 {
511 SettingProvider& halfScreenProvider = SettingProvider::GetInstance(DEVICE_STANDBY_SERVICE_SYSTEM_ABILITY_ID);
512 int dbValue = 0;
513 ErrCode ret = halfScreenProvider.GetIntValue(key, dbValue);
514 if (ret != ERR_OK) {
515 TLOGE(WmsLogTag::DMS, "GetHalfScreenSwitchState failed, ret:%{public}d", ret);
516 return false;
517 }
518 return !dbValue;
519 }
520
RegisterSettingscreenSkipProtectedWindowObserver(SettingObserver::UpdateFunc func)521 void ScreenSettingHelper::RegisterSettingscreenSkipProtectedWindowObserver(SettingObserver::UpdateFunc func)
522 {
523 if (screenSkipProtectedWindowObserver_ != nullptr) {
524 TLOGI(WmsLogTag::DMS, "setting rotation observer is registered");
525 return;
526 }
527 SettingProvider& settingProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
528 screenSkipProtectedWindowObserver_ = settingProvider.CreateObserver(SETTING_SCREEN_SHARE_PROTECT_KEY, func);
529 if (screenSkipProtectedWindowObserver_ == nullptr) {
530 TLOGE(WmsLogTag::DMS, "create observer failed");
531 }
532 ErrCode ret = settingProvider.RegisterObserverByTable(screenSkipProtectedWindowObserver_,
533 SCREEN_SHARE_PROTECT_TABLE);
534 if (ret != ERR_OK) {
535 TLOGE(WmsLogTag::DMS, "failed, ret:%{public}d", ret);
536 screenSkipProtectedWindowObserver_ = nullptr;
537 }
538 }
539
UnregisterSettingscreenSkipProtectedWindowObserver()540 void ScreenSettingHelper::UnregisterSettingscreenSkipProtectedWindowObserver()
541 {
542 if (screenSkipProtectedWindowObserver_ == nullptr) {
543 TLOGI(WmsLogTag::DMS, "rotationObserver_ is nullptr");
544 return;
545 }
546 SettingProvider& settingProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
547 ErrCode ret = settingProvider.UnregisterObserverByTable(screenSkipProtectedWindowObserver_,
548 SCREEN_SHARE_PROTECT_TABLE);
549 if (ret != ERR_OK) {
550 TLOGE(WmsLogTag::DMS, "failed, ret:%{public}d", ret);
551 }
552 screenSkipProtectedWindowObserver_ = nullptr;
553 }
554
GetSettingscreenSkipProtectedWindow(bool & enable,const std::string & key)555 bool ScreenSettingHelper::GetSettingscreenSkipProtectedWindow(bool& enable, const std::string& key)
556 {
557 int32_t value = 0;
558 SettingProvider& settingProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
559 ErrCode ret = settingProvider.GetIntValueMultiUserByTable(key, value, SCREEN_SHARE_PROTECT_TABLE);
560 if (ret != ERR_OK) {
561 TLOGE(WmsLogTag::DMS, "failed, ret=%{public}d", ret);
562 return false;
563 }
564 enable = (value == 1);
565 return true;
566 }
567
RegisterSettingWireCastObserver(SettingObserver::UpdateFunc func)568 void ScreenSettingHelper::RegisterSettingWireCastObserver(SettingObserver::UpdateFunc func)
569 {
570 if (wireCastObserver_) {
571 TLOGD(WmsLogTag::DMS, "setting wire cast observer is registered");
572 return;
573 }
574 SettingProvider& wireCastProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
575 wireCastObserver_ = wireCastProvider.CreateObserver(SETTING_CAST_KEY, func);
576 if (wireCastObserver_ == nullptr) {
577 TLOGE(WmsLogTag::DMS, "create observer failed");
578 return;
579 }
580 ErrCode ret = wireCastProvider.RegisterObserver(wireCastObserver_);
581 if (ret != ERR_OK) {
582 TLOGW(WmsLogTag::DMS, "failed, ret=%{public}d", ret);
583 wireCastObserver_ = nullptr;
584 }
585 }
586
UnregisterSettingWireCastObserver()587 void ScreenSettingHelper::UnregisterSettingWireCastObserver()
588 {
589 if (wireCastObserver_ == nullptr) {
590 TLOGD(WmsLogTag::DMS, "wireCastObserver_ is nullptr");
591 return;
592 }
593 SettingProvider& wireCastProvider = SettingProvider::GetInstance(DISPLAY_MANAGER_SERVICE_SA_ID);
594 ErrCode ret = wireCastProvider.UnregisterObserver(wireCastObserver_);
595 if (ret != ERR_OK) {
596 TLOGW(WmsLogTag::DMS, "failed, ret=%{public}d", ret);
597 }
598 wireCastObserver_ = nullptr;
599 }
600 } // namespace Rosen
601 } // namespace OHOS
602