• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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