1 /*
2  * Copyright (C) 2024 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 #include "uc_observer_mgr.h"
16 
17 #include "app_mgr_client.h"
18 #include "hiview_logger.h"
19 #include "iservice_registry.h"
20 #include "process_status.h"
21 #include "system_ability_definition.h"
22 
23 namespace OHOS {
24 namespace HiviewDFX {
25 DEFINE_LOG_TAG("UnifiedCollector");
26 using namespace OHOS::HiviewDFX::UCollectUtil;
27 
RegisterObservers()28 void UcObserverManager::RegisterObservers()
29 {
30     RegisterSysAbilityListener();
31 }
32 
UnregisterObservers()33 void UcObserverManager::UnregisterObservers()
34 {
35     UnregisterSysAbilityListener();
36 }
37 
RegisterSysAbilityListener()38 void UcObserverManager::RegisterSysAbilityListener()
39 {
40     auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
41     if (samgr == nullptr) {
42         HIVIEW_LOGE("failed to get samgr");
43         return;
44     }
45     sysAbilityListener_ = new(std::nothrow) UcSystemAbilityListener();
46     if (sysAbilityListener_ == nullptr) {
47         HIVIEW_LOGE("new listener is null");
48         return;
49     }
50     if (auto ret = samgr->SubscribeSystemAbility(APP_MGR_SERVICE_ID, sysAbilityListener_); ret != ERR_OK) {
51         HIVIEW_LOGE("failed to subscribe app mgr service status, ret=%{public}d", ret);
52         return;
53     }
54     HIVIEW_LOGI("succ to subscribe app mgr service status");
55 }
56 
UnregisterSysAbilityListener()57 void UcObserverManager::UnregisterSysAbilityListener()
58 {
59     if (sysAbilityListener_ == nullptr) {
60         return;
61     }
62     auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
63     if (samgr == nullptr) {
64         HIVIEW_LOGE("failed to get samgr");
65         return;
66     }
67     if (auto ret = samgr->UnSubscribeSystemAbility(APP_MGR_SERVICE_ID, sysAbilityListener_); ret != ERR_OK) {
68         HIVIEW_LOGE("failed to unSubscribe app mgr service status, ret=%{public}d", ret);
69         return;
70     }
71     sysAbilityListener_ = nullptr;
72     HIVIEW_LOGI("succ to unsubscribe app mgr service status");
73 }
74 
RegisterAppObserver()75 void UcObserverManager::RegisterAppObserver()
76 {
77     appStateObserver_ = new(std::nothrow) UcAppStateObserver();
78     if (appStateObserver_ == nullptr) {
79         HIVIEW_LOGE("observer is null");
80         return;
81     }
82     auto res = DelayedSingleton<AppExecFwk::AppMgrClient>::GetInstance()->
83         RegisterApplicationStateObserver(appStateObserver_);
84     if (res != ERR_OK) {
85         HIVIEW_LOGE("failed to register observer, res=%{public}d", res);
86         return;
87     }
88     HIVIEW_LOGI("succ to register observer");
89 }
90 
RegisterRenderObserver()91 void UcObserverManager::RegisterRenderObserver()
92 {
93     renderStateObserver_ = new(std::nothrow) UcRenderStateObserver();
94     if (renderStateObserver_ == nullptr) {
95         HIVIEW_LOGE("observer is null");
96         return;
97     }
98 
99     int32_t res = -1; // -1: default value
100     constexpr uint32_t maxTryTimes = 3; // 3: max three times
101     uint32_t curTryTime = 1; // 1: first time
102     do {
103         res = DelayedSingleton<AppExecFwk::AppMgrClient>::GetInstance()->
104             RegisterRenderStateObserver(renderStateObserver_);
105         HIVIEW_LOGI("register observer, res=%{public}d, curTryTime=%{public}u", res, curTryTime);
106         if (res == ERR_OK) {
107             HIVIEW_LOGI("succ to register observer");
108             return;
109         }
110         ++curTryTime;
111         sleep(1); // sleep 1s
112     } while (res != ERR_OK && curTryTime <= maxTryTimes);
113 }
114 
UnregisterAppObserver()115 void UcObserverManager::UnregisterAppObserver()
116 {
117     if (appStateObserver_ == nullptr) {
118         return;
119     }
120     auto res = DelayedSingleton<AppExecFwk::AppMgrClient>::GetInstance()->
121         UnregisterApplicationStateObserver(appStateObserver_);
122     if (res != ERR_OK) {
123         HIVIEW_LOGE("failed to unregister observer, res=%{public}d", res);
124         return;
125     }
126     appStateObserver_ = nullptr;
127     HIVIEW_LOGI("succ to unregister observer");
128 }
129 
UnregisterRenderObserver()130 void UcObserverManager::UnregisterRenderObserver()
131 {
132     if (renderStateObserver_ == nullptr) {
133         return;
134     }
135     auto res = DelayedSingleton<AppExecFwk::AppMgrClient>::GetInstance()->
136         UnregisterRenderStateObserver(renderStateObserver_);
137     if (res != ERR_OK) {
138         HIVIEW_LOGE("failed to unregister observer, res=%{public}d", res);
139         return;
140     }
141     renderStateObserver_ = nullptr;
142     HIVIEW_LOGI("succ to unregister observer");
143 }
144 }  // namespace HiviewDFX
145 }  // namespace OHOS
146