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