1 /*
2 * Copyright (c) 2025 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 "hgm_app_page_url_strategy.h"
17 #include "hgm_log.h"
18
19 namespace OHOS {
20 namespace Rosen {
21
SetPageUrlConfig(PolicyConfigData::PageUrlConfigMap pageUrlConfig)22 void HgmAppPageUrlStrategy::SetPageUrlConfig(PolicyConfigData::PageUrlConfigMap pageUrlConfig)
23 {
24 pageUrlConfig_ = pageUrlConfig;
25 }
26
RegisterPageUrlVoterCallback(const PageUrlVoterCallback & callback)27 void HgmAppPageUrlStrategy::RegisterPageUrlVoterCallback(const PageUrlVoterCallback& callback)
28 {
29 pageUrlVoterCallback_ = callback;
30 }
31
ProcessRemoveVoter(pid_t pid)32 void HgmAppPageUrlStrategy::ProcessRemoveVoter(pid_t pid)
33 {
34 HGM_LOGI("HgmAppPageUrlStrategy: Remove Voter pid = %{public}d", pid);
35 if (pageUrlVoterCallback_ != nullptr) {
36 pageUrlVoterCallback_(pid, "", false);
37 }
38 }
39
ProcessAddVoter(pid_t pid,std::string strategy)40 void HgmAppPageUrlStrategy::ProcessAddVoter(pid_t pid, std::string strategy)
41 {
42 HGM_LOGI("HgmAppPageUrlStrategy: Add Voter pid = %{public}d", pid);
43 if (pageUrlVoterCallback_ != nullptr) {
44 pageUrlVoterCallback_(pid, strategy, true);
45 }
46 }
47
CleanPageUrlVote(pid_t pid)48 void HgmAppPageUrlStrategy::CleanPageUrlVote(pid_t pid)
49 {
50 if (pageUrlVoterInfo_.count(pid) > 0) {
51 HGM_LOGD("HgmAppPageUrlStrategy: clean pid = %{public}d", pid);
52 pageUrlVoterInfo_.erase(pid);
53 }
54 }
55
NotifyScreenSettingChange()56 void HgmAppPageUrlStrategy::NotifyScreenSettingChange()
57 {
58 if (pageUrlVoterInfo_.empty()) {
59 return;
60 }
61 for (auto& pageUrlVoter : pageUrlVoterInfo_) {
62 uint32_t pid = pageUrlVoter.first;
63 VoterInfo voterInfo = pageUrlVoter.second;
64 std::string pageName = voterInfo.pageName;
65 if (!pageName.empty()) {
66 std::string packageName = voterInfo.packageName;
67 /* clean old config voter */
68 if (voterInfo.hasVoter) {
69 ProcessRemoveVoter(pid);
70 pageUrlVoterInfo_[pid].hasVoter = false;
71 }
72 /* add new config voter if have pageName config */
73 if (pageUrlConfig_.count(packageName) <= 0) {
74 continue;
75 }
76 PolicyConfigData::PageUrlConfig pageUrlConfig = pageUrlConfig_[packageName];
77 if (pageUrlConfig.count(pageName) <= 0) {
78 continue;
79 }
80 auto strategy = pageUrlConfig[pageName];
81 ProcessAddVoter(pid, strategy);
82 pageUrlVoterInfo_[pid].hasVoter = true;
83 }
84 }
85 }
86
NotifyPageName(pid_t pid,const std::string & packageName,const std::string & pageName,bool isEnter)87 void HgmAppPageUrlStrategy::NotifyPageName(pid_t pid, const std::string& packageName,
88 const std::string& pageName, bool isEnter)
89 {
90 HGM_LOGD("HgmAppPageUrlStrategy: pid=%{public}d packageName=%{public}s pageName=%{public}s" \
91 " isEnter=%{public}d", pid, packageName.c_str(), pageName.c_str(), isEnter);
92 VoterInfo voterInfo = {false, packageName, pageName};
93 if (pageUrlVoterInfo_.count(pid) <= 0) {
94 pageUrlVoterInfo_[pid] = voterInfo;
95 }
96 pageUrlVoterInfo_[pid].pageName = isEnter ? pageName : "";
97 /* not config record pageName */
98 if (pageUrlConfig_.count(packageName) <= 0) {
99 HGM_LOGD("HgmAppPageUrlStrategy: not packageName config");
100 return;
101 }
102
103 PolicyConfigData::PageUrlConfig pageUrlConfig = pageUrlConfig_[packageName];
104 if (pageUrlConfig.count(pageName) <= 0) {
105 HGM_LOGD("HgmAppPageUrlStrategy: not pageUrl config");
106 return;
107 }
108
109 auto strategy = pageUrlConfig[pageName];
110 if (isEnter && !pageUrlVoterInfo_[pid].hasVoter) {
111 ProcessAddVoter(pid, strategy);
112 pageUrlVoterInfo_[pid].hasVoter = true;
113 } else if (!isEnter && pageUrlVoterInfo_[pid].hasVoter) {
114 ProcessRemoveVoter(pid);
115 pageUrlVoterInfo_[pid].hasVoter = false;
116 }
117 }
118 } // namespace Rosen
119 } // namespace OHOS