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