• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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