• 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 "app_mgr_interface.h"
22 #include "app_startup_scene_rec.h"
23 #include "display_manager.h"
24 #include "dm_common.h"
25 #include "hisysevent.h"
26 #ifdef RESOURCE_SCHEDULE_SERVICE_WITH_APP_NAP_ENABLE
27 #include "hisysevent_manager.h"
28 #endif
29 #include "ipc_skeleton.h"
30 #include "iservice_registry.h"
31 #include "parameters.h"
32 #include "res_sched_log.h"
33 #include "res_sched_mgr.h"
34 #include "res_type.h"
35 #include "connection_observer_client.h"
36 #ifdef RESSCHED_TELEPHONY_STATE_REGISTRY_ENABLE
37 #include "telephony_observer_client.h"
38 #endif
39 #include "oobe_manager.h"
40 #include "system_ability_definition.h"
41 #ifdef DEVICE_MOVEMENT_PERCEPTION_ENABLE
42 #include "movement_client.h"
43 #include "movement_data_utils.h"
44 #endif
45 #ifdef MMI_ENABLE
46 #include "input_manager.h"
47 #endif
48 #include "os_account_manager.h"
49 #ifdef RESSCHED_MULTIMEDIA_AV_SESSION_ENABLE
50 #include "avsession_manager.h"
51 #endif
52 #ifdef CONFIG_BGTASK_MGR
53 #include "background_task_mgr_helper.h"
54 #include "background_task_observer.h"
55 #endif
56 
57 namespace OHOS {
58 namespace ResourceSchedule {
59 const static int8_t OPERATION_SUCCESS = 0;
60 const static int32_t TUPLE_PID = 0;
61 const static int32_t TUPLE_UID = 1;
62 const static int32_t TUPLE_NAME = 2;
63 const static bool DEVICE_MOVEMENT_OBSERVER_ENABLE =
64     system::GetBoolParameter("persist.sys.ressched_device_movement_observer_switch", true);
65 const static char* RES_SCHED_CG_EXT_SO = "libcgroup_sched_ext.z.so";
66 
Init()67 void ObserverManager::Init()
68 {
69     InitSysAbilityListener();
70     AppStartupSceneRec::GetInstance().Init();
71 }
72 
Disable()73 void ObserverManager::Disable()
74 {
75     AppStartupSceneRec::GetInstance().Deinit();
76     handleObserverMap_.clear();
77     removeObserverMap_.clear();
78 #ifdef RESOURCE_SCHEDULE_SERVICE_WITH_APP_NAP_ENABLE
79     DisableHiSysEventObserver();
80 #endif
81     DisableTelephonyObserver();
82     sysAbilityListener_ = nullptr;
83 }
84 
InitObserverCbMap()85 void ObserverManager::InitObserverCbMap()
86 {
87     handleObserverMap_ = {
88 #ifdef RESOURCE_SCHEDULE_SERVICE_WITH_APP_NAP_ENABLE
89         { DFX_SYS_EVENT_SERVICE_ABILITY_ID, []() { ObserverManager::GetInstance()->InitHiSysEventObserver(); }},
90 #endif
91 #ifdef MMI_ENABLE
92         { MULTIMODAL_INPUT_SERVICE_ID, []() { ObserverManager::GetInstance()->InitMMiEventObserver(); }},
93 #endif
94         { TELEPHONY_STATE_REGISTRY_SYS_ABILITY_ID, []() { ObserverManager::GetInstance()->InitTelephonyObserver(); }},
95         { AUDIO_POLICY_SERVICE_ID, []() { ObserverManager::GetInstance()->InitAudioObserver(); }},
96         { MSDP_MOVEMENT_SERVICE_ID, []() { ObserverManager::GetInstance()->InitDeviceMovementObserver(); }},
97         { DISPLAY_MANAGER_SERVICE_ID, []() { ObserverManager::GetInstance()->InitDisplayModeObserver(); }},
98         { DISPLAY_MANAGER_SERVICE_SA_ID, []() { ObserverManager::GetInstance()->InitDisplayOrientationObserver(); }},
99         { ABILITY_MGR_SERVICE_ID, []() { ObserverManager::GetInstance()->InitConnectionSubscriber(); }},
100         { DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID, []() { ObserverManager::GetInstance()->InitDataShareObserver(); }},
101 #ifdef RESOURCE_REQUEST_REQUEST
102         { DOWNLOAD_SERVICE_ID, []() { ObserverManager::GetInstance()->InitDownloadUploadObserver(); }},
103 #endif
104 #ifdef RESSCHED_MULTIMEDIA_AV_SESSION_ENABLE
105         { AVSESSION_SERVICE_ID, []() { ObserverManager::GetInstance()->InitAVSessionStateChangeListener(); }},
106 #endif
107         { SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN, []() { ObserverManager::GetInstance()->InitAccountObserver(); }},
108         { WINDOW_MANAGER_SERVICE_ID, []() { ObserverManager::GetInstance()->InitWindowStateObserver(); }},
109         { APP_MGR_SERVICE_ID, []() { ObserverManager::GetInstance()->SubscribeAppState(); }},
110 #ifdef CONFIG_BGTASK_MGR
111         { BACKGROUND_TASK_MANAGER_SERVICE_ID, []() { ObserverManager::GetInstance()->InitBackgroundTask(); }},
112 #endif
113     };
114     InitRemoveObserverCbMap();
115 }
116 
InitRemoveObserverCbMap()117 void ObserverManager::InitRemoveObserverCbMap()
118 {
119     removeObserverMap_ = {
120 #ifdef RESOURCE_SCHEDULE_SERVICE_WITH_APP_NAP_ENABLE
121         { DFX_SYS_EVENT_SERVICE_ABILITY_ID, []() { ObserverManager::GetInstance()->DisableHiSysEventObserver(); }},
122 #endif
123 #ifdef MMI_ENABLE
124         { MULTIMODAL_INPUT_SERVICE_ID, []() { ObserverManager::GetInstance()->DisableMMiEventObserver(); }},
125 #endif
126         { TELEPHONY_STATE_REGISTRY_SYS_ABILITY_ID, []() {
127             ObserverManager::GetInstance()->DisableTelephonyObserver(); }},
128         { AUDIO_POLICY_SERVICE_ID, []() { ObserverManager::GetInstance()->DisableAudioObserver(); }},
129         { MSDP_MOVEMENT_SERVICE_ID, []() { ObserverManager::GetInstance()->DisableDeviceMovementObserver(); }},
130         { DISPLAY_MANAGER_SERVICE_ID, []() { ObserverManager::GetInstance()->DisableDisplayModeObserver(); }},
131         { DISPLAY_MANAGER_SERVICE_SA_ID, []() { ObserverManager::GetInstance()->DisableDisplayOrientationObserver(); }},
132         { ABILITY_MGR_SERVICE_ID, []() { ObserverManager::GetInstance()->DisableConnectionSubscriber(); }},
133         { DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID, []() {
134             ObserverManager::GetInstance()->DisableDataShareObserver(); }},
135 #ifdef RESOURCE_REQUEST_REQUEST
136         { DOWNLOAD_SERVICE_ID, []() { ObserverManager::GetInstance()->DisableDownloadUploadObserver(); }},
137 #endif
138 #ifdef RESSCHED_MULTIMEDIA_AV_SESSION_ENABLE
139         { AVSESSION_SERVICE_ID, []() { ObserverManager::GetInstance()->DisableAVSessionStateChangeListener(); }},
140 #endif
141         { SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN, []() { ObserverManager::GetInstance()->DisableAccountObserver(); }},
142         { WINDOW_MANAGER_SERVICE_ID, []() { ObserverManager::GetInstance()->DisableWindowStateObserver(); }},
143         { APP_MGR_SERVICE_ID, []() { ObserverManager::GetInstance()->UnsubscribeAppState(); }},
144 #ifdef CONFIG_BGTASK_MGR
145         { BACKGROUND_TASK_MANAGER_SERVICE_ID, []() { ObserverManager::GetInstance()->DisableBackgroundTask(); }},
146 #endif
147     };
148 }
149 
InitSysAbilityListener()150 void ObserverManager::InitSysAbilityListener()
151 {
152     if (sysAbilityListener_ != nullptr) {
153         return;
154     }
155 
156     sysAbilityListener_ = new (std::nothrow) SystemAbilityStatusChangeListener();
157     if (sysAbilityListener_ == nullptr) {
158         RESSCHED_LOGE("Failed to create statusChangeListener due to no memory");
159         return;
160     }
161 
162     sptr<ISystemAbilityManager> systemAbilityManager
163         = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
164     if (systemAbilityManager == nullptr) {
165         sysAbilityListener_ = nullptr;
166         RESSCHED_LOGE("systemAbilityManager is null");
167         return;
168     }
169     InitObserverCbMap();
170     GetReportFunc();
171 
172     AddItemToSysAbilityListener(DFX_SYS_EVENT_SERVICE_ABILITY_ID, systemAbilityManager);
173     AddItemToSysAbilityListener(TELEPHONY_STATE_REGISTRY_SYS_ABILITY_ID, systemAbilityManager);
174     AddItemToSysAbilityListener(AUDIO_POLICY_SERVICE_ID, systemAbilityManager);
175     AddItemToSysAbilityListener(MSDP_MOVEMENT_SERVICE_ID, systemAbilityManager);
176     AddItemToSysAbilityListener(MULTIMODAL_INPUT_SERVICE_ID, systemAbilityManager);
177     AddItemToSysAbilityListener(DISPLAY_MANAGER_SERVICE_ID, systemAbilityManager);
178     AddItemToSysAbilityListener(DISPLAY_MANAGER_SERVICE_SA_ID, systemAbilityManager);
179     AddItemToSysAbilityListener(ABILITY_MGR_SERVICE_ID, systemAbilityManager);
180     AddItemToSysAbilityListener(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID, systemAbilityManager);
181 #ifdef RESOURCE_REQUEST_REQUEST
182     AddItemToSysAbilityListener(DOWNLOAD_SERVICE_ID, systemAbilityManager);
183 #endif
184 #ifdef RESSCHED_MULTIMEDIA_AV_SESSION_ENABLE
185     AddItemToSysAbilityListener(AVSESSION_SERVICE_ID, systemAbilityManager);
186 #endif
187     AddItemToSysAbilityListener(SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN, systemAbilityManager);
188     AddItemToSysAbilityListener(WINDOW_MANAGER_SERVICE_ID, systemAbilityManager);
189 #ifdef CONFIG_BGTASK_MGR
190     AddItemToSysAbilityListener(BACKGROUND_TASK_MANAGER_SERVICE_ID, systemAbilityManager);
191 #endif
192     AddItemToSysAbilityListener(APP_MGR_SERVICE_ID, systemAbilityManager);
193 }
194 
AddItemToSysAbilityListener(int32_t systemAbilityId,sptr<ISystemAbilityManager> & systemAbilityManager)195 inline void ObserverManager::AddItemToSysAbilityListener(int32_t systemAbilityId,
196     sptr<ISystemAbilityManager>& systemAbilityManager)
197 {
198     if (systemAbilityManager->SubscribeSystemAbility(systemAbilityId, sysAbilityListener_) != ERR_OK) {
199         sysAbilityListener_ = nullptr;
200         RESSCHED_LOGE("%{public}s: subscribe system ability id: %{public}d failed", __func__, systemAbilityId);
201         HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
202                         "COMPONENT_NAME", "MAIN",
203                         "ERR_TYPE", "register failure",
204                         "ERR_MSG", "Register a staus change listener of the " + std::to_string(systemAbilityId) + " SA failed!");
205     } else {
206         RESSCHED_LOGI("%{public}s: subscribe system ability id: %{public}d succeed", __func__, systemAbilityId);
207     }
208 }
209 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)210 void ObserverManager::SystemAbilityStatusChangeListener::OnAddSystemAbility(
211     int32_t systemAbilityId, const std::string& deviceId)
212 {
213     RESSCHED_LOGI("Add system ability, system ability id: %{public}d", systemAbilityId);
214     auto funcIter = ObserverManager::GetInstance()->handleObserverMap_.find(systemAbilityId);
215     if (funcIter != ObserverManager::GetInstance()->handleObserverMap_.end()) {
216         auto function = funcIter->second;
217             if (function) {
218                 function();
219             }
220     }
221 }
222 
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)223 void ObserverManager::SystemAbilityStatusChangeListener::OnRemoveSystemAbility(
224     int32_t systemAbilityId, const std::string& deviceId)
225 {
226     RESSCHED_LOGD("Remove system ability, system ability id: %{public}d", systemAbilityId);
227     auto funcIter = ObserverManager::GetInstance()->removeObserverMap_.find(systemAbilityId);
228     if (funcIter != ObserverManager::GetInstance()->removeObserverMap_.end()) {
229         auto function = funcIter->second;
230             if (function) {
231                 function();
232             }
233     }
234 }
235 
GetReportFunc()236 void ObserverManager::GetReportFunc()
237 {
238     auto handle = dlopen(RES_SCHED_CG_EXT_SO, RTLD_NOW);
239     if (!handle) {
240         RESSCHED_LOGE("GetReportFunc dlopen failed");
241         return;
242     }
243     ReportFunc reportFunc = reinterpret_cast<ReportFunc>(dlsym(handle, "IsNeedReportEvents"));
244     if (!reportFunc) {
245         RESSCHED_LOGE("GetReportFunc dlsym 'IsNeedReportEvents' failed");
246         dlclose(handle);
247         return;
248     }
249 
250     isNeedReport_ = reportFunc();
251 }
252 
253 #ifdef RESOURCE_SCHEDULE_SERVICE_WITH_APP_NAP_ENABLE
InitHiSysEventObserver()254 void ObserverManager::InitHiSysEventObserver()
255 {
256     RESSCHED_LOGI("Init hisysevent observer");
257     if (!hiSysEventObserver_) {
258         hiSysEventObserver_ = std::make_shared<ResourceSchedule::HiSysEventObserver>();
259     }
260 
261     HiviewDFX::ListenerRule audioStreamState("AUDIO", "STREAM_CHANGE");
262     HiviewDFX::ListenerRule cameraConnectState("CAMERA", "CAMERA_CONNECT");
263     HiviewDFX::ListenerRule cameraDisconnectState("CAMERA", "CAMERA_DISCONNECT");
264     HiviewDFX::ListenerRule brSwitchState("BT_SERVICE", "BR_SWITCH_STATE");
265     HiviewDFX::ListenerRule bleSwitchState("BT_SERVICE", "BLE_SWITCH_STATE");
266     HiviewDFX::ListenerRule wifiConnectionState("COMMUNICATION", "WIFI_CONNECTION");
267     HiviewDFX::ListenerRule wifiScanState("COMMUNICATION", "WIFI_SCAN");
268     HiviewDFX::ListenerRule avCodecStartState("AV_CODEC", "CODEC_START_INFO");
269     HiviewDFX::ListenerRule avCodecStopState("AV_CODEC", "CODEC_STOP_INFO");
270     HiviewDFX::ListenerRule screenCaptureState("MULTIMEDIA", "PLAYER_STATE");
271     std::vector<HiviewDFX::ListenerRule> sysRules;
272     sysRules.push_back(audioStreamState);
273     sysRules.push_back(cameraConnectState);
274     sysRules.push_back(cameraDisconnectState);
275     sysRules.push_back(brSwitchState);
276     sysRules.push_back(bleSwitchState);
277     sysRules.push_back(wifiConnectionState);
278     sysRules.push_back(wifiScanState);
279     sysRules.push_back(avCodecStartState);
280     sysRules.push_back(avCodecStopState);
281     sysRules.push_back(screenCaptureState);
282     if (isNeedReport_) {
283         HiviewDFX::ListenerRule runninglockState("POWER", "RUNNINGLOCK");
284         sysRules.push_back(runninglockState);
285     }
286     auto res = HiviewDFX::HiSysEventManager::AddListener(hiSysEventObserver_, sysRules);
287     if (res == 0) {
288         RESSCHED_LOGD("ObserverManager init hisysevent observer successfully");
289     } else {
290         RESSCHED_LOGW("ObserverManager init hisysevent observer failed");
291         HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
292                         "COMPONENT_NAME", "MAIN",
293                         "ERR_TYPE", "register failure",
294                         "ERR_MSG", "Register a hisysevent observer failed!");
295     }
296 }
297 
DisableHiSysEventObserver()298 void ObserverManager::DisableHiSysEventObserver()
299 {
300     RESSCHED_LOGI("Disable hisysevent observer");
301     if (hiSysEventObserver_ == nullptr) {
302         return;
303     }
304 
305     auto res = HiviewDFX::HiSysEventManager::RemoveListener(hiSysEventObserver_);
306     if (res == 0) {
307         RESSCHED_LOGD("ObserverManager disable hisysevent observer successfully");
308     } else {
309         RESSCHED_LOGW("ObserverManager disable hisysevent observer failed");
310     }
311     hiSysEventObserver_ = nullptr;
312 }
313 #endif
314 
InitTelephonyObserver()315 void ObserverManager::InitTelephonyObserver()
316 {
317 #ifdef RESSCHED_TELEPHONY_STATE_REGISTRY_ENABLE
318     RESSCHED_LOGI("Init telephony observer");
319     if (!telephonyObserver_) {
320         telephonyObserver_ = std::make_unique<SchedTelephonyObserver>().release();
321     }
322     slotId_ = 0;
323     auto res = Telephony::TelephonyObserverClient::GetInstance().AddStateObserver(
324         telephonyObserver_, slotId_, Telephony::TelephonyObserverBroker::OBSERVER_MASK_CALL_STATE, false);
325     if (res == OPERATION_SUCCESS) {
326         RESSCHED_LOGD("ObserverManager init telephony observer successfully");
327     } else {
328         RESSCHED_LOGW("ObserverManager init telephony observer failed");
329         HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
330                         "COMPONENT_NAME", "MAIN",
331                         "ERR_TYPE", "register failure",
332                         "ERR_MSG", "Register a telephony observer failed!");
333     }
334 #endif
335 }
336 
DisableTelephonyObserver()337 void ObserverManager::DisableTelephonyObserver()
338 {
339 #ifdef RESSCHED_TELEPHONY_STATE_REGISTRY_ENABLE
340     RESSCHED_LOGI("Disable telephony observer");
341     if (!telephonyObserver_) {
342         RESSCHED_LOGD("ObserverManager has been disable telephony observer");
343         return ;
344     }
345     slotId_ = 0;
346     Telephony::TelephonyObserverClient::GetInstance().RemoveStateObserver(
347         slotId_, Telephony::TelephonyObserverBroker::OBSERVER_MASK_CALL_STATE);
348     telephonyObserver_ = nullptr;
349 #endif
350 }
351 
InitAudioObserver()352 void ObserverManager::InitAudioObserver()
353 {
354 #ifdef RESSCHED_AUDIO_FRAMEWORK_ENABLE
355     pid_ = getpid();
356     RESSCHED_LOGI("ObserverManager Init audio observer, pid: %{public}d", pid_);
357     if (!audioObserver_) {
358         audioObserver_ = std::make_shared<AudioObserver>();
359     }
360     auto res = AudioStandard::AudioStreamManager::GetInstance()->RegisterAudioRendererEventListener(pid_,
361         audioObserver_);
362     if (res != OPERATION_SUCCESS) {
363         RESSCHED_LOGW("ObserverManager init audioRenderStateObserver failed");
364         HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
365                         "COMPONENT_NAME", "MAIN", "ERR_TYPE", "register failure",
366                         "ERR_MSG", "Register a audio observer failed!");
367     }
368     res = -1;
369     auto audioSystemMgr = AudioStandard::AudioSystemManager::GetInstance();
370     if (audioSystemMgr) {
371         auto groupMgr = audioSystemMgr->GetGroupManager(AudioStandard::DEFAULT_VOLUME_GROUP_ID);
372         if (groupMgr) {
373             res = groupMgr->SetRingerModeCallback(pid_, audioObserver_);
374         }
375     }
376     if (res != OPERATION_SUCCESS) {
377         RESSCHED_LOGW("ObserverManager init audioRingModeObserver failed");
378     }
379     res = AudioStandard::AudioSystemManager::GetInstance()->RegisterVolumeKeyEventCallback(pid_, audioObserver_);
380     if (res != OPERATION_SUCCESS) {
381         RESSCHED_LOGW("ObserverManager init audioVolumeKeyObserver failed");
382     }
383     res = AudioStandard::AudioSystemManager::GetInstance()->SetAudioSceneChangeCallback(audioObserver_);
384     if (res != OPERATION_SUCCESS) {
385         RESSCHED_LOGW("ObserverManager init audioSceneKeyObserver failed");
386     }
387     AudioStandard::AudioRendererInfo rendererInfo = {};
388     rendererInfo.streamUsage = AudioStandard::StreamUsage::STREAM_USAGE_MUSIC;
389     res = AudioStandard::AudioRoutingManager::GetInstance()
390         ->SetPreferredOutputDeviceChangeCallback(rendererInfo, audioObserver_);
391     if (res != OPERATION_SUCCESS) {
392         RESSCHED_LOGW("ObserverManager init audioOutputDeviceChangeObserver failed");
393     }
394     audioObserver_->Init();
395 #endif
396 }
397 
DisableAudioObserver()398 void ObserverManager::DisableAudioObserver()
399 {
400 #ifdef RESSCHED_AUDIO_FRAMEWORK_ENABLE
401     RESSCHED_LOGI("Disable telephony observer");
402     if (!audioObserver_) {
403         RESSCHED_LOGD("ObserverManager has been disable audioObserver");
404         return ;
405     }
406 
407     auto res = AudioStandard::AudioStreamManager::GetInstance()->UnregisterAudioRendererEventListener(pid_);
408     if (res == OPERATION_SUCCESS) {
409         RESSCHED_LOGD("ObserverManager disable audioVolumeKeyObserver successfully");
410     } else {
411         RESSCHED_LOGW("ObserverManager disable audioVolumeKeyObserver failed");
412     }
413 
414     res = AudioStandard::AudioSystemManager::GetInstance()->UnsetRingerModeCallback(pid_);
415     if (res == OPERATION_SUCCESS) {
416         RESSCHED_LOGD("ObserverManager disable audioVolumeKeyObserver successfully");
417     } else {
418         RESSCHED_LOGW("ObserverManager disable audioVolumeKeyObserver failed");
419     }
420 
421     res = AudioStandard::AudioSystemManager::GetInstance()->UnregisterVolumeKeyEventCallback(pid_);
422     if (res == OPERATION_SUCCESS) {
423         RESSCHED_LOGD("ObserverManager disable audioVolumeKeyObserver successfully");
424     } else {
425         RESSCHED_LOGW("ObserverManager disable audioVolumeKeyObserver failed");
426     }
427 
428     res = AudioStandard::AudioSystemManager::GetInstance()->UnsetAudioSceneChangeCallback();
429     if (res == OPERATION_SUCCESS) {
430         RESSCHED_LOGD("ObserverManager disable audioSceneKeyObserver successfully");
431     } else {
432         RESSCHED_LOGW("ObserverManager disable audioSceneKeyObserver failed");
433     }
434     audioObserver_ = nullptr;
435 #endif
436 }
437 
InitDeviceMovementObserver()438 void ObserverManager::InitDeviceMovementObserver()
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("InitDeviceMovementObserver");
447     if (!deviceMovementObserver_) {
448         deviceMovementObserver_ = sptr<DeviceMovementObserver>(new DeviceMovementObserver());
449     }
450     if (Msdp::MovementClient::GetInstance().SubscribeCallback(
451         Msdp::MovementDataUtils::MovementType::TYPE_STILL, deviceMovementObserver_) != ERR_OK) {
452             HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
453                         "COMPONENT_NAME", "MAIN",
454                         "ERR_TYPE", "register failure",
455                         "ERR_MSG", "Register a device movement observer failed!");
456         }
457 #endif
458 }
459 
DisableDeviceMovementObserver()460 void ObserverManager::DisableDeviceMovementObserver()
461 {
462     if (!DEVICE_MOVEMENT_OBSERVER_ENABLE) {
463         RESSCHED_LOGI("Device movement observer is not enable");
464         return;
465     }
466 
467 #ifdef DEVICE_MOVEMENT_PERCEPTION_ENABLE
468     RESSCHED_LOGI("DisableDeviceMovementObserver");
469     if (!deviceMovementObserver_) {
470         RESSCHED_LOGD("ObserverManager has been disable deviceMovementObserver");
471         return;
472     }
473     Msdp::MovementClient::GetInstance().UnSubscribeCallback(
474         Msdp::MovementDataUtils::MovementType::TYPE_STILL, deviceMovementObserver_);
475     deviceMovementObserver_ = nullptr;
476 #endif
477 }
478 
479 #ifdef MMI_ENABLE
InitMMiEventObserver()480 void ObserverManager::InitMMiEventObserver()
481 {
482     std::shared_ptr<OHOS::MMI::KeyOption> keyOption = std::make_shared<OHOS::MMI::KeyOption>();
483     keyOption = std::make_shared<OHOS::MMI::KeyOption>();
484     keyOption->SetFinalKey(OHOS::MMI::KeyEvent::KEYCODE_POWER);
485     keyOption->SetFinalKeyDown(true);
486     keyOption->SetFinalKeyDownDuration(0);
487     powerKeySubscribeId_ = MMI::InputManager::GetInstance()->SubscribeKeyEvent(keyOption,
488         [](std::shared_ptr<OHOS::MMI::KeyEvent> keyEvent) {
489         ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_MMI_INPUT_POWER_KEY, keyEvent->GetKeyCode());
490     });
491     RESSCHED_LOGI("Subscribe power key event successfully.");
492 #ifdef RESOURCE_SCHEDULE_SERVICE_WITH_APP_NAP_ENABLE
493     if (!isNeedReport_) {
494         RESSCHED_LOGI("not need init mmi observer.");
495         return;
496     }
497     RESSCHED_LOGI("ObserverManager Init mmi observer.");
498     if (!mmiEventObserver_) {
499         mmiEventObserver_ = std::make_shared<MmiObserver>();
500     }
501 
502     auto res = MMI::InputManager::GetInstance()->AddInputEventObserver(mmiEventObserver_);
503     if (res == OPERATION_SUCCESS) {
504         RESSCHED_LOGD("ObserverManager init mmiEventObserver successfully");
505     } else {
506         RESSCHED_LOGE("ObserverManager init mmiEventObserver failed");
507         HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
508                         "COMPONENT_NAME", "MAIN",
509                         "ERR_TYPE", "register failure",
510                         "ERR_MSG", "Register a mmi observer failed!");
511         return;
512     }
513     // Get all events registered in multimodal input.
514     GetAllMmiStatusData();
515 #endif
516 }
517 
DisableMMiEventObserver()518 void ObserverManager::DisableMMiEventObserver()
519 {
520     RESSCHED_LOGI("Unsubscribes power key event");
521     MMI::InputManager::GetInstance()->UnsubscribeKeyEvent(powerKeySubscribeId_);
522 #ifdef RESOURCE_SCHEDULE_SERVICE_WITH_APP_NAP_ENABLE
523     RESSCHED_LOGI("Disable mmi observer");
524     if (!mmiEventObserver_) {
525         RESSCHED_LOGD("ObserverManager has been disable mmiEventObserver");
526         return;
527     }
528 
529     auto res = MMI::InputManager::GetInstance()->RemoveInputEventObserver(mmiEventObserver_);
530     if (res == OPERATION_SUCCESS) {
531         RESSCHED_LOGD("ObserverManager disable mmiEventObserver successfully");
532     } else {
533         RESSCHED_LOGW("ObserverManager disable mmiEventObserver failed");
534     }
535     mmiEventObserver_ = nullptr;
536 #endif
537 }
538 
539 #ifdef RESOURCE_SCHEDULE_SERVICE_WITH_APP_NAP_ENABLE
GetAllMmiStatusData()540 void ObserverManager::GetAllMmiStatusData()
541 {
542     RESSCHED_LOGI("get all mmi subscribed events.");
543     std::map<std::tuple<int32_t, int32_t, std::string>, int32_t> mmiStatusData;
544     MMI::InputManager::GetInstance()->GetAllMmiSubscribedEvents(mmiStatusData);
545     if (mmiStatusData.empty()) {
546         RESSCHED_LOGI("get mmi subscribed events is null.");
547         return;
548     }
549 
550     for (auto data = mmiStatusData.begin(); data != mmiStatusData.end(); ++data) {
551         int32_t pid = std::get<TUPLE_PID>(data->first);
552         int32_t uid = std::get<TUPLE_UID>(data->first);
553         std::string bundleName = std::get<TUPLE_NAME>(data->first);
554         int32_t status = data->second;
555         RESSCHED_LOGD(
556             "get mmi subscribed events, pid:%{public}d, uid:%{public}d, bundleName:%{public}s, status:%{public}d.",
557             pid, uid, bundleName.c_str(), status);
558         nlohmann::json payload;
559         payload["pid"] = pid;
560         payload["uid"] = uid;
561         payload["bundleName"] = bundleName;
562         payload["status"] = status;
563         ResSchedMgr::GetInstance().ReportData(ResType::RES_TYPE_MMI_STATUS_CHANGE, 0, payload);
564     }
565 }
566 #endif
567 #endif
568 
InitDisplayModeObserver()569 void ObserverManager::InitDisplayModeObserver()
570 {
571     RESSCHED_LOGI("ObserverManager Init display mode observer.");
572     bool isFoldable = OHOS::Rosen::DisplayManager::GetInstance().IsFoldable();
573     if (!isFoldable) {
574         RESSCHED_LOGI("ObserverManager Init display mode observer return for foldable.");
575         return;
576     }
577 
578     if (!foldDisplayModeObserver_) {
579         foldDisplayModeObserver_ = new (std::nothrow)FoldDisplayModeObserver();
580         if (foldDisplayModeObserver_ == nullptr) {
581             RESSCHED_LOGE("Failed to create fold ChangeListener due to no memory");
582             return;
583         }
584     }
585 
586     auto ret = OHOS::Rosen::DisplayManager::GetInstance().RegisterDisplayModeListener(foldDisplayModeObserver_);
587     if (ret == OHOS::Rosen::DMError::DM_OK) {
588         RESSCHED_LOGI("ObserverManager init displayModeObserver successfully");
589         auto displayMode = OHOS::Rosen::DisplayManager::GetInstance().GetFoldDisplayMode();
590         foldDisplayModeObserver_->OnDisplayModeChanged(displayMode);
591     } else {
592         RESSCHED_LOGW("ObserverManager init displayModeObserver failed");
593         foldDisplayModeObserver_ = nullptr;
594         return;
595     }
596 }
597 
DisableDisplayModeObserver()598 void ObserverManager::DisableDisplayModeObserver()
599 {
600     RESSCHED_LOGI("ObserverManager Disable display mode observer.");
601     if (!foldDisplayModeObserver_) {
602         RESSCHED_LOGE("ObserverManager has been disable displayModeObserver");
603         return;
604     }
605 
606     auto ret = OHOS::Rosen::DisplayManager::GetInstance().UnregisterDisplayModeListener(foldDisplayModeObserver_);
607     if (ret == OHOS::Rosen::DMError::DM_OK) {
608         RESSCHED_LOGI("ObserverManager disable displayModeObserver successfully");
609     } else {
610         RESSCHED_LOGW("ObserverManager disable displayModeObserver failed");
611         return;
612     }
613     foldDisplayModeObserver_ = nullptr;
614 }
615 
InitDisplayOrientationObserver()616 void ObserverManager::InitDisplayOrientationObserver()
617 {
618     RESSCHED_LOGI("ObserverManager Init display orientation observer.");
619     bool isFoldable = OHOS::Rosen::DisplayManager::GetInstance().IsFoldable();
620     if (!isFoldable) {
621         RESSCHED_LOGI("ObserverManager Init display mode observer return for foldable.");
622         return;
623     }
624 
625     if (!foldDisplayOrientationObserver_) {
626         foldDisplayOrientationObserver_ = new (std::nothrow)FoldDisplayOrientationObserver();
627         if (foldDisplayOrientationObserver_ == nullptr) {
628             RESSCHED_LOGE("Failed to create fold ChangeListener due to no memory");
629             return;
630         }
631     }
632 
633     auto ret = OHOS::Rosen::DisplayManager::GetInstance().RegisterDisplayListener(foldDisplayOrientationObserver_);
634     if (ret == OHOS::Rosen::DMError::DM_OK) {
635         RESSCHED_LOGI("ObserverManager init displayOrientationObserver successfully");
636     } else {
637         RESSCHED_LOGW("ObserverManager init displayOrientationObserver failed");
638         foldDisplayOrientationObserver_ = nullptr;
639         return;
640     }
641 }
642 
DisableDisplayOrientationObserver()643 void ObserverManager::DisableDisplayOrientationObserver()
644 {
645     RESSCHED_LOGI("ObserverManager Disable display orientation observer.");
646     if (!foldDisplayOrientationObserver_) {
647         RESSCHED_LOGE("ObserverManager has been disable displayModeObserver");
648         return;
649     }
650 
651     auto ret = OHOS::Rosen::DisplayManager::GetInstance().UnregisterDisplayListener(foldDisplayOrientationObserver_);
652     if (ret == OHOS::Rosen::DMError::DM_OK) {
653         RESSCHED_LOGI("ObserverManager disable displayModeObserver successfully");
654     } else {
655         RESSCHED_LOGW("ObserverManager disable displayModeObserver failed");
656         return;
657     }
658     foldDisplayOrientationObserver_ = nullptr;
659 }
660 
InitConnectionSubscriber()661 void ObserverManager::InitConnectionSubscriber()
662 {
663     if (connectionSubscriber_ == nullptr) {
664         connectionSubscriber_ = std::make_shared<ConnectionSubscriber>();
665     }
666 
667     auto res = AbilityRuntime::ConnectionObserverClient::GetInstance().RegisterObserver(connectionSubscriber_);
668     if (res == OPERATION_SUCCESS) {
669         RESSCHED_LOGD("ObserverManager init connectionSubscriber successfully");
670     } else {
671         RESSCHED_LOGW("ObserverManager init connectionSubscriber failed");
672         HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
673                         "COMPONENT_NAME", "MAIN",
674                         "ERR_TYPE", "register failure",
675                         "ERR_MSG", "Register a connect subscriber failed!");
676     }
677 }
678 
DisableConnectionSubscriber()679 void ObserverManager::DisableConnectionSubscriber()
680 {
681     RESSCHED_LOGI("Disable connect subscriber state listener");
682     if (connectionSubscriber_ == nullptr) {
683         RESSCHED_LOGD("ObserverManager has been disable connect subscriber state listener");
684         return;
685     }
686 
687     auto res = AbilityRuntime::ConnectionObserverClient::GetInstance().UnregisterObserver(connectionSubscriber_);
688     if (res == OPERATION_SUCCESS) {
689         RESSCHED_LOGD("ObserverManager disable connect subscriber state listener successfully");
690     } else {
691         RESSCHED_LOGW("ObserverManager disable connect subscriber state listener failed");
692     }
693 
694     connectionSubscriber_ = nullptr;
695 }
696 
InitDataShareObserver()697 void ObserverManager::InitDataShareObserver()
698 {
699     RESSCHED_LOGI("ObserverManager Init dataShare observer.");
700     OOBEManager::GetInstance().StartListen();
701 }
702 
DisableDataShareObserver()703 void ObserverManager::DisableDataShareObserver()
704 {
705     RESSCHED_LOGI("Disable dataShare observer.");
706     OOBEManager::GetInstance().UnregisterObserver();
707 }
708 #ifdef RESSCHED_MULTIMEDIA_AV_SESSION_ENABLE
InitAVSessionStateChangeListener()709 void ObserverManager::InitAVSessionStateChangeListener()
710 {
711     if (avSessionStateListener_ == nullptr) {
712         avSessionStateListener_ = std::make_shared<AvSessionStateListener>();
713     }
714 
715     auto res = AVSession::AVSessionManager::GetInstance().RegisterSessionListenerForAllUsers(avSessionStateListener_);
716     if (res == OPERATION_SUCCESS) {
717         RESSCHED_LOGI("ObserverManager init session state listener successfully");
718     } else {
719         RESSCHED_LOGW("ObserverManager init session state listener failed");
720         HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
721                         "COMPONENT_NAME", "MAIN",
722                         "ERR_TYPE", "register failure",
723                         "ERR_MSG", "Register a session state listener failed!");
724     }
725 }
726 
DisableAVSessionStateChangeListener()727 void ObserverManager::DisableAVSessionStateChangeListener()
728 {
729     RESSCHED_LOGI("Disable session state listener");
730     avSessionStateListener_ = nullptr;
731 }
732 #endif
733 #ifdef RESOURCE_REQUEST_REQUEST
InitDownloadUploadObserver()734 void ObserverManager::InitDownloadUploadObserver()
735 {
736     if (downLoadUploadObserver_ == nullptr) {
737         downLoadUploadObserver_ = std::make_shared<DownLoadUploadObserver>();
738     }
739 
740     auto res = OHOS::Request::SubscribeRunningTaskCount(downLoadUploadObserver_);
741     if (res == OPERATION_SUCCESS) {
742         RESSCHED_LOGI("ObserverManager init download Upload observer successfully");
743     } else {
744         RESSCHED_LOGW("ObserverManager init download Upload observer failed");
745         HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
746                         "COMPONENT_NAME", "MAIN",
747                         "ERR_TYPE", "register failure",
748                         "ERR_MSG", "Register a download Upload observer failed!");
749     }
750 }
751 
DisableDownloadUploadObserver()752 void ObserverManager::DisableDownloadUploadObserver()
753 {
754     OHOS::Request::UnsubscribeRunningTaskCount(downLoadUploadObserver_);
755     RESSCHED_LOGI("Disable download Upload observer");
756     downLoadUploadObserver_ = nullptr;
757 }
758 #endif
759 
InitAccountObserver()760 void ObserverManager::InitAccountObserver()
761 {
762     RESSCHED_LOGI("InitAccountObserver");
763     if (!accountObserver_) {
764         AccountSA::OsAccountSubscribeInfo osAccountSubscribeInfo;
765         osAccountSubscribeInfo.SetOsAccountSubscribeType(AccountSA::OS_ACCOUNT_SUBSCRIBE_TYPE::ACTIVATING);
766         osAccountSubscribeInfo.SetName("ResschdeAccountActivatingSubscriber");
767         accountObserver_ = std::make_shared<AccountObserver>(osAccountSubscribeInfo);
768     }
769     if (!accountObserver_) {
770         RESSCHED_LOGE("account observer make failed");
771     }
772     ErrCode errCode = AccountSA::OsAccountManager::SubscribeOsAccount(accountObserver_);
773     if (errCode == ERR_OK) {
774         RESSCHED_LOGI("account observer register success");
775     } else {
776         RESSCHED_LOGW("account observer register failed");
777         HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
778                         "COMPONENT_NAME", "MAIN",
779                         "ERR_TYPE", "register failure",
780                         "ERR_MSG", "Register a account observer failed!");
781     }
782 }
783 
InitWindowStateObserver()784 void ObserverManager::InitWindowStateObserver()
785 {
786     if (!windowStateObserver_) {
787         windowStateObserver_ = new (std::nothrow)WindowStateObserver();
788         if (windowStateObserver_) {
789             if (OHOS::Rosen::WindowManager::GetInstance().
790             RegisterFocusChangedListener(windowStateObserver_) != OHOS::Rosen::WMError::WM_OK) {
791                 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT",
792                                 HiviewDFX::HiSysEvent::EventType::FAULT,
793                                 "COMPONENT_NAME", "MAIN", "ERR_TYPE", "register failure",
794                                 "ERR_MSG", "Register a listener of window focus change failed.");
795             }
796         }
797     }
798     if (!windowVisibilityObserver_) {
799         windowVisibilityObserver_ = new (std::nothrow)WindowVisibilityObserver();
800         if (windowVisibilityObserver_) {
801             if (OHOS::Rosen::WindowManager::GetInstance().
802             RegisterVisibilityChangedListener(windowVisibilityObserver_) != OHOS::Rosen::WMError::WM_OK) {
803                 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT",
804                                 HiviewDFX::HiSysEvent::EventType::FAULT,
805                                 "COMPONENT_NAME", "MAIN", "ERR_TYPE", "register failure",
806                                 "ERR_MSG", "Register a listener of window visibility change failed.");
807             }
808         }
809     }
810     if (!windowDrawingContentObserver_) {
811         windowDrawingContentObserver_ = new (std::nothrow)WindowDrawingContentObserver();
812         if (windowDrawingContentObserver_) {
813             if (OHOS::Rosen::WindowManager::GetInstance().
814                 RegisterDrawingContentChangedListener(windowDrawingContentObserver_) != OHOS::Rosen::WMError::WM_OK) {
815                     HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT",
816                                     HiviewDFX::HiSysEvent::EventType::FAULT,
817                                     "COMPONENT_NAME", "MAIN", "ERR_TYPE", "register failure",
818                                     "ERR_MSG", "Register a listener of window draw content change failed.");
819             }
820         }
821     }
822     SubscribeWindowModeChange();
823     SubscribePipChange();
824     InitWindowStyleObserver();
825     RESSCHED_LOGI("%{public}s success.", __func__);
826 }
827 
SubscribeWindowModeChange()828 void ObserverManager::SubscribeWindowModeChange()
829 {
830     if (!windowModeObserver_) {
831         windowModeObserver_ = new (std::nothrow)WindowModeObserver();
832         if (windowModeObserver_) {
833             if (OHOS::Rosen::WindowManager::GetInstance().
834                 RegisterWindowModeChangedListener(windowModeObserver_) != OHOS::Rosen::WMError::WM_OK) {
835                     RESSCHED_LOGE("RegisterWindowModeChangedListener fail");
836                     HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS,
837                                     "INIT_FAULT", HiviewDFX::HiSysEvent::EventType::FAULT,
838                                     "COMPONENT_NAME", "MAIN", "ERR_TYPE", "register failure",
839                                     "ERR_MSG", "Register a listener of window mode content change failed.");
840             }
841         }
842     }
843 }
844 
SubscribePipChange()845 void ObserverManager::SubscribePipChange()
846 {
847     if (!pipStateObserver_) {
848         pipStateObserver_ = new (std::nothrow)PiPStateObserver();
849         if (!pipStateObserver_) {
850             RESSCHED_LOGI("new PiPStateObserver fail");
851             return;
852         }
853         if (OHOS::Rosen::WindowManagerLite::GetInstance().
854             RegisterPiPStateChangedListener(pipStateObserver_) != OHOS::Rosen::WMError::WM_OK) {
855                 RESSCHED_LOGE("RegisterPiPStateChangedListener fail");
856                 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::RSS, "INIT_FAULT",
857                     HiviewDFX::HiSysEvent::EventType::FAULT,
858                     "COMPONENT_NAME", "MAIN", "ERR_TYPE", "register failure",
859                     "ERR_MSG", "Register a listener of window pip content change failed.");
860         } else {
861             RESSCHED_LOGI("RegisterPiPStateChangedListener success");
862         }
863     } else {
864         RESSCHED_LOGI("PiPStateObserver not null");
865     }
866 }
867 
InitWindowStyleObserver()868 bool ObserverManager::InitWindowStyleObserver()
869 {
870     RESSCHED_LOGI("Init InitWindowStyleObserver");
871     if (!windowStyleObserver_) {
872         windowStyleObserver_ = sptr<WindowStyleObserver>(new WindowStyleObserver());
873         if (windowStyleObserver_ == nullptr) {
874             RESSCHED_LOGE("InitWindowStyleObserver new observer failed");
875             return false;
876         }
877     }
878     auto res = Rosen::WindowManagerLite::GetInstance().RegisterWindowStyleChangedListener(windowStyleObserver_);
879     if (res == Rosen::WMError::WM_OK) {
880         RESSCHED_LOGD("ObserverManager init InitWindowStyleObserver observer successfully");
881         auto windowStyle = Rosen::WindowManagerLite::GetInstance().GetWindowStyleType();
882         windowStyleObserver_->OnWindowStyleUpdate(windowStyle);
883         return true;
884     } else {
885         RESSCHED_LOGE("ObserverManager init InitWindowStyleObserver observer failed, ret(%{public}d)", res);
886         return false;
887     }
888 }
889 
DisableWindowStateObserver()890 void ObserverManager::DisableWindowStateObserver()
891 {
892     if (windowStateObserver_) {
893         // unregister windowStateObserver_
894         OHOS::Rosen::WindowManager::GetInstance().UnregisterFocusChangedListener(windowStateObserver_);
895         windowStateObserver_ = nullptr;
896     }
897 
898     if (windowVisibilityObserver_) {
899         OHOS::Rosen::WindowManager::GetInstance().UnregisterVisibilityChangedListener(windowVisibilityObserver_);
900         windowVisibilityObserver_ = nullptr;
901     }
902 
903     if (windowDrawingContentObserver_) {
904         OHOS::Rosen::WindowManager::GetInstance().
905             UnregisterDrawingContentChangedListener(windowDrawingContentObserver_);
906         windowDrawingContentObserver_ = nullptr;
907     }
908     UnsubscribeWindowModeChange();
909     UnsubscribePipChange();
910     DisableWindowStyleObserver();
911 }
912 
UnsubscribeWindowModeChange()913 void ObserverManager::UnsubscribeWindowModeChange()
914 {
915     if (windowModeObserver_) {
916         OHOS::Rosen::WindowManager::GetInstance().
917             UnregisterWindowModeChangedListener(windowModeObserver_);
918         windowModeObserver_ = nullptr;
919     }
920 }
921 
UnsubscribePipChange()922 void ObserverManager::UnsubscribePipChange()
923 {
924     if (pipStateObserver_) {
925         OHOS::Rosen::WindowManagerLite::GetInstance().UnregisterPiPStateChangedListener(pipStateObserver_);
926         pipStateObserver_ = nullptr;
927     }
928     RESSCHED_LOGI("UnsubscribePipchange success");
929 }
930 
DisableWindowStyleObserver()931 bool ObserverManager::DisableWindowStyleObserver()
932 {
933     RESSCHED_LOGI("Disable DisableDistrWindowStyleObserver");
934     if (windowStyleObserver_ == nullptr) {
935         return true;
936     }
937     auto res = Rosen::WindowManagerLite::GetInstance().UnregisterWindowStyleChangedListener(windowStyleObserver_);
938     if (res != Rosen::WMError::WM_OK) {
939         RESSCHED_LOGW("ObserverManager disable DisableWindowStyleObserver failed, ret(%{public}d)", res);
940         return false;
941     }
942     windowStyleObserver_ = nullptr;
943     return true;
944 }
945 
946 #ifdef CONFIG_BGTASK_MGR
InitBackgroundTask()947 void ObserverManager::InitBackgroundTask()
948 {
949     if (isBgtaskSubscribed_) {
950         return;
951     }
952     if (!backgroundTaskObserver_) {
953         backgroundTaskObserver_ = std::make_shared<BackgroundTaskObserver>();
954     }
955     int ret = BackgroundTaskMgr::BackgroundTaskMgrHelper::SubscribeBackgroundTask(*backgroundTaskObserver_);
956     if (ret != 0) {
957         RESSCHED_LOGE("%{public}s failed, err:%{public}d.", __func__, ret);
958         return;
959     }
960     isBgtaskSubscribed_ = true;
961     RESSCHED_LOGI("%{public}s success.", __func__);
962     return;
963 }
964 
DisableBackgroundTask()965 void ObserverManager::DisableBackgroundTask()
966 {
967     if (!isBgtaskSubscribed_ || !backgroundTaskObserver_) {
968         return;
969     }
970     int32_t ret = BackgroundTaskMgr::BackgroundTaskMgrHelper::UnsubscribeBackgroundTask(*backgroundTaskObserver_);
971     if (ret == 0) {
972         RESSCHED_LOGI("%{public}s success.", __func__);
973     } else {
974         RESSCHED_LOGE("%{public}s failed. ret:%{public}d", __func__, ret);
975     }
976     isBgtaskSubscribed_ = false;
977 }
978 #endif
979 
GetAppManagerInstance()980 OHOS::sptr<OHOS::AppExecFwk::IAppMgr> GetAppManagerInstance()
981 {
982     OHOS::sptr<OHOS::ISystemAbilityManager> systemAbilityManager =
983         OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
984     if (!systemAbilityManager) {
985         RESSCHED_LOGE("%{public}s : systemAbilityManager nullptr!", __func__);
986         return nullptr;
987     }
988     OHOS::sptr<OHOS::IRemoteObject> object = systemAbilityManager->GetSystemAbility(OHOS::APP_MGR_SERVICE_ID);
989     return OHOS::iface_cast<OHOS::AppExecFwk::IAppMgr>(object);
990 }
991 
SubscribeAppState()992 void ObserverManager::SubscribeAppState()
993 {
994     sptr<OHOS::AppExecFwk::IAppMgr> appManager = GetAppManagerInstance();
995     if (!appManager) {
996         RESSCHED_LOGE("%{public}s app manager nullptr!", __func__);
997         return;
998     }
999     appStateObserver_ = new (std::nothrow)RmsApplicationStateObserver();
1000     if (!appStateObserver_) {
1001         RESSCHED_LOGE("%{public}s allocate app state observer failed!", __func__);
1002         return;
1003     }
1004     int32_t err = appManager->RegisterApplicationStateObserver(appStateObserver_);
1005     if (err != 0) {
1006         RESSCHED_LOGE("%{public}s register to appmanager failed. err:%{public}d", __func__, err);
1007         appStateObserver_ = nullptr;
1008         return;
1009     }
1010     RESSCHED_LOGI("%{public}s success.", __func__);
1011     return;
1012 }
1013 
UnsubscribeAppState()1014 void ObserverManager::UnsubscribeAppState()
1015 {
1016     if (!appStateObserver_) {
1017         return;
1018     }
1019 
1020     sptr<OHOS::AppExecFwk::IAppMgr> appManager = GetAppManagerInstance();
1021     if (appManager) {
1022         int32_t err = appManager->UnregisterApplicationStateObserver(appStateObserver_);
1023         if (err == 0) {
1024             RESSCHED_LOGI("%{public}s success.", __func__);
1025         } else {
1026             RESSCHED_LOGE("%{public}s failed. err:%{public}d", __func__, err);
1027         }
1028     }
1029     appStateObserver_ = nullptr;
1030 }
1031 
DisableAccountObserver()1032 void ObserverManager::DisableAccountObserver()
1033 {
1034     RESSCHED_LOGI("account sa removed");
1035 }
1036 
ObserverManagerInit()1037 extern "C" void ObserverManagerInit()
1038 {
1039     auto instance = ObserverManager::GetInstance();
1040     if (instance) {
1041         instance->Init();
1042     } else {
1043         RESSCHED_LOGE("ObserverManager GetInstance failed");
1044     }
1045 }
1046 
ObserverManagerDisable()1047 extern "C" void ObserverManagerDisable()
1048 {
1049     ObserverManager::GetInstance()->Disable();
1050 }
1051 } // namespace ResourceSchedule
1052 } // namespace OHOS