1 /*
2 * Copyright (C) 2021-2024 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 "telephony_state_registry_service.h"
17
18 #include <sstream>
19 #include <thread>
20
21 #include "common_event_manager.h"
22 #include "common_event_support.h"
23 #include "iservice_registry.h"
24 #include "state_registry_errors.h"
25 #include "string_ex.h"
26 #include "system_ability.h"
27 #include "system_ability_definition.h"
28 #include "telephony_permission.h"
29 #include "telephony_state_manager.h"
30 #include "telephony_state_registry_dump_helper.h"
31 #include "telephony_types.h"
32 #include "telephony_ext_wrapper.h"
33
34 namespace OHOS {
35 namespace Telephony {
36 using namespace OHOS::EventFwk;
37 bool g_registerResult =
38 SystemAbility::MakeAndRegisterAbility(DelayedSingleton<TelephonyStateRegistryService>::GetInstance().get());
39
TelephonyStateRegistryService()40 TelephonyStateRegistryService::TelephonyStateRegistryService()
41 : SystemAbility(TELEPHONY_STATE_REGISTRY_SYS_ABILITY_ID, true)
42 {
43 slotSize_ = SIM_SLOT_COUNT;
44 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_VSIM
45 // two modem device also has 3 slot (2sim + 1vsim)
46 if (SIM_SLOT_COUNT == DUAL_SLOT_COUNT &&
47 (VSIM_MODEM_COUNT == MAX_SLOT_COUNT || VSIM_MODEM_COUNT == DUAL_SLOT_COUNT)) {
48 slotSize_ = MAX_SLOT_COUNT;
49 }
50 #endif
51 TELEPHONY_LOGI("TelephonyStateRegistryService SystemAbility create, slotSize_: %{public}d", slotSize_);
52 for (int32_t i = 0; i < slotSize_; i++) {
53 callState_[i] = static_cast<int32_t>(CallStatus::CALL_STATUS_UNKNOWN);
54 }
55
56 // slotSize_ == 0 means wifionly product.
57 if (slotSize_ == 0) {
58 callState_[0] = static_cast<int32_t>(CallStatus::CALL_STATUS_UNKNOWN);
59 }
60 callState_[-1] = static_cast<int32_t>(CallStatus::CALL_STATUS_UNKNOWN);
61 }
62
~TelephonyStateRegistryService()63 TelephonyStateRegistryService::~TelephonyStateRegistryService()
64 {
65 std::lock_guard<std::mutex> guard(lock_);
66 stateRecords_.clear();
67 callState_.clear();
68 callIncomingNumber_.clear();
69 signalInfos_.clear();
70 searchNetworkState_.clear();
71 }
72
OnStart()73 void TelephonyStateRegistryService::OnStart()
74 {
75 bindStartTime_ =
76 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
77 .count();
78 std::lock_guard<std::mutex> guard(lock_);
79 if (state_ == ServiceRunningState::STATE_RUNNING) {
80 TELEPHONY_LOGE("Leave, FAILED, already running");
81 return;
82 }
83 state_ = ServiceRunningState::STATE_RUNNING;
84 bool ret = SystemAbility::Publish(DelayedSingleton<TelephonyStateRegistryService>::GetInstance().get());
85 if (!ret) {
86 TELEPHONY_LOGE("Leave, Failed to publish TelephonyStateRegistryService");
87 }
88 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
89 TELEPHONY_EXT_WRAPPER.InitTelephonyExtWrapper();
90 #endif
91 TELEPHONY_LOGI("TelephonyStateRegistryService start success.");
92 bindEndTime_ =
93 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
94 .count();
95 std::thread task([&]() {
96 if (IsCommonEventServiceAbilityExist()) {
97 for (int32_t i = 0; i < slotSize_; i++) {
98 TELEPHONY_LOGI("TelephonyStateRegistryService send disconnected call state.");
99 SendCallStateChanged(i, static_cast<int32_t>(CallStatus::CALL_STATUS_DISCONNECTED));
100 }
101 }
102 });
103 pthread_setname_np(task.native_handle(), "state_registry_task");
104 task.detach();
105 }
106
OnStop()107 void TelephonyStateRegistryService::OnStop()
108 {
109 TELEPHONY_LOGI("TelephonyStateRegistryService OnStop ");
110 std::lock_guard<std::mutex> guard(lock_);
111 state_ = ServiceRunningState::STATE_STOPPED;
112 }
113
Finalize()114 void TelephonyStateRegistryService::Finalize()
115 {
116 TELEPHONY_LOGI("TelephonyStateRegistryService Finalize");
117 }
118
OnDump()119 void TelephonyStateRegistryService::OnDump() {}
120
UpdateCellularDataConnectState(int32_t slotId,int32_t dataState,int32_t networkType)121 int32_t TelephonyStateRegistryService::UpdateCellularDataConnectState(
122 int32_t slotId, int32_t dataState, int32_t networkType)
123 {
124 if (!VerifySlotId(slotId)) {
125 TELEPHONY_LOGE("UpdateCellularDataConnectState##VerifySlotId failed ##slotId = %{public}d", slotId);
126 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
127 }
128 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
129 TELEPHONY_LOGE("Check permission failed.");
130 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
131 }
132 std::lock_guard<std::mutex> guard(lock_);
133 cellularDataConnectionState_[slotId] = dataState;
134 cellularDataConnectionNetworkType_[slotId] = networkType;
135 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
136 for (size_t i = 0; i < stateRecords_.size(); i++) {
137 TelephonyStateRegistryRecord record = stateRecords_[i];
138 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_DATA_CONNECTION_STATE) &&
139 (record.slotId_ == slotId) && record.telephonyObserver_ != nullptr) {
140 if (TELEPHONY_EXT_WRAPPER.onCellularDataConnectStateUpdated_ != nullptr) {
141 int32_t networkTypeExt = networkType;
142 TELEPHONY_EXT_WRAPPER.onCellularDataConnectStateUpdated_(slotId, record, networkTypeExt);
143 record.telephonyObserver_->OnCellularDataConnectStateUpdated(slotId, dataState, networkTypeExt);
144 } else {
145 record.telephonyObserver_->OnCellularDataConnectStateUpdated(slotId, dataState, networkType);
146 }
147 result = TELEPHONY_SUCCESS;
148 }
149 }
150 SendCellularDataConnectStateChanged(slotId, dataState, networkType);
151 return result;
152 }
153
UpdateCellularDataFlow(int32_t slotId,int32_t flowData)154 int32_t TelephonyStateRegistryService::UpdateCellularDataFlow(int32_t slotId, int32_t flowData)
155 {
156 if (!VerifySlotId(slotId)) {
157 TELEPHONY_LOGE("UpdateCellularDataFlow##VerifySlotId failed ##slotId = %{public}d", slotId);
158 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
159 }
160 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
161 TELEPHONY_LOGE("Check permission failed.");
162 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
163 }
164 std::lock_guard<std::mutex> guard(lock_);
165 cellularDataFlow_[slotId] = flowData;
166 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
167 for (size_t i = 0; i < stateRecords_.size(); i++) {
168 TelephonyStateRegistryRecord record = stateRecords_[i];
169 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_DATA_FLOW) &&
170 (record.slotId_ == slotId) && record.telephonyObserver_ != nullptr) {
171 record.telephonyObserver_->OnCellularDataFlowUpdated(slotId, flowData);
172 result = TELEPHONY_SUCCESS;
173 }
174 }
175 return result;
176 }
177
UpdateCallState(int32_t callState,const std::u16string & number)178 int32_t TelephonyStateRegistryService::UpdateCallState(int32_t callState, const std::u16string &number)
179 {
180 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
181 TELEPHONY_LOGE("Check permission failed.");
182 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
183 }
184 std::lock_guard<std::mutex> guard(lock_);
185 // -1 means observe all slot
186 callState_[-1] = callState;
187 callIncomingNumber_[-1] = number;
188 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
189 for (size_t i = 0; i < stateRecords_.size(); i++) {
190 TelephonyStateRegistryRecord record = stateRecords_[i];
191 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_CALL_STATE) &&
192 (record.slotId_ == -1) && record.telephonyObserver_ != nullptr) {
193 std::u16string phoneNumber;
194 if (record.IsCanReadCallHistory()) {
195 phoneNumber = number;
196 } else {
197 phoneNumber = Str8ToStr16("");
198 }
199 record.telephonyObserver_->OnCallStateUpdated(record.slotId_, callState, phoneNumber);
200 result = TELEPHONY_SUCCESS;
201 }
202 }
203 SendCallStateChanged(-1, callState);
204 SendCallStateChangedAsUserMultiplePermission(-1, callState, number);
205 return result;
206 }
207
UpdateCallStateForSlotId(int32_t slotId,int32_t callState,const std::u16string & number)208 int32_t TelephonyStateRegistryService::UpdateCallStateForSlotId(
209 int32_t slotId, int32_t callState, const std::u16string &number)
210 {
211 if (!VerifySlotId(slotId)) {
212 TELEPHONY_LOGE("UpdateCallState##VerifySlotId failed ##slotId = %{public}d", slotId);
213 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
214 }
215 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
216 TELEPHONY_LOGE("Check permission failed.");
217 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
218 }
219 std::lock_guard<std::mutex> guard(lock_);
220 callState_[slotId] = callState;
221 callIncomingNumber_[slotId] = number;
222 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
223 for (size_t i = 0; i < stateRecords_.size(); i++) {
224 TelephonyStateRegistryRecord record = stateRecords_[i];
225 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_CALL_STATE) &&
226 (record.slotId_ == slotId) && record.telephonyObserver_ != nullptr) {
227 std::u16string phoneNumber = GetCallIncomingNumberForSlotId(record, slotId);
228 record.telephonyObserver_->OnCallStateUpdated(slotId, callState, phoneNumber);
229 result = TELEPHONY_SUCCESS;
230 }
231 }
232 SendCallStateChanged(slotId, callState);
233 SendCallStateChangedAsUserMultiplePermission(slotId, callState, number);
234 return result;
235 }
236
UpdateSimState(int32_t slotId,CardType type,SimState state,LockReason reason)237 int32_t TelephonyStateRegistryService::UpdateSimState(int32_t slotId, CardType type, SimState state, LockReason reason)
238 {
239 if (!VerifySlotId(slotId)) {
240 TELEPHONY_LOGE("UpdateSimState##VerifySlotId failed ##slotId = %{public}d", slotId);
241 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
242 }
243 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
244 TELEPHONY_LOGE("Check permission failed.");
245 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
246 }
247 std::lock_guard<std::mutex> guard(lock_);
248 simState_[slotId] = state;
249 simReason_[slotId] = reason;
250 cardType_[slotId] = type;
251 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
252 for (size_t i = 0; i < stateRecords_.size(); i++) {
253 TelephonyStateRegistryRecord record = stateRecords_[i];
254 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_SIM_STATE) &&
255 (record.slotId_ == slotId) && record.telephonyObserver_ != nullptr) {
256 record.telephonyObserver_->OnSimStateUpdated(slotId, type, state, reason);
257 result = TELEPHONY_SUCCESS;
258 }
259 }
260 SendSimStateChanged(slotId, type, state, reason);
261 return result;
262 }
263
UpdateSignalInfo(int32_t slotId,const std::vector<sptr<SignalInformation>> & vec)264 int32_t TelephonyStateRegistryService::UpdateSignalInfo(int32_t slotId, const std::vector<sptr<SignalInformation>> &vec)
265 {
266 if (!VerifySlotId(slotId)) {
267 TELEPHONY_LOGE("UpdateSignalInfo##VerifySlotId failed ##slotId = %{public}d", slotId);
268 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
269 }
270 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
271 TELEPHONY_LOGE("Check permission failed.");
272 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
273 }
274 std::lock_guard<std::mutex> guard(lock_);
275 signalInfos_[slotId] = vec;
276 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
277 for (size_t i = 0; i < stateRecords_.size(); i++) {
278 TelephonyStateRegistryRecord record = stateRecords_[i];
279 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_SIGNAL_STRENGTHS) &&
280 (record.slotId_ == slotId) && record.telephonyObserver_ != nullptr) {
281 if (TELEPHONY_EXT_WRAPPER.onSignalInfoUpdated_ != nullptr) {
282 std::vector<sptr<SignalInformation>> vecExt = vec;
283 TELEPHONY_EXT_WRAPPER.onSignalInfoUpdated_(slotId, record, vecExt, vec);
284 record.telephonyObserver_->OnSignalInfoUpdated(slotId, vecExt);
285 } else {
286 record.telephonyObserver_->OnSignalInfoUpdated(slotId, vec);
287 }
288 result = TELEPHONY_SUCCESS;
289 }
290 }
291 SendSignalInfoChanged(slotId, vec);
292 return result;
293 }
294
UpdateCellInfo(int32_t slotId,const std::vector<sptr<CellInformation>> & vec)295 int32_t TelephonyStateRegistryService::UpdateCellInfo(int32_t slotId, const std::vector<sptr<CellInformation>> &vec)
296 {
297 if (!VerifySlotId(slotId)) {
298 TELEPHONY_LOGE("UpdateCellInfo##VerifySlotId failed ##slotId = %{public}d", slotId);
299 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
300 }
301 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE) ||
302 !TelephonyPermission::CheckPermission(Permission::CELL_LOCATION)) {
303 TELEPHONY_LOGE("Check permission failed.");
304 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
305 }
306 std::lock_guard<std::mutex> guard(lock_);
307 cellInfos_[slotId] = vec;
308 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
309 for (size_t i = 0; i < stateRecords_.size(); i++) {
310 TelephonyStateRegistryRecord record = stateRecords_[i];
311 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_CELL_INFO) && record.slotId_ == slotId) {
312 if (record.telephonyObserver_ == nullptr) {
313 TELEPHONY_LOGE("record.telephonyObserver_ is nullptr");
314 return TELEPHONY_ERR_LOCAL_PTR_NULL;
315 }
316 if (TELEPHONY_EXT_WRAPPER.onCellInfoUpdated_ != nullptr) {
317 std::vector<sptr<CellInformation>> vecExt = vec;
318 TELEPHONY_EXT_WRAPPER.onCellInfoUpdated_(slotId, record, vecExt, vec);
319 record.telephonyObserver_->OnCellInfoUpdated(slotId, vecExt);
320 } else {
321 record.telephonyObserver_->OnCellInfoUpdated(slotId, vec);
322 }
323 result = TELEPHONY_SUCCESS;
324 }
325 }
326 return result;
327 }
328
UpdateNetworkState(int32_t slotId,const sptr<NetworkState> & networkState)329 int32_t TelephonyStateRegistryService::UpdateNetworkState(int32_t slotId, const sptr<NetworkState> &networkState)
330 {
331 if (!VerifySlotId(slotId)) {
332 TELEPHONY_LOGE("UpdateNetworkState##VerifySlotId failed ##slotId = %{public}d", slotId);
333 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
334 }
335 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
336 TELEPHONY_LOGE("Check permission failed.");
337 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
338 }
339 std::lock_guard<std::mutex> guard(lock_);
340 searchNetworkState_[slotId] = networkState;
341 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
342 for (size_t i = 0; i < stateRecords_.size(); i++) {
343 TelephonyStateRegistryRecord r = stateRecords_[i];
344 if (r.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_NETWORK_STATE) && (r.slotId_ == slotId) &&
345 r.telephonyObserver_ != nullptr) {
346 if (TELEPHONY_EXT_WRAPPER.onNetworkStateUpdated_ != nullptr) {
347 sptr<NetworkState> networkStateExt = new NetworkState();
348 MessageParcel data;
349 networkState->Marshalling(data);
350 networkStateExt->ReadFromParcel(data);
351 TELEPHONY_EXT_WRAPPER.onNetworkStateUpdated_(slotId, r, networkStateExt, networkState);
352 r.telephonyObserver_->OnNetworkStateUpdated(slotId, networkStateExt);
353 } else {
354 r.telephonyObserver_->OnNetworkStateUpdated(slotId, networkState);
355 }
356 result = TELEPHONY_SUCCESS;
357 }
358 }
359 SendNetworkStateChanged(slotId, networkState);
360 TELEPHONY_LOGI("TelephonyStateRegistryService::UpdateNetworkState end");
361 return result;
362 }
363
UpdateCfuIndicator(int32_t slotId,bool cfuResult)364 int32_t TelephonyStateRegistryService::UpdateCfuIndicator(int32_t slotId, bool cfuResult)
365 {
366 if (!VerifySlotId(slotId)) {
367 TELEPHONY_LOGE("UpdateCfuIndicator##VerifySlotId failed ##slotId = %{public}d", slotId);
368 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
369 }
370 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
371 TELEPHONY_LOGE("Check permission failed.");
372 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
373 }
374 std::lock_guard<std::mutex> guard(lock_);
375 cfuResult_[slotId] = cfuResult;
376 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
377 for (size_t i = 0; i < stateRecords_.size(); i++) {
378 TelephonyStateRegistryRecord record = stateRecords_[i];
379 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_CFU_INDICATOR) &&
380 (record.slotId_ == slotId) && record.telephonyObserver_ != nullptr) {
381 record.telephonyObserver_->OnCfuIndicatorUpdated(slotId, cfuResult);
382 result = TELEPHONY_SUCCESS;
383 }
384 }
385 TELEPHONY_LOGI("TelephonyStateRegistryService::UpdateCfuIndicator end");
386 return result;
387 }
388
UpdateIccAccount()389 int32_t TelephonyStateRegistryService::UpdateIccAccount()
390 {
391 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
392 TELEPHONY_LOGE("Check permission failed.");
393 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
394 }
395 std::lock_guard<std::mutex> guard(lock_);
396 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
397 for (size_t i = 0; i < stateRecords_.size(); i++) {
398 TelephonyStateRegistryRecord record = stateRecords_[i];
399 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_ICC_ACCOUNT) &&
400 (record.telephonyObserver_ != nullptr)) {
401 record.telephonyObserver_->OnIccAccountUpdated();
402 result = TELEPHONY_SUCCESS;
403 }
404 }
405 TELEPHONY_LOGI("TelephonyStateRegistryService::UpdateIccAccount end");
406 return result;
407 }
408
UpdateVoiceMailMsgIndicator(int32_t slotId,bool voiceMailMsgResult)409 int32_t TelephonyStateRegistryService::UpdateVoiceMailMsgIndicator(int32_t slotId, bool voiceMailMsgResult)
410 {
411 if (!VerifySlotId(slotId)) {
412 TELEPHONY_LOGE("UpdateVoiceMailMsgIndicator##VerifySlotId failed ##slotId = %{public}d", slotId);
413 return TELEPHONY_STATE_REGISTRY_SLODID_ERROR;
414 }
415 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
416 TELEPHONY_LOGE("Check permission failed.");
417 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
418 }
419 std::lock_guard<std::mutex> guard(lock_);
420 voiceMailMsgResult_[slotId] = voiceMailMsgResult;
421 int32_t result = TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST;
422 for (size_t i = 0; i < stateRecords_.size(); i++) {
423 TelephonyStateRegistryRecord record = stateRecords_[i];
424 if (record.IsExistStateListener(TelephonyObserverBroker::OBSERVER_MASK_VOICE_MAIL_MSG_INDICATOR) &&
425 (record.slotId_ == slotId) && record.telephonyObserver_ != nullptr) {
426 record.telephonyObserver_->OnVoiceMailMsgIndicatorUpdated(slotId, voiceMailMsgResult);
427 result = TELEPHONY_SUCCESS;
428 }
429 }
430 TELEPHONY_LOGI("TelephonyStateRegistryService::UpdateVoiceMailMsgIndicator end");
431 return result;
432 }
433
CheckCallerIsSystemApp(uint32_t mask)434 bool TelephonyStateRegistryService::CheckCallerIsSystemApp(uint32_t mask)
435 {
436 if ((mask & TelephonyObserverBroker::OBSERVER_MASK_CELL_INFO) != 0) {
437 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
438 TELEPHONY_LOGE("The listening event is cellInfoChange. Non-system applications use system APIs!");
439 return false;
440 }
441 }
442 if ((mask & TelephonyObserverBroker::OBSERVER_MASK_CFU_INDICATOR) != 0) {
443 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
444 TELEPHONY_LOGE("The listening event is cfuIndicatorChange. Non-system applications use system APIs!");
445 return false;
446 }
447 }
448 if ((mask & TelephonyObserverBroker::OBSERVER_MASK_VOICE_MAIL_MSG_INDICATOR) != 0) {
449 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
450 TELEPHONY_LOGE(
451 "The listening event is voiceMailMsgIndicatorChange. Non-system applications use system APIs!");
452 return false;
453 }
454 }
455 return true;
456 }
457
RegisterStateChange(const sptr<TelephonyObserverBroker> & telephonyObserver,int32_t slotId,uint32_t mask,const std::string & bundleName,bool isUpdate,pid_t pid,int32_t uid,int32_t tokenId)458 int32_t TelephonyStateRegistryService::RegisterStateChange(
459 const sptr<TelephonyObserverBroker> &telephonyObserver, int32_t slotId,
460 uint32_t mask, const std::string &bundleName, bool isUpdate, pid_t pid, int32_t uid, int32_t tokenId)
461 {
462 if (!CheckCallerIsSystemApp(mask)) {
463 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
464 }
465 if (!CheckPermission(mask)) {
466 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
467 }
468 std::lock_guard<std::mutex> guard(lock_);
469 bool isExist = false;
470 TelephonyStateRegistryRecord record;
471 for (size_t i = 0; i < stateRecords_.size(); i++) {
472 record = stateRecords_[i];
473 if (record.slotId_ == slotId && record.mask_ == mask && record.tokenId_ == tokenId && record.pid_ == pid) {
474 isExist = true;
475 break;
476 }
477 }
478
479 if (!isExist) {
480 record.pid_ = pid;
481 record.uid_ = uid;
482 record.slotId_ = slotId;
483 record.mask_ = mask;
484 record.bundleName_ = bundleName;
485 record.tokenId_ = tokenId;
486 record.telephonyObserver_ = telephonyObserver;
487 stateRecords_.push_back(record);
488 }
489
490 if (isUpdate) {
491 UpdateData(record);
492 }
493 TELEPHONY_LOGD("[slot%{public}d] Register successfully, callback list size is %{public}zu", slotId,
494 stateRecords_.size());
495 return TELEPHONY_SUCCESS;
496 }
497
UnregisterStateChange(int32_t slotId,uint32_t mask,int32_t tokenId,pid_t pid)498 int32_t TelephonyStateRegistryService::UnregisterStateChange(int32_t slotId, uint32_t mask, int32_t tokenId, pid_t pid)
499 {
500 if (!CheckCallerIsSystemApp(mask)) {
501 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
502 }
503 if (!CheckPermission(mask)) {
504 return TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED;
505 }
506 std::lock_guard<std::mutex> guard(lock_);
507 int32_t result = TELEPHONY_STATE_UNREGISTRY_DATA_NOT_EXIST;
508 std::vector<TelephonyStateRegistryRecord>::iterator it;
509 for (it = stateRecords_.begin(); it != stateRecords_.end(); ++it) {
510 if (it->slotId_ == slotId && it->mask_ == mask && it->tokenId_ == tokenId && it->pid_ == pid) {
511 stateRecords_.erase(it);
512 result = TELEPHONY_SUCCESS;
513 break;
514 }
515 }
516 TELEPHONY_LOGD("[slot%{public}d] Unregister successfully, callback list size is %{public}zu", slotId,
517 stateRecords_.size());
518 return result;
519 }
520
CheckPermission(uint32_t mask)521 bool TelephonyStateRegistryService::CheckPermission(uint32_t mask)
522 {
523 if ((mask & TelephonyObserverBroker::OBSERVER_MASK_NETWORK_STATE) != 0) {
524 if (!TelephonyPermission::CheckPermission(Permission::GET_NETWORK_INFO)) {
525 TELEPHONY_LOGE("Check permission failed,"
526 "you must declare ohos.permission.GET_NETWORK_INFO permission for network state");
527 return false;
528 }
529 }
530 if ((mask & TelephonyObserverBroker::OBSERVER_MASK_CELL_INFO) != 0) {
531 if (!TelephonyPermission::CheckPermission(Permission::CELL_LOCATION)) {
532 TELEPHONY_LOGE("Check permission failed,"
533 "you must declare ohos.permission.LOCATION permission for cell info");
534 return false;
535 }
536 }
537 return true;
538 }
539
VerifySlotId(int slotId)540 bool TelephonyStateRegistryService::VerifySlotId(int slotId)
541 {
542 return slotId >= 0 && slotId < slotSize_;
543 }
544
GetCallIncomingNumberForSlotId(TelephonyStateRegistryRecord record,int32_t slotId)545 std::u16string TelephonyStateRegistryService::GetCallIncomingNumberForSlotId(
546 TelephonyStateRegistryRecord record, int32_t slotId)
547 {
548 if (record.IsCanReadCallHistory()) {
549 return callIncomingNumber_[slotId];
550 } else {
551 return Str8ToStr16("");
552 }
553 }
554
UpdateData(const TelephonyStateRegistryRecord & record)555 void TelephonyStateRegistryService::UpdateData(const TelephonyStateRegistryRecord &record)
556 {
557 if (record.telephonyObserver_ == nullptr) {
558 TELEPHONY_LOGE("record.telephonyObserver_ is nullptr");
559 return;
560 }
561 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_CALL_STATE) != 0) {
562 std::u16string phoneNumber = GetCallIncomingNumberForSlotId(record, record.slotId_);
563 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_CALL_STATE");
564 record.telephonyObserver_->OnCallStateUpdated(record.slotId_, callState_[record.slotId_], phoneNumber);
565 }
566 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_SIGNAL_STRENGTHS) != 0) {
567 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_SIGNAL_STRENGTHS");
568 record.telephonyObserver_->OnSignalInfoUpdated(record.slotId_, signalInfos_[record.slotId_]);
569 }
570 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_NETWORK_STATE) != 0) {
571 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_NETWORK_STATE");
572 record.telephonyObserver_->OnNetworkStateUpdated(record.slotId_, searchNetworkState_[record.slotId_]);
573 }
574 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_CELL_INFO) != 0) {
575 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_CELL_INFO");
576 record.telephonyObserver_->OnCellInfoUpdated(record.slotId_, cellInfos_[record.slotId_]);
577 }
578 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_SIM_STATE) != 0) {
579 record.telephonyObserver_->OnSimStateUpdated(
580 record.slotId_, cardType_[record.slotId_], simState_[record.slotId_], simReason_[record.slotId_]);
581 }
582 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_DATA_CONNECTION_STATE) != 0) {
583 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_DATA_CONNECTION_STATE");
584 record.telephonyObserver_->OnCellularDataConnectStateUpdated(record.slotId_,
585 cellularDataConnectionState_[record.slotId_], cellularDataConnectionNetworkType_[record.slotId_]);
586 }
587 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_DATA_FLOW) != 0) {
588 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_DATA_FLOW");
589 record.telephonyObserver_->OnCellularDataFlowUpdated(record.slotId_, cellularDataFlow_[record.slotId_]);
590 }
591 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_CFU_INDICATOR) != 0) {
592 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_CFU_INDICATOR");
593 record.telephonyObserver_->OnCfuIndicatorUpdated(record.slotId_, cfuResult_[record.slotId_]);
594 }
595 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_VOICE_MAIL_MSG_INDICATOR) != 0) {
596 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_VOICE_MAIL_MSG_INDICATOR");
597 record.telephonyObserver_->OnVoiceMailMsgIndicatorUpdated(record.slotId_, voiceMailMsgResult_[record.slotId_]);
598 }
599 if ((record.mask_ & TelephonyObserverBroker::OBSERVER_MASK_ICC_ACCOUNT) != 0) {
600 TELEPHONY_LOGI("RegisterStateChange##Notify-OBSERVER_MASK_ICC_ACCOUNT");
601 record.telephonyObserver_->OnIccAccountUpdated();
602 }
603 }
604
PublishCommonEvent(const AAFwk::Want & want,int eventCode,const std::string & eventData)605 bool TelephonyStateRegistryService::PublishCommonEvent(
606 const AAFwk::Want &want, int eventCode, const std::string &eventData)
607 {
608 EventFwk::CommonEventData data;
609 data.SetWant(want);
610 data.SetCode(eventCode);
611 data.SetData(eventData);
612 EventFwk::CommonEventPublishInfo publishInfo;
613 publishInfo.SetOrdered(false);
614 if (want.GetAction() == EventFwk::CommonEventSupport::COMMON_EVENT_NETWORK_STATE_CHANGED) {
615 std::vector<std::string> permissions;
616 permissions.emplace_back(Permission::GET_NETWORK_INFO);
617 publishInfo.SetSubscriberPermissions(permissions);
618 }
619 bool publishResult = EventFwk::CommonEventManager::PublishCommonEvent(data, publishInfo, nullptr);
620 TELEPHONY_LOGI("PublishCommonEvent end###publishResult = %{public}d\n", publishResult);
621 return publishResult;
622 }
623
SendCallStateChanged(int32_t slotId,int32_t state)624 void TelephonyStateRegistryService::SendCallStateChanged(int32_t slotId, int32_t state)
625 {
626 AAFwk::Want want;
627 want.SetParam("slotId", slotId);
628 want.SetParam("state", state);
629 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_CALL_STATE_CHANGED);
630
631 EventFwk::CommonEventData data;
632 data.SetWant(want);
633 EventFwk::CommonEventPublishInfo publishInfo;
634 publishInfo.SetOrdered(false);
635 std::vector<std::string> callPermissions;
636 callPermissions.emplace_back(Permission::GET_TELEPHONY_STATE);
637 publishInfo.SetSubscriberPermissions(callPermissions);
638 bool publishResult = EventFwk::CommonEventManager::PublishCommonEvent(data, publishInfo, nullptr);
639 if (!publishResult) {
640 TELEPHONY_LOGE("SendCallStateChanged PublishBroadcastEvent result fail");
641 }
642 }
643
SendCallStateChangedAsUserMultiplePermission(int32_t slotId,int32_t state,const std::u16string & number)644 void TelephonyStateRegistryService::SendCallStateChangedAsUserMultiplePermission(
645 int32_t slotId, int32_t state, const std::u16string &number)
646 {
647 AAFwk::Want want;
648 want.SetParam("slotId", slotId);
649 want.SetParam("state", state);
650 want.SetParam("number", Str16ToStr8(number));
651 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_CALL_STATE_CHANGED);
652
653 EventFwk::CommonEventData data;
654 data.SetWant(want);
655 EventFwk::CommonEventPublishInfo publishInfo;
656 publishInfo.SetOrdered(false);
657 std::vector<std::string> callPermissions;
658 callPermissions.emplace_back(Permission::GET_TELEPHONY_STATE);
659 callPermissions.emplace_back(Permission::READ_CALL_LOG);
660 publishInfo.SetSubscriberPermissions(callPermissions);
661 bool publishResult = EventFwk::CommonEventManager::PublishCommonEvent(data, publishInfo, nullptr);
662 if (!publishResult) {
663 TELEPHONY_LOGE("SendCallStateChangedAsUserMultiplePermission PublishBroadcastEvent result fail");
664 }
665 }
666
SendCellularDataConnectStateChanged(int32_t slotId,int32_t dataState,int32_t networkType)667 void TelephonyStateRegistryService::SendCellularDataConnectStateChanged(
668 int32_t slotId, int32_t dataState, int32_t networkType)
669 {
670 AAFwk::Want want;
671 want.SetParam("slotId", slotId);
672 want.SetParam("dataState", dataState);
673 want.SetParam("networkType", networkType);
674 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_CELLULAR_DATA_STATE_CHANGED);
675 int32_t eventCode = 1;
676 std::string eventData("connectStateChanged");
677 PublishCommonEvent(want, eventCode, eventData);
678 }
679
SendSimStateChanged(int32_t slotId,CardType type,SimState state,LockReason reason)680 void TelephonyStateRegistryService::SendSimStateChanged(
681 int32_t slotId, CardType type, SimState state, LockReason reason)
682 {
683 AAFwk::Want want;
684 want.SetParam("slotId", slotId);
685 want.SetParam("cardType", static_cast<int32_t>(type));
686 want.SetParam("reason", static_cast<int32_t>(reason));
687 want.SetParam("state", static_cast<int32_t>(state));
688 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_SIM_STATE_CHANGED);
689 int32_t eventCode = 1;
690 std::string eventData("simStateChanged");
691 PublishCommonEvent(want, eventCode, eventData);
692 }
693
SendSignalInfoChanged(int32_t slotId,const std::vector<sptr<SignalInformation>> & vec)694 void TelephonyStateRegistryService::SendSignalInfoChanged(
695 int32_t slotId, const std::vector<sptr<SignalInformation>> &vec)
696 {
697 AAFwk::Want want;
698 want.SetParam("slotId", slotId);
699 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_SIGNAL_INFO_CHANGED);
700 std::vector<std::string> contentStr;
701 if (TELEPHONY_EXT_WRAPPER.sendSignalInfoChanged_ != nullptr) {
702 TELEPHONY_EXT_WRAPPER.sendSignalInfoChanged_(slotId, vec);
703 }
704 for (size_t i = 0; i < vec.size(); i++) {
705 sptr<SignalInformation> signal = vec[i];
706 if (signal != nullptr) {
707 contentStr.push_back(signal->ToString());
708 }
709 }
710 want.SetParam("signalInfos", contentStr);
711 int32_t eventCode = 1;
712 std::string eventData("signalInfoChanged");
713 PublishCommonEvent(want, eventCode, eventData);
714 }
715
SendNetworkStateChanged(int32_t slotId,const sptr<NetworkState> & networkState)716 void TelephonyStateRegistryService::SendNetworkStateChanged(int32_t slotId, const sptr<NetworkState> &networkState)
717 {
718 AAFwk::Want want;
719 want.SetParam("slotId", slotId);
720 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_NETWORK_STATE_CHANGED);
721 int32_t eventCode = 1;
722 if (TELEPHONY_EXT_WRAPPER.sendNetworkStateChanged_ != nullptr) {
723 TELEPHONY_EXT_WRAPPER.sendNetworkStateChanged_(slotId, networkState);
724 }
725 if (networkState != nullptr) {
726 want.SetParam("networkState", networkState->ToString());
727 }
728 std::string eventData("networkStateChanged");
729 PublishCommonEvent(want, eventCode, eventData);
730 }
731
Dump(std::int32_t fd,const std::vector<std::u16string> & args)732 int TelephonyStateRegistryService::Dump(std::int32_t fd, const std::vector<std::u16string> &args)
733 {
734 if (fd < 0) {
735 TELEPHONY_LOGE("dump fd invalid");
736 return TELEPHONY_ERR_FAIL;
737 }
738 std::vector<std::string> argsInStr;
739 for (const auto &arg : args) {
740 TELEPHONY_LOGI("Dump args: %{public}s", Str16ToStr8(arg).c_str());
741 argsInStr.emplace_back(Str16ToStr8(arg));
742 }
743 std::string result;
744 TelephonyStateRegistryDumpHelper dumpHelper;
745 std::lock_guard<std::mutex> guard(lock_);
746 if (dumpHelper.Dump(argsInStr, stateRecords_, result)) {
747 std::int32_t ret = dprintf(fd, "%s", result.c_str());
748 if (ret < 0) {
749 TELEPHONY_LOGE("dprintf to dump fd failed");
750 return TELEPHONY_ERR_FAIL;
751 }
752 return TELEPHONY_SUCCESS;
753 }
754 TELEPHONY_LOGW("dumpHelper failed");
755 return TELEPHONY_ERR_FAIL;
756 }
757
GetBindStartTime()758 std::string TelephonyStateRegistryService::GetBindStartTime()
759 {
760 std::ostringstream oss;
761 oss << bindStartTime_;
762 return oss.str();
763 }
764
GetBindEndTime()765 std::string TelephonyStateRegistryService::GetBindEndTime()
766 {
767 std::ostringstream oss;
768 oss << bindEndTime_;
769 return oss.str();
770 }
771
GetBindSpendTime()772 std::string TelephonyStateRegistryService::GetBindSpendTime()
773 {
774 std::ostringstream oss;
775 oss << (bindEndTime_ - bindStartTime_);
776 return oss.str();
777 }
778
GetServiceRunningState()779 int32_t TelephonyStateRegistryService::GetServiceRunningState()
780 {
781 return static_cast<int32_t>(state_);
782 }
783
GetSimState(int32_t slotId)784 int32_t TelephonyStateRegistryService::GetSimState(int32_t slotId)
785 {
786 std::map<int32_t, SimState>::iterator it;
787 int32_t result = TELEPHONY_ERROR;
788 for (it = simState_.begin(); it != simState_.end(); ++it) {
789 if (it->first == slotId) {
790 result = static_cast<int32_t>(it->second);
791 TELEPHONY_LOGI("CallState = %{public}d", result);
792 break;
793 }
794 }
795 return result;
796 }
797
GetCallState(int32_t slotId)798 int32_t TelephonyStateRegistryService::GetCallState(int32_t slotId)
799 {
800 std::map<int32_t, int32_t>::iterator it;
801 int32_t result = TELEPHONY_ERROR;
802 for (it = callState_.begin(); it != callState_.end(); ++it) {
803 if (it->first == slotId) {
804 result = it->second;
805 break;
806 }
807 }
808 return result;
809 }
810
GetCardType(int32_t slotId)811 int32_t TelephonyStateRegistryService::GetCardType(int32_t slotId)
812 {
813 std::map<int32_t, CardType>::iterator it;
814 int32_t result = TELEPHONY_ERROR;
815 for (it = cardType_.begin(); it != cardType_.end(); ++it) {
816 if (it->first == slotId) {
817 result = static_cast<int32_t>(it->second);
818 break;
819 }
820 }
821 return result;
822 }
823
GetCellularDataConnectionState(int32_t slotId)824 int32_t TelephonyStateRegistryService::GetCellularDataConnectionState(int32_t slotId)
825 {
826 std::map<int32_t, int32_t>::iterator it;
827 int32_t result = TELEPHONY_ERROR;
828 for (it = cellularDataConnectionState_.begin(); it != cellularDataConnectionState_.end(); ++it) {
829 if (it->first == slotId) {
830 result = it->second;
831 break;
832 }
833 }
834 return result;
835 }
836
GetCellularDataFlow(int32_t slotId)837 int32_t TelephonyStateRegistryService::GetCellularDataFlow(int32_t slotId)
838 {
839 std::map<int32_t, int32_t>::iterator it;
840 int32_t result = TELEPHONY_ERROR;
841 for (it = cellularDataFlow_.begin(); it != cellularDataFlow_.end(); ++it) {
842 if (it->first == slotId) {
843 result = it->second;
844 break;
845 }
846 }
847 return result;
848 }
849
GetCellularDataConnectionNetworkType(int32_t slotId)850 int32_t TelephonyStateRegistryService::GetCellularDataConnectionNetworkType(int32_t slotId)
851 {
852 std::map<int32_t, int32_t>::iterator it;
853 int32_t result = TELEPHONY_ERROR;
854 for (it = cellularDataConnectionNetworkType_.begin(); it != cellularDataConnectionNetworkType_.end(); ++it) {
855 if (it->first == slotId) {
856 result = it->second;
857 break;
858 }
859 }
860 return result;
861 }
862
GetLockReason(int32_t slotId)863 int32_t TelephonyStateRegistryService::GetLockReason(int32_t slotId)
864 {
865 std::map<int32_t, LockReason>::iterator it;
866 int32_t result = TELEPHONY_ERROR;
867 for (it = simReason_.begin(); it != simReason_.end(); ++it) {
868 if (it->first == slotId) {
869 result = static_cast<int32_t>(it->second);
870 break;
871 }
872 }
873 return result;
874 }
875
IsCommonEventServiceAbilityExist()876 bool TelephonyStateRegistryService::IsCommonEventServiceAbilityExist() __attribute__((no_sanitize("cfi")))
877 {
878 sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
879 if (sm == nullptr) {
880 TELEPHONY_LOGE("IsCommonEventServiceAbilityExist Get ISystemAbilityManager failed, no SystemAbilityManager");
881 return false;
882 }
883 sptr<IRemoteObject> remote = sm->CheckSystemAbility(COMMON_EVENT_SERVICE_ID);
884 if (remote == nullptr) {
885 TELEPHONY_LOGE("No CesServiceAbility");
886 return false;
887 }
888 return true;
889 }
890 } // namespace Telephony
891 } // namespace OHOS
892