1 /*
2 * Copyright (c) 2022-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 "observer_manager.h"
17
18 #include <dlfcn.h>
19 #include <string>
20
21 #include "display_manager.h"
22 #include "dm_common.h"
23 #include "hisysevent.h"
24 #ifdef RESOURCE_SCHEDULE_SERVICE_WITH_APP_NAP_ENABLE
25 #include "hisysevent_manager.h"
26 #endif
27 #include "ipc_skeleton.h"
28 #include "iservice_registry.h"
29 #include "parameters.h"
30 #include "res_sched_log.h"
31 #include "res_sched_mgr.h"
32 #include "res_type.h"
33 #include "connection_observer_client.h"
34 #ifdef RESSCHED_TELEPHONY_STATE_REGISTRY_ENABLE
35 #include "telephony_observer_client.h"
36 #endif
37 #include "oobe_manager.h"
38 #include "system_ability_definition.h"
39 #ifdef DEVICE_MOVEMENT_PERCEPTION_ENABLE
40 #include "movement_client.h"
41 #include "movement_data_utils.h"
42 #endif
43 #ifdef MMI_ENABLE
44 #include "input_manager.h"
45 #endif
46 #include "os_account_manager.h"
47 #ifdef RESSCHED_MULTIMEDIA_AV_SESSION_ENABLE
48 #include "avsession_manager.h"
49 #endif
50
51 namespace OHOS {
52 namespace ResourceSchedule {
53 const static int8_t OPERATION_SUCCESS = 0;
54 const static int32_t TUPLE_PID = 0;
55 const static int32_t TUPLE_UID = 1;
56 const static int32_t TUPLE_NAME = 2;
57 const static bool DEVICE_MOVEMENT_OBSERVER_ENABLE =
58 system::GetBoolParameter("persist.sys.ressched_device_movement_observer_switch", true);
59 const static char* RES_SCHED_CG_EXT_SO = "libcgroup_sched_ext.z.so";
60
Init()61 void ObserverManager::Init()
62 {
63 InitSysAbilityListener();
64 }
65
Disable()66 void ObserverManager::Disable()
67 {
68 handleObserverMap_.clear();
69 removeObserverMap_.clear();
70 #ifdef RESOURCE_SCHEDULE_SERVICE_WITH_APP_NAP_ENABLE
71 DisableHiSysEventObserver();
72 #endif
73 DisableTelephonyObserver();
74 sysAbilityListener_ = nullptr;
75 }
76
InitObserverCbMap()77 void ObserverManager::InitObserverCbMap()
78 {
79 handleObserverMap_ = {
80 #ifdef RESOURCE_SCHEDULE_SERVICE_WITH_APP_NAP_ENABLE
81 { DFX_SYS_EVENT_SERVICE_ABILITY_ID, []() { ObserverManager::GetInstance()->InitHiSysEventObserver(); }},
82 #endif
83 #ifdef MMI_ENABLE
84 { MULTIMODAL_INPUT_SERVICE_ID, []() { ObserverManager::GetInstance()->InitMMiEventObserver(); }},
85 #endif
86 { TELEPHONY_STATE_REGISTRY_SYS_ABILITY_ID, []() { ObserverManager::GetInstance()->InitTelephonyObserver(); }},
87 { AUDIO_POLICY_SERVICE_ID, []() { ObserverManager::GetInstance()->InitAudioObserver(); }},
88 { MSDP_MOVEMENT_SERVICE_ID, []() { ObserverManager::GetInstance()->InitDeviceMovementObserver(); }},
89 { DISPLAY_MANAGER_SERVICE_ID, []() { ObserverManager::GetInstance()->InitDisplayModeObserver(); }},
90 { ABILITY_MGR_SERVICE_ID, []() { ObserverManager::GetInstance()->InitConnectionSubscriber(); }},
91 { DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID, []() { ObserverManager::GetInstance()->InitDataShareObserver(); }},
92 #ifndef RESOURCE_REQUEST_REQUEST
93 { DOWNLOAD_SERVICE_ID, []() { ObserverManager::GetInstance()->InitDownloadUploadObserver(); }},
94 #endif
95 #ifdef RESSCHED_MULTIMEDIA_AV_SESSION_ENABLE
96 { AVSESSION_SERVICE_ID, []() { ObserverManager::GetInstance()->InitAVSessionStateChangeListener(); }},
97 #endif
98 { SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN, []() { ObserverManager::GetInstance()->InitAccountObserver(); }},
99 };
100
101 removeObserverMap_ = {
102 #ifdef RESOURCE_SCHEDULE_SERVICE_WITH_APP_NAP_ENABLE
103 { DFX_SYS_EVENT_SERVICE_ABILITY_ID, []() { ObserverManager::GetInstance()->DisableHiSysEventObserver(); }},
104 #endif
105 #ifdef MMI_ENABLE
106 { MULTIMODAL_INPUT_SERVICE_ID, []() { ObserverManager::GetInstance()->DisableMMiEventObserver(); }},
107 #endif
108 { TELEPHONY_STATE_REGISTRY_SYS_ABILITY_ID, []() {
109 ObserverManager::GetInstance()->DisableTelephonyObserver(); }},
110 { AUDIO_POLICY_SERVICE_ID, []() { ObserverManager::GetInstance()->DisableAudioObserver(); }},
111 { MSDP_MOVEMENT_SERVICE_ID, []() { ObserverManager::GetInstance()->DisableDeviceMovementObserver(); }},
112 { DISPLAY_MANAGER_SERVICE_ID, []() { ObserverManager::GetInstance()->DisableDisplayModeObserver(); }},
113 { ABILITY_MGR_SERVICE_ID, []() { ObserverManager::GetInstance()->DisableConnectionSubscriber(); }},
114 { DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID, []() {
115 ObserverManager::GetInstance()->DisableDataShareObserver(); }},
116 #ifndef RESOURCE_REQUEST_REQUEST
117 { DOWNLOAD_SERVICE_ID, []() { ObserverManager::GetInstance()->DisableDownloadUploadObserver(); }},
118 #endif
119 #ifdef RESSCHED_MULTIMEDIA_AV_SESSION_ENABLE
120 { AVSESSION_SERVICE_ID, []() { ObserverManager::GetInstance()->DisableAVSessionStateChangeListener(); }},
121 #endif
122 { SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN, []() { ObserverManager::GetInstance()->DisableAccountObserver(); }},
123 };
124 }
125
InitSysAbilityListener()126 void ObserverManager::InitSysAbilityListener()
127 {
128 if (sysAbilityListener_ != nullptr) {
129 return;
130 }
131
132 sysAbilityListener_ = new (std::nothrow) SystemAbilityStatusChangeListener();
133 if (sysAbilityListener_ == nullptr) {
134 RESSCHED_LOGE("Failed to create statusChangeListener due to no memory");
135 return;
136 }
137
138 sptr<ISystemAbilityManager> systemAbilityManager
139 = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
140 if (systemAbilityManager == nullptr) {
141 sysAbilityListener_ = nullptr;
142 RESSCHED_LOGE("systemAbilityManager is null");
143 return;
144 }
145 InitObserverCbMap();
146 GetReportFunc();
147
148 AddItemToSysAbilityListener(DFX_SYS_EVENT_SERVICE_ABILITY_ID, systemAbilityManager);
149 AddItemToSysAbilityListener(TELEPHONY_STATE_REGISTRY_SYS_ABILITY_ID, systemAbilityManager);
150 AddItemToSysAbilityListener(AUDIO_POLICY_SERVICE_ID, systemAbilityManager);
151 AddItemToSysAbilityListener(MSDP_MOVEMENT_SERVICE_ID, systemAbilityManager);
152 AddItemToSysAbilityListener(MULTIMODAL_INPUT_SERVICE_ID, systemAbilityManager);
153 AddItemToSysAbilityListener(DISPLAY_MANAGER_SERVICE_ID, systemAbilityManager);
154 AddItemToSysAbilityListener(ABILITY_MGR_SERVICE_ID, systemAbilityManager);
155 AddItemToSysAbilityListener(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID, systemAbilityManager);
156 #ifndef RESOURCE_REQUEST_REQUEST
157 AddItemToSysAbilityListener(DOWNLOAD_SERVICE_ID, systemAbilityManager);
158 #endif
159 #ifdef RESSCHED_MULTIMEDIA_AV_SESSION_ENABLE
160 AddItemToSysAbilityListener(AVSESSION_SERVICE_ID, systemAbilityManager);
161 #endif
162 AddItemToSysAbilityListener(SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN, systemAbilityManager);
163 }
164
AddItemToSysAbilityListener(int32_t systemAbilityId,sptr<ISystemAbilityManager> & systemAbilityManager)165 inline void ObserverManager::AddItemToSysAbilityListener(int32_t systemAbilityId,
166 sptr<ISystemAbilityManager>& systemAbilityManager)
167 {
168 if (systemAbilityManager->SubscribeSystemAbility(systemAbilityId, sysAbilityListener_) != ERR_OK) {
169 sysAbilityListener_ = nullptr;
170 RESSCHED_LOGE("%{public}s: subscribe system ability id: %{public}d failed", __func__, systemAbilityId);
171 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
172 "COMPONENT_NAME", "MAIN",
173 "ERR_TYPE", "register failure",
174 "ERR_MSG", "Register a staus change listener of the " + std::to_string(systemAbilityId) + " SA failed!");
175 } else {
176 RESSCHED_LOGI("%{public}s: subscribe system ability id: %{public}d succeed", __func__, systemAbilityId);
177 }
178 }
179
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)180 void ObserverManager::SystemAbilityStatusChangeListener::OnAddSystemAbility(
181 int32_t systemAbilityId, const std::string& deviceId)
182 {
183 RESSCHED_LOGI("Add system ability, system ability id: %{public}d", systemAbilityId);
184 auto funcIter = ObserverManager::GetInstance()->handleObserverMap_.find(systemAbilityId);
185 if (funcIter != ObserverManager::GetInstance()->handleObserverMap_.end()) {
186 auto function = funcIter->second;
187 if (function) {
188 function();
189 }
190 }
191 }
192
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)193 void ObserverManager::SystemAbilityStatusChangeListener::OnRemoveSystemAbility(
194 int32_t systemAbilityId, const std::string& deviceId)
195 {
196 RESSCHED_LOGD("Remove system ability, system ability id: %{public}d", systemAbilityId);
197 auto funcIter = ObserverManager::GetInstance()->removeObserverMap_.find(systemAbilityId);
198 if (funcIter != ObserverManager::GetInstance()->removeObserverMap_.end()) {
199 auto function = funcIter->second;
200 if (function) {
201 function();
202 }
203 }
204 }
205
GetReportFunc()206 void ObserverManager::GetReportFunc()
207 {
208 auto handle = dlopen(RES_SCHED_CG_EXT_SO, RTLD_NOW);
209 if (!handle) {
210 RESSCHED_LOGE("GetReportFunc dlopen failed");
211 return;
212 }
213 ReportFunc reportFunc = reinterpret_cast<ReportFunc>(dlsym(handle, "IsNeedReportEvents"));
214 if (!reportFunc) {
215 RESSCHED_LOGE("GetReportFunc dlsym 'IsNeedReportEvents' failed");
216 dlclose(handle);
217 return;
218 }
219
220 isNeedReport_ = reportFunc();
221 }
222
223 #ifdef RESOURCE_SCHEDULE_SERVICE_WITH_APP_NAP_ENABLE
InitHiSysEventObserver()224 void ObserverManager::InitHiSysEventObserver()
225 {
226 RESSCHED_LOGI("Init hisysevent observer");
227 if (!hiSysEventObserver_) {
228 hiSysEventObserver_ = std::make_shared<ResourceSchedule::HiSysEventObserver>();
229 }
230
231 HiviewDFX::ListenerRule audioStreamState("AUDIO", "STREAM_CHANGE");
232 HiviewDFX::ListenerRule cameraConnectState("CAMERA", "CAMERA_CONNECT");
233 HiviewDFX::ListenerRule cameraDisconnectState("CAMERA", "CAMERA_DISCONNECT");
234 HiviewDFX::ListenerRule brSwitchState("BT_SERVICE", "BR_SWITCH_STATE");
235 HiviewDFX::ListenerRule bleSwitchState("BT_SERVICE", "BLE_SWITCH_STATE");
236 HiviewDFX::ListenerRule wifiConnectionState("COMMUNICATION", "WIFI_CONNECTION");
237 HiviewDFX::ListenerRule wifiScanState("COMMUNICATION", "WIFI_SCAN");
238 HiviewDFX::ListenerRule avCodecStartState("AV_CODEC", "CODEC_START_INFO");
239 HiviewDFX::ListenerRule avCodecStopState("AV_CODEC", "CODEC_STOP_INFO");
240 HiviewDFX::ListenerRule screenCaptureState("MULTIMEDIA", "PLAYER_STATE");
241 std::vector<HiviewDFX::ListenerRule> sysRules;
242 sysRules.push_back(audioStreamState);
243 sysRules.push_back(cameraConnectState);
244 sysRules.push_back(cameraDisconnectState);
245 sysRules.push_back(brSwitchState);
246 sysRules.push_back(bleSwitchState);
247 sysRules.push_back(wifiConnectionState);
248 sysRules.push_back(wifiScanState);
249 sysRules.push_back(avCodecStartState);
250 sysRules.push_back(avCodecStopState);
251 sysRules.push_back(screenCaptureState);
252 if (isNeedReport_) {
253 HiviewDFX::ListenerRule runninglockState("POWER", "RUNNINGLOCK");
254 sysRules.push_back(runninglockState);
255 }
256 auto res = HiviewDFX::HiSysEventManager::AddListener(hiSysEventObserver_, sysRules);
257 if (res == 0) {
258 RESSCHED_LOGD("ObserverManager init hisysevent observer successfully");
259 } else {
260 RESSCHED_LOGW("ObserverManager init hisysevent observer failed");
261 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
262 "COMPONENT_NAME", "MAIN",
263 "ERR_TYPE", "register failure",
264 "ERR_MSG", "Register a hisysevent observer failed!");
265 }
266 }
267
DisableHiSysEventObserver()268 void ObserverManager::DisableHiSysEventObserver()
269 {
270 RESSCHED_LOGI("Disable hisysevent observer");
271 if (hiSysEventObserver_ == nullptr) {
272 return;
273 }
274
275 auto res = HiviewDFX::HiSysEventManager::RemoveListener(hiSysEventObserver_);
276 if (res == 0) {
277 RESSCHED_LOGD("ObserverManager disable hisysevent observer successfully");
278 } else {
279 RESSCHED_LOGW("ObserverManager disable hisysevent observer failed");
280 }
281 hiSysEventObserver_ = nullptr;
282 }
283 #endif
284
InitTelephonyObserver()285 void ObserverManager::InitTelephonyObserver()
286 {
287 #ifdef RESSCHED_TELEPHONY_STATE_REGISTRY_ENABLE
288 RESSCHED_LOGI("Init telephony observer");
289 if (!telephonyObserver_) {
290 telephonyObserver_ = std::make_unique<SchedTelephonyObserver>().release();
291 }
292 slotId_ = 0;
293 auto res = Telephony::TelephonyObserverClient::GetInstance().AddStateObserver(
294 telephonyObserver_, slotId_, Telephony::TelephonyObserverBroker::OBSERVER_MASK_CALL_STATE, false);
295 if (res == OPERATION_SUCCESS) {
296 RESSCHED_LOGD("ObserverManager init telephony observer successfully");
297 } else {
298 RESSCHED_LOGW("ObserverManager init telephony observer failed");
299 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
300 "COMPONENT_NAME", "MAIN",
301 "ERR_TYPE", "register failure",
302 "ERR_MSG", "Register a telephony observer failed!");
303 }
304 #endif
305 }
306
DisableTelephonyObserver()307 void ObserverManager::DisableTelephonyObserver()
308 {
309 #ifdef RESSCHED_TELEPHONY_STATE_REGISTRY_ENABLE
310 RESSCHED_LOGI("Disable telephony observer");
311 if (!telephonyObserver_) {
312 RESSCHED_LOGD("ObserverManager has been disable telephony observer");
313 return ;
314 }
315 slotId_ = 0;
316 Telephony::TelephonyObserverClient::GetInstance().RemoveStateObserver(
317 slotId_, Telephony::TelephonyObserverBroker::OBSERVER_MASK_CALL_STATE);
318 telephonyObserver_ = nullptr;
319 #endif
320 }
321
InitAudioObserver()322 void ObserverManager::InitAudioObserver()
323 {
324 #ifdef RESSCHED_AUDIO_FRAMEWORK_ENABLE
325 pid_ = getpid();
326 RESSCHED_LOGI("ObserverManager Init audio observer, pid: %{public}d", pid_);
327 if (!audioObserver_) {
328 audioObserver_ = std::make_shared<AudioObserver>();
329 }
330
331 auto res = AudioStandard::AudioStreamManager::GetInstance()->RegisterAudioRendererEventListener(pid_,
332 audioObserver_);
333 if (res == OPERATION_SUCCESS) {
334 RESSCHED_LOGD("ObserverManager init audioRenderStateObserver successfully");
335 } else {
336 RESSCHED_LOGW("ObserverManager init audioRenderStateObserver failed");
337 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
338 "COMPONENT_NAME", "MAIN",
339 "ERR_TYPE", "register failure",
340 "ERR_MSG", "Register a audio observer failed!");
341 }
342
343 res = AudioStandard::AudioSystemManager::GetInstance()->SetRingerModeCallback(pid_, audioObserver_);
344 if (res == OPERATION_SUCCESS) {
345 RESSCHED_LOGD("ObserverManager init audioRingModeObserver successfully");
346 } else {
347 RESSCHED_LOGW("ObserverManager init audioRingModeObserver failed");
348 }
349
350 res = AudioStandard::AudioSystemManager::GetInstance()->RegisterVolumeKeyEventCallback(pid_, audioObserver_);
351 if (res == OPERATION_SUCCESS) {
352 RESSCHED_LOGD("ObserverManager init audioVolumeKeyObserver successfully");
353 } else {
354 RESSCHED_LOGW("ObserverManager init audioVolumeKeyObserver failed");
355 }
356
357 res = AudioStandard::AudioSystemManager::GetInstance()->SetAudioSceneChangeCallback(audioObserver_);
358 if (res == OPERATION_SUCCESS) {
359 RESSCHED_LOGD("ObserverManager init audioSceneKeyObserver successfully");
360 } else {
361 RESSCHED_LOGW("ObserverManager init audioSceneKeyObserver failed");
362 }
363
364 AudioStandard::AudioRendererInfo rendererInfo = {};
365 rendererInfo.streamUsage = AudioStandard::StreamUsage::STREAM_USAGE_MUSIC;
366 res = AudioStandard::AudioRoutingManager::GetInstance()
367 ->SetPreferredOutputDeviceChangeCallback(rendererInfo, audioObserver_);
368 if (res == OPERATION_SUCCESS) {
369 RESSCHED_LOGD("ObserverManager init audioOutputDeviceChangeObserver successfully");
370 } else {
371 RESSCHED_LOGW("ObserverManager init audioOutputDeviceChangeObserver failed");
372 }
373 #endif
374 }
375
DisableAudioObserver()376 void ObserverManager::DisableAudioObserver()
377 {
378 #ifdef RESSCHED_AUDIO_FRAMEWORK_ENABLE
379 RESSCHED_LOGI("Disable telephony observer");
380 if (!audioObserver_) {
381 RESSCHED_LOGD("ObserverManager has been disable audioObserver");
382 return ;
383 }
384
385 auto res = AudioStandard::AudioStreamManager::GetInstance()->UnregisterAudioRendererEventListener(pid_);
386 if (res == OPERATION_SUCCESS) {
387 RESSCHED_LOGD("ObserverManager disable audioVolumeKeyObserver successfully");
388 } else {
389 RESSCHED_LOGW("ObserverManager disable audioVolumeKeyObserver failed");
390 }
391
392 res = AudioStandard::AudioSystemManager::GetInstance()->UnsetRingerModeCallback(pid_);
393 if (res == OPERATION_SUCCESS) {
394 RESSCHED_LOGD("ObserverManager disable audioVolumeKeyObserver successfully");
395 } else {
396 RESSCHED_LOGW("ObserverManager disable audioVolumeKeyObserver failed");
397 }
398
399 res = AudioStandard::AudioSystemManager::GetInstance()->UnregisterVolumeKeyEventCallback(pid_);
400 if (res == OPERATION_SUCCESS) {
401 RESSCHED_LOGD("ObserverManager disable audioVolumeKeyObserver successfully");
402 } else {
403 RESSCHED_LOGW("ObserverManager disable audioVolumeKeyObserver failed");
404 }
405
406 res = AudioStandard::AudioSystemManager::GetInstance()->UnsetAudioSceneChangeCallback();
407 if (res == OPERATION_SUCCESS) {
408 RESSCHED_LOGD("ObserverManager disable audioSceneKeyObserver successfully");
409 } else {
410 RESSCHED_LOGW("ObserverManager disable audioSceneKeyObserver failed");
411 }
412 audioObserver_ = nullptr;
413 #endif
414 }
415
InitDeviceMovementObserver()416 void ObserverManager::InitDeviceMovementObserver()
417 {
418 if (!DEVICE_MOVEMENT_OBSERVER_ENABLE) {
419 RESSCHED_LOGI("Device movement observer is not enable");
420 return;
421 }
422
423 #ifdef DEVICE_MOVEMENT_PERCEPTION_ENABLE
424 RESSCHED_LOGI("InitDeviceMovementObserver");
425 if (!deviceMovementObserver_) {
426 deviceMovementObserver_ = sptr<DeviceMovementObserver>(new DeviceMovementObserver());
427 }
428 if (Msdp::MovementClient::GetInstance().SubscribeCallback(
429 Msdp::MovementDataUtils::MovementType::TYPE_STILL, deviceMovementObserver_) != ERR_OK) {
430 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
431 "COMPONENT_NAME", "MAIN",
432 "ERR_TYPE", "register failure",
433 "ERR_MSG", "Register a device movement observer failed!");
434 }
435 #endif
436 }
437
DisableDeviceMovementObserver()438 void ObserverManager::DisableDeviceMovementObserver()
439 {
440 if (!DEVICE_MOVEMENT_OBSERVER_ENABLE) {
441 RESSCHED_LOGI("Device movement observer is not enable");
442 return;
443 }
444
445 #ifdef DEVICE_MOVEMENT_PERCEPTION_ENABLE
446 RESSCHED_LOGI("DisableDeviceMovementObserver");
447 if (!deviceMovementObserver_) {
448 RESSCHED_LOGD("ObserverManager has been disable deviceMovementObserver");
449 return;
450 }
451 Msdp::MovementClient::GetInstance().UnSubscribeCallback(
452 Msdp::MovementDataUtils::MovementType::TYPE_STILL, deviceMovementObserver_);
453 deviceMovementObserver_ = nullptr;
454 #endif
455 }
456
457 #ifdef MMI_ENABLE
InitMMiEventObserver()458 void ObserverManager::InitMMiEventObserver()
459 {
460 std::shared_ptr<OHOS::MMI::KeyOption> keyOption = std::make_shared<OHOS::MMI::KeyOption>();
461 keyOption = std::make_shared<OHOS::MMI::KeyOption>();
462 keyOption->SetFinalKey(OHOS::MMI::KeyEvent::KEYCODE_POWER);
463 keyOption->SetFinalKeyDown(true);
464 keyOption->SetFinalKeyDownDuration(0);
465 powerKeySubscribeId_ = MMI::InputManager::GetInstance()->SubscribeKeyEvent(keyOption,
466 [](std::shared_ptr<OHOS::MMI::KeyEvent> keyEvent) {
467 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_MMI_INPUT_POWER_KEY, keyEvent->GetKeyCode());
468 });
469 RESSCHED_LOGI("Subscribe power key event successfully.");
470 #ifdef RESOURCE_SCHEDULE_SERVICE_WITH_APP_NAP_ENABLE
471 if (!isNeedReport_) {
472 RESSCHED_LOGI("not need init mmi observer.");
473 return;
474 }
475 RESSCHED_LOGI("ObserverManager Init mmi observer.");
476 if (!mmiEventObserver_) {
477 mmiEventObserver_ = std::make_shared<MmiObserver>();
478 }
479
480 auto res = MMI::InputManager::GetInstance()->AddInputEventObserver(mmiEventObserver_);
481 if (res == OPERATION_SUCCESS) {
482 RESSCHED_LOGD("ObserverManager init mmiEventObserver successfully");
483 } else {
484 RESSCHED_LOGE("ObserverManager init mmiEventObserver failed");
485 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
486 "COMPONENT_NAME", "MAIN",
487 "ERR_TYPE", "register failure",
488 "ERR_MSG", "Register a mmi observer failed!");
489 return;
490 }
491 // Get all events registered in multimodal input.
492 GetAllMmiStatusData();
493 #endif
494 }
495
DisableMMiEventObserver()496 void ObserverManager::DisableMMiEventObserver()
497 {
498 RESSCHED_LOGI("Unsubscribes power key event");
499 MMI::InputManager::GetInstance()->UnsubscribeKeyEvent(powerKeySubscribeId_);
500 #ifdef RESOURCE_SCHEDULE_SERVICE_WITH_APP_NAP_ENABLE
501 RESSCHED_LOGI("Disable mmi observer");
502 if (!mmiEventObserver_) {
503 RESSCHED_LOGD("ObserverManager has been disable mmiEventObserver");
504 return;
505 }
506
507 auto res = MMI::InputManager::GetInstance()->RemoveInputEventObserver(mmiEventObserver_);
508 if (res == OPERATION_SUCCESS) {
509 RESSCHED_LOGD("ObserverManager disable mmiEventObserver successfully");
510 } else {
511 RESSCHED_LOGW("ObserverManager disable mmiEventObserver failed");
512 }
513 mmiEventObserver_ = nullptr;
514 #endif
515 }
516
517 #ifdef RESOURCE_SCHEDULE_SERVICE_WITH_APP_NAP_ENABLE
GetAllMmiStatusData()518 void ObserverManager::GetAllMmiStatusData()
519 {
520 RESSCHED_LOGI("get all mmi subscribed events.");
521 std::map<std::tuple<int32_t, int32_t, std::string>, int32_t> mmiStatusData;
522 MMI::InputManager::GetInstance()->GetAllMmiSubscribedEvents(mmiStatusData);
523 if (mmiStatusData.empty()) {
524 RESSCHED_LOGI("get mmi subscribed events is null.");
525 return;
526 }
527
528 for (auto data = mmiStatusData.begin(); data != mmiStatusData.end(); ++data) {
529 int32_t pid = std::get<TUPLE_PID>(data->first);
530 int32_t uid = std::get<TUPLE_UID>(data->first);
531 std::string bundleName = std::get<TUPLE_NAME>(data->first);
532 int32_t status = data->second;
533 RESSCHED_LOGD(
534 "get mmi subscribed events, pid:%{public}d, uid:%{public}d, bundleName:%{public}s, status:%{public}d.",
535 pid, uid, bundleName.c_str(), status);
536 nlohmann::json payload;
537 payload["pid"] = pid;
538 payload["uid"] = uid;
539 payload["bundleName"] = bundleName;
540 payload["status"] = status;
541 ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_MMI_STATUS_CHANGE, 0, payload);
542 }
543 }
544 #endif
545 #endif
546
InitDisplayModeObserver()547 void ObserverManager::InitDisplayModeObserver()
548 {
549 RESSCHED_LOGI("ObserverManager Init display mode observer.");
550 bool isFoldable = OHOS::Rosen::DisplayManager::GetInstance().IsFoldable();
551 if (!isFoldable) {
552 RESSCHED_LOGI("ObserverManager Init display mode observer return for foldable.");
553 return;
554 }
555
556 if (!foldDisplayModeObserver_) {
557 foldDisplayModeObserver_ = new (std::nothrow)FoldDisplayModeObserver();
558 if (foldDisplayModeObserver_ == nullptr) {
559 RESSCHED_LOGE("Failed to create fold ChangeListener due to no memory");
560 return;
561 }
562 }
563
564 auto ret = OHOS::Rosen::DisplayManager::GetInstance().RegisterDisplayModeListener(foldDisplayModeObserver_);
565 if (ret == OHOS::Rosen::DMError::DM_OK) {
566 RESSCHED_LOGI("ObserverManager init displayModeObserver successfully");
567 auto displayMode = OHOS::Rosen::DisplayManager::GetInstance().GetFoldDisplayMode();
568 foldDisplayModeObserver_->OnDisplayModeChanged(displayMode);
569 } else {
570 RESSCHED_LOGW("ObserverManager init displayModeObserver failed");
571 foldDisplayModeObserver_ = nullptr;
572 return;
573 }
574 }
575
DisableDisplayModeObserver()576 void ObserverManager::DisableDisplayModeObserver()
577 {
578 RESSCHED_LOGI("ObserverManager Disable display mode observer.");
579 if (!foldDisplayModeObserver_) {
580 RESSCHED_LOGE("ObserverManager has been disable displayModeObserver");
581 return;
582 }
583
584 auto ret = OHOS::Rosen::DisplayManager::GetInstance().UnregisterDisplayModeListener(foldDisplayModeObserver_);
585 if (ret == OHOS::Rosen::DMError::DM_OK) {
586 RESSCHED_LOGI("ObserverManager disable displayModeObserver successfully");
587 } else {
588 RESSCHED_LOGW("ObserverManager disable displayModeObserver failed");
589 return;
590 }
591 foldDisplayModeObserver_ = nullptr;
592 }
593
InitConnectionSubscriber()594 void ObserverManager::InitConnectionSubscriber()
595 {
596 if (connectionSubscriber_ == nullptr) {
597 connectionSubscriber_ = std::make_shared<ConnectionSubscriber>();
598 }
599
600 auto res = AbilityRuntime::ConnectionObserverClient::GetInstance().RegisterObserver(connectionSubscriber_);
601 if (res == OPERATION_SUCCESS) {
602 RESSCHED_LOGD("ObserverManager init connectionSubscriber successfully");
603 } else {
604 RESSCHED_LOGW("ObserverManager init connectionSubscriber failed");
605 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
606 "COMPONENT_NAME", "MAIN",
607 "ERR_TYPE", "register failure",
608 "ERR_MSG", "Register a connect subscriber failed!");
609 }
610 }
611
DisableConnectionSubscriber()612 void ObserverManager::DisableConnectionSubscriber()
613 {
614 RESSCHED_LOGI("Disable connect subscriber state listener");
615 if (connectionSubscriber_ == nullptr) {
616 RESSCHED_LOGD("ObserverManager has been disable connect subscriber state listener");
617 return;
618 }
619
620 auto res = AbilityRuntime::ConnectionObserverClient::GetInstance().UnregisterObserver(connectionSubscriber_);
621 if (res == OPERATION_SUCCESS) {
622 RESSCHED_LOGD("ObserverManager disable connect subscriber state listener successfully");
623 } else {
624 RESSCHED_LOGW("ObserverManager disable connect subscriber state listener failed");
625 }
626
627 connectionSubscriber_ = nullptr;
628 }
629
InitDataShareObserver()630 void ObserverManager::InitDataShareObserver()
631 {
632 RESSCHED_LOGI("ObserverManager Init dataShare observer.");
633 OOBEManager::GetInstance().StartListen();
634 }
635
DisableDataShareObserver()636 void ObserverManager::DisableDataShareObserver()
637 {
638 RESSCHED_LOGI("Disable dataShare observer.");
639 OOBEManager::GetInstance().UnregisterObserver();
640 }
641 #ifdef RESSCHED_MULTIMEDIA_AV_SESSION_ENABLE
InitAVSessionStateChangeListener()642 void ObserverManager::InitAVSessionStateChangeListener()
643 {
644 if (avSessionStateListener_ == nullptr) {
645 avSessionStateListener_ = std::make_shared<AvSessionStateListener>();
646 }
647
648 auto res = AVSession::AVSessionManager::GetInstance().RegisterSessionListenerForAllUsers(avSessionStateListener_);
649 if (res == OPERATION_SUCCESS) {
650 RESSCHED_LOGI("ObserverManager init session state listener successfully");
651 } else {
652 RESSCHED_LOGW("ObserverManager init session state listener failed");
653 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
654 "COMPONENT_NAME", "MAIN",
655 "ERR_TYPE", "register failure",
656 "ERR_MSG", "Register a session state listener failed!");
657 }
658 }
659
DisableAVSessionStateChangeListener()660 void ObserverManager::DisableAVSessionStateChangeListener()
661 {
662 RESSCHED_LOGI("Disable session state listener");
663 avSessionStateListener_ = nullptr;
664 }
665 #endif
666 #ifndef RESOURCE_REQUEST_REQUEST
InitDownloadUploadObserver()667 void ObserverManager::InitDownloadUploadObserver()
668 {
669 if (downLoadUploadObserver_ == nullptr) {
670 downLoadUploadObserver_ = std::make_shared<DownLoadUploadObserver>();
671 }
672
673 auto res = OHOS::Request::SubscribeRunningTaskCount(downLoadUploadObserver_);
674 if (res == OPERATION_SUCCESS) {
675 RESSCHED_LOGI("ObserverManager init download Upload observer successfully");
676 } else {
677 RESSCHED_LOGW("ObserverManager init download Upload observer failed");
678 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
679 "COMPONENT_NAME", "MAIN",
680 "ERR_TYPE", "register failure",
681 "ERR_MSG", "Register a download Upload observer failed!");
682 }
683 }
684
DisableDownloadUploadObserver()685 void ObserverManager::DisableDownloadUploadObserver()
686 {
687 OHOS::Request::UnsubscribeRunningTaskCount(downLoadUploadObserver_);
688 RESSCHED_LOGI("Disable download Upload observer");
689 downLoadUploadObserver_ = nullptr;
690 }
691 #endif
692
InitAccountObserver()693 void ObserverManager::InitAccountObserver()
694 {
695 RESSCHED_LOGI("InitAccountObserver");
696 if (!accountObserver_) {
697 AccountSA::OsAccountSubscribeInfo osAccountSubscribeInfo;
698 osAccountSubscribeInfo.SetOsAccountSubscribeType(AccountSA::OS_ACCOUNT_SUBSCRIBE_TYPE::ACTIVATING);
699 osAccountSubscribeInfo.SetName("ResschdeAccountActivatingSubscriber");
700 accountObserver_ = std::make_shared<AccountObserver>(osAccountSubscribeInfo);
701 }
702 if (!accountObserver_) {
703 RESSCHED_LOGE("account observer make failed");
704 }
705 ErrCode errCode = AccountSA::OsAccountManager::SubscribeOsAccount(accountObserver_);
706 if (errCode == ERR_OK) {
707 RESSCHED_LOGI("account observer register success");
708 } else {
709 RESSCHED_LOGW("account observer register failed");
710 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
711 "COMPONENT_NAME", "MAIN",
712 "ERR_TYPE", "register failure",
713 "ERR_MSG", "Register a account observer failed!");
714 }
715 }
716
DisableAccountObserver()717 void ObserverManager::DisableAccountObserver()
718 {
719 RESSCHED_LOGI("account sa removed");
720 }
721
ObserverManagerInit()722 extern "C" void ObserverManagerInit()
723 {
724 auto instance = ObserverManager::GetInstance();
725 if (instance) {
726 instance->Init();
727 } else {
728 RESSCHED_LOGE("ObserverManager GetInstance failed");
729 }
730 }
731
ObserverManagerDisable()732 extern "C" void ObserverManagerDisable()
733 {
734 ObserverManager::GetInstance()->Disable();
735 }
736 } // namespace ResourceSchedule
737 } // namespace OHOS