1 /*
2 * Copyright (c) 2022 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 "observer_manager.h"
17
18 #include "hisysevent_manager.h"
19 #include "ipc_skeleton.h"
20 #include "iservice_registry.h"
21 #include "parameters.h"
22 #include "res_sched_log.h"
23 #include "telephony_observer_client.h"
24 #include "core_service_client.h"
25 #include "system_ability_definition.h"
26 #ifdef DEVICE_MOVEMENT_PERCEPTION_ENABLE
27 #include "movement_client.h"
28 #include "movement_data_utils.h"
29 #endif
30
31 namespace OHOS {
32 namespace ResourceSchedule {
33 const static int8_t OPERATION_SUCCESS = 0;
34 const static bool DEVICE_MOVEMENT_OBSERVER_ENABLE =
35 system::GetBoolParameter("persist.sys.ressched_device_movement_observer_switch", false);
IMPLEMENT_SINGLE_INSTANCE(ObserverManager)36 IMPLEMENT_SINGLE_INSTANCE(ObserverManager)
37
38 void ObserverManager::Init()
39 {
40 InitSysAbilityListener();
41 }
42
Disable()43 void ObserverManager::Disable()
44 {
45 handleObserverMap_.clear();
46 removeObserverMap_.clear();
47 DisableCameraObserver();
48 DisableTelephonyObserver();
49 sysAbilityListener_ = nullptr;
50 }
51
InitSysAbilityListener()52 void ObserverManager::InitSysAbilityListener()
53 {
54 if (sysAbilityListener_ != nullptr) {
55 return;
56 }
57
58 sysAbilityListener_ = new (std::nothrow) SystemAbilityStatusChangeListener();
59 if (sysAbilityListener_ == nullptr) {
60 RESSCHED_LOGE("Failed to create statusChangeListener due to no memory");
61 return;
62 }
63
64 sptr<ISystemAbilityManager> systemAbilityManager
65 = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
66 if (systemAbilityManager == nullptr) {
67 sysAbilityListener_ = nullptr;
68 RESSCHED_LOGE("systemAbilityManager is null");
69 return;
70 }
71
72 handleObserverMap_ = {
73 { DFX_SYS_EVENT_SERVICE_ABILITY_ID, std::bind(&ObserverManager::InitCameraObserver, std::placeholders::_1) },
74 { TELEPHONY_STATE_REGISTRY_SYS_ABILITY_ID,
75 std::bind(&ObserverManager::InitTelephonyObserver, std::placeholders::_1) },
76 { AUDIO_POLICY_SERVICE_ID, std::bind(&ObserverManager::InitAudioObserver, std::placeholders::_1) },
77 { MSDP_MOVEMENT_SERVICE_ID, std::bind(&ObserverManager::InitDeviceMovementObserver, std::placeholders::_1) }
78 };
79 removeObserverMap_ = {
80 { DFX_SYS_EVENT_SERVICE_ABILITY_ID, std::bind(&ObserverManager::DisableCameraObserver, std::placeholders::_1) },
81 { TELEPHONY_STATE_REGISTRY_SYS_ABILITY_ID,
82 std::bind(&ObserverManager::DisableTelephonyObserver, std::placeholders::_1) },
83 { AUDIO_POLICY_SERVICE_ID, std::bind(&ObserverManager::DisableAudioObserver, std::placeholders::_1) },
84 { MSDP_MOVEMENT_SERVICE_ID, std::bind(&ObserverManager::DisableDeviceMovementObserver, std::placeholders::_1) }
85 };
86 AddItemToSysAbilityListener(DFX_SYS_EVENT_SERVICE_ABILITY_ID, systemAbilityManager);
87 AddItemToSysAbilityListener(TELEPHONY_STATE_REGISTRY_SYS_ABILITY_ID, systemAbilityManager);
88 AddItemToSysAbilityListener(AUDIO_POLICY_SERVICE_ID, systemAbilityManager);
89 AddItemToSysAbilityListener(MSDP_MOVEMENT_SERVICE_ID, systemAbilityManager);
90 }
91
AddItemToSysAbilityListener(int32_t systemAbilityId,sptr<ISystemAbilityManager> & systemAbilityManager)92 inline void ObserverManager::AddItemToSysAbilityListener(int32_t systemAbilityId,
93 sptr<ISystemAbilityManager>& systemAbilityManager)
94 {
95 if (systemAbilityManager->SubscribeSystemAbility(systemAbilityId, sysAbilityListener_) != ERR_OK) {
96 sysAbilityListener_ = nullptr;
97 RESSCHED_LOGE("%{public}s: subscribe system ability id: %{public}d failed", __func__, systemAbilityId);
98 }
99 }
100
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)101 void ObserverManager::SystemAbilityStatusChangeListener::OnAddSystemAbility(
102 int32_t systemAbilityId, const std::string& deviceId)
103 {
104 RESSCHED_LOGI("Add system ability, system ability id: %{public}d", systemAbilityId);
105 auto funcIter = ObserverManager::GetInstance().handleObserverMap_.find(systemAbilityId);
106 if (funcIter != ObserverManager::GetInstance().handleObserverMap_.end()) {
107 auto function = funcIter->second;
108 if (function) {
109 function(&ObserverManager::GetInstance());
110 }
111 }
112 }
113
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)114 void ObserverManager::SystemAbilityStatusChangeListener::OnRemoveSystemAbility(
115 int32_t systemAbilityId, const std::string& deviceId)
116 {
117 RESSCHED_LOGD("Remove system ability, system ability id: %{public}d", systemAbilityId);
118 auto funcIter = ObserverManager::GetInstance().removeObserverMap_.find(systemAbilityId);
119 if (funcIter != ObserverManager::GetInstance().removeObserverMap_.end()) {
120 auto function = funcIter->second;
121 if (function) {
122 function(&ObserverManager::GetInstance());
123 }
124 }
125 }
126
InitCameraObserver()127 void ObserverManager::InitCameraObserver()
128 {
129 RESSCHED_LOGI("Init camera observer");
130 if (!cameraObserver_) {
131 cameraObserver_ = std::make_shared<ResourceSchedule::CameraObserver>();
132 }
133
134 HiviewDFX::ListenerRule cameraStateRule("CAMERA", "CAMERA_STATE");
135 HiviewDFX::ListenerRule cameraStatisticRule("CAMERA", "CAMERA_STATISTIC");
136 std::vector<HiviewDFX::ListenerRule> sysRules;
137 sysRules.push_back(cameraStateRule);
138 sysRules.push_back(cameraStatisticRule);
139 auto res = HiviewDFX::HiSysEventManager::AddListener(cameraObserver_, sysRules);
140 if (res == 0) {
141 RESSCHED_LOGD("ObserverManager init camera observer successfully");
142 } else {
143 RESSCHED_LOGW("ObserverManager init camera observer failed");
144 }
145 }
146
DisableCameraObserver()147 void ObserverManager::DisableCameraObserver()
148 {
149 RESSCHED_LOGI("Disable camera observer");
150 if (cameraObserver_ == nullptr) {
151 return;
152 }
153
154 auto res = HiviewDFX::HiSysEventManager::RemoveListener(cameraObserver_);
155 if (res == 0) {
156 RESSCHED_LOGD("ObserverManager disable camera observer successfully");
157 } else {
158 RESSCHED_LOGW("ObserverManager disable camera observer failed");
159 }
160 cameraObserver_ = nullptr;
161 }
162
InitTelephonyObserver()163 void ObserverManager::InitTelephonyObserver()
164 {
165 RESSCHED_LOGI("Init telephony observer");
166 if (!telephonyObserver_) {
167 telephonyObserver_ = std::make_unique<SchedTelephonyObserver>().release();
168 }
169 slotId_ = 0;
170 auto res = Telephony::TelephonyObserverClient::GetInstance().AddStateObserver(
171 telephonyObserver_, slotId_, Telephony::TelephonyObserverBroker::OBSERVER_MASK_CALL_STATE, false);
172 if (res == OPERATION_SUCCESS) {
173 RESSCHED_LOGD("ObserverManager init telephony observer successfully");
174 } else {
175 RESSCHED_LOGW("ObserverManager init telephony observer failed");
176 }
177 }
178
DisableTelephonyObserver()179 void ObserverManager::DisableTelephonyObserver()
180 {
181 RESSCHED_LOGI("Disable telephony observer");
182 if (!telephonyObserver_) {
183 RESSCHED_LOGD("ObserverManager has been disable telephony observer");
184 return ;
185 }
186 slotId_ = 0;
187 Telephony::TelephonyObserverClient::GetInstance().RemoveStateObserver(
188 slotId_, Telephony::TelephonyObserverBroker::OBSERVER_MASK_CALL_STATE);
189 telephonyObserver_ = nullptr;
190 }
191
InitAudioObserver()192 void ObserverManager::InitAudioObserver()
193 {
194 pid_ = getpid();
195 RESSCHED_LOGI("ObserverManager Init audio observer, pid: %{public}d", pid_);
196 if (!audioObserver_) {
197 audioObserver_ = std::make_shared<AudioObserver>();
198 }
199
200 auto res = AudioStandard::AudioStreamManager::GetInstance()->RegisterAudioRendererEventListener(pid_,
201 audioObserver_);
202 if (res == OPERATION_SUCCESS) {
203 RESSCHED_LOGD("ObserverManager init audioRenderStateObserver successfully");
204 } else {
205 RESSCHED_LOGW("ObserverManager init audioRenderStateObserver failed");
206 }
207
208 res = AudioStandard::AudioSystemManager::GetInstance()->SetRingerModeCallback(pid_, audioObserver_);
209 if (res == OPERATION_SUCCESS) {
210 RESSCHED_LOGD("ObserverManager init audioRingModeObserver successfully");
211 } else {
212 RESSCHED_LOGW("ObserverManager init audioRingModeObserver failed");
213 }
214
215 res = AudioStandard::AudioSystemManager::GetInstance()->RegisterVolumeKeyEventCallback(pid_, audioObserver_);
216 if (res == OPERATION_SUCCESS) {
217 RESSCHED_LOGD("ObserverManager init audioVolumeKeyObserver successfully");
218 } else {
219 RESSCHED_LOGW("ObserverManager init audioVolumeKeyObserver failed");
220 }
221 }
222
DisableAudioObserver()223 void ObserverManager::DisableAudioObserver()
224 {
225 RESSCHED_LOGI("Disable telephony observer");
226 if (!audioObserver_) {
227 RESSCHED_LOGD("ObserverManager has been disable audioObserver");
228 return ;
229 }
230
231 auto res = AudioStandard::AudioStreamManager::GetInstance()->UnregisterAudioRendererEventListener(pid_);
232 if (res == OPERATION_SUCCESS) {
233 RESSCHED_LOGD("ObserverManager disable audioVolumeKeyObserver successfully");
234 } else {
235 RESSCHED_LOGW("ObserverManager disable audioVolumeKeyObserver failed");
236 }
237
238 res = AudioStandard::AudioSystemManager::GetInstance()->UnsetRingerModeCallback(pid_);
239 if (res == OPERATION_SUCCESS) {
240 RESSCHED_LOGD("ObserverManager disable audioVolumeKeyObserver successfully");
241 } else {
242 RESSCHED_LOGW("ObserverManager disable audioVolumeKeyObserver failed");
243 }
244
245 res = AudioStandard::AudioSystemManager::GetInstance()->UnregisterVolumeKeyEventCallback(pid_);
246 if (res == OPERATION_SUCCESS) {
247 RESSCHED_LOGD("ObserverManager disable audioVolumeKeyObserver successfully");
248 } else {
249 RESSCHED_LOGW("ObserverManager disable audioVolumeKeyObserver failed");
250 }
251 audioObserver_ = nullptr;
252 }
253
InitDeviceMovementObserver()254 void ObserverManager::InitDeviceMovementObserver()
255 {
256 if (!DEVICE_MOVEMENT_OBSERVER_ENABLE) {
257 RESSCHED_LOGI("Device movement observer is not enable");
258 return;
259 }
260
261 #ifdef DEVICE_MOVEMENT_PERCEPTION_ENABLE
262 RESSCHED_LOGI("InitDeviceMovementObserver");
263 if (!deviceMovementObserver_) {
264 deviceMovementObserver_ = sptr<DeviceMovementObserver>(new DeviceMovementObserver());
265 }
266 Msdp::MovementClient::GetInstance().SubscribeCallback(
267 Msdp::MovementDataUtils::MovementType::TYPE_STILL, deviceMovementObserver_);
268 #endif
269 }
270
DisableDeviceMovementObserver()271 void ObserverManager::DisableDeviceMovementObserver()
272 {
273 if (!DEVICE_MOVEMENT_OBSERVER_ENABLE) {
274 RESSCHED_LOGI("Device movement observer is not enable");
275 return;
276 }
277
278 #ifdef DEVICE_MOVEMENT_PERCEPTION_ENABLE
279 RESSCHED_LOGI("DisableDeviceMovementObserver");
280 if (!deviceMovementObserver_) {
281 RESSCHED_LOGD("ObserverManager has been disable deviceMovementObserver");
282 return;
283 }
284 Msdp::MovementClient::GetInstance().UnSubscribeCallback(
285 Msdp::MovementDataUtils::MovementType::TYPE_STILL, deviceMovementObserver_);
286 deviceMovementObserver_ = nullptr;
287 #endif
288 }
289
ObserverManagerInit()290 extern "C" void ObserverManagerInit()
291 {
292 ObserverManager::GetInstance().Init();
293 }
294
ObserverManagerDisable()295 extern "C" void ObserverManagerDisable()
296 {
297 ObserverManager::GetInstance().Disable();
298 }
299 } // namespace ResourceSchedule
300 } // namespace OHOS
301