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