1 /*
2 * Copyright (C) 2021-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 "multi_sim_controller.h"
17
18 #include <openssl/sha.h>
19
20 #include "common_event_manager.h"
21 #include "common_event_support.h"
22 #include "core_manager_inner.h"
23 #include "core_service_errors.h"
24 #include "core_service_hisysevent.h"
25 #include "ims_core_service_client.h"
26 #include "parameters.h"
27 #include "sim_data.h"
28 #include "sim_utils.h"
29 #include "string_ex.h"
30
31 namespace OHOS {
32 namespace Telephony {
33 static const int32_t EVENT_CODE = 1;
34 static const int32_t IMS_SWITCH_VALUE_UNKNOWN = -1;
35 const int32_t SYSTEM_PARAMETER_LENGTH = 128;
36 static const std::string PARAM_SIMID = "simId";
37 static const std::string PARAM_SET_PRIMARY_STATUS = "setDone";
38 static const std::string DEFAULT_VOICE_SIMID_CHANGED = "defaultVoiceSimIdChanged";
39 static const std::string DEFAULT_SMS_SIMID_CHANGED = "defaultSmsSimIdChanged";
40 static const std::string DEFAULT_CELLULAR_DATA_SIMID_CHANGED = "defaultCellularDataSimIdChanged";
41 static const std::string DEFAULT_MAIN_SIMID_CHANGED = "defaultMainSimIdChanged";
42 static const std::string MAIN_CARD_ICCID_KEY = "persist.telephony.MainCard.Iccid";
43 static const std::string PRIMARY_SLOTID_KEY = "persist.telephony.MainSlotId";
44 static const std::string MAIN_CELLULAR_DATA_SLOTID_KEY = "persist.telephony.MainCellularDataSlotId";
45 static const std::string PRIMARY_SLOTID = "0";
46
MultiSimController(std::shared_ptr<Telephony::ITelRilManager> telRilManager,std::vector<std::shared_ptr<Telephony::SimStateManager>> simStateManager,std::vector<std::shared_ptr<Telephony::SimFileManager>> simFileManager)47 MultiSimController::MultiSimController(std::shared_ptr<Telephony::ITelRilManager> telRilManager,
48 std::vector<std::shared_ptr<Telephony::SimStateManager>> simStateManager,
49 std::vector<std::shared_ptr<Telephony::SimFileManager>> simFileManager)
50 : simStateManager_(simStateManager), simFileManager_(simFileManager)
51 {
52 TELEPHONY_LOGI("MultiSimController::MultiSimController");
53 radioProtocolController_ = std::make_shared<RadioProtocolController>(std::weak_ptr<ITelRilManager>(telRilManager));
54 InitMainCardSlotId();
55 }
56
~MultiSimController()57 MultiSimController::~MultiSimController()
58 {
59 if (radioProtocolController_ != nullptr) {
60 radioProtocolController_->UnRegisterEvents();
61 }
62 }
63
64 // set all data to invalid wait for InitData to rebuild
Init()65 void MultiSimController::Init()
66 {
67 if (simDbHelper_ == nullptr) {
68 simDbHelper_ = std::make_unique<SimRdbHelper>();
69 }
70 if (radioProtocolController_ != nullptr) {
71 radioProtocolController_->Init();
72 }
73 maxCount_ = SIM_SLOT_COUNT;
74 TELEPHONY_LOGI("Create SimRdbHelper count = %{public}d", maxCount_);
75 }
76
ForgetAllData()77 bool MultiSimController::ForgetAllData()
78 {
79 if (simDbHelper_ == nullptr) {
80 TELEPHONY_LOGE("simDbHelper_ is nullptr failed");
81 return false;
82 }
83 return (simDbHelper_->ForgetAllData() != INVALID_VALUE);
84 }
85
ForgetAllData(int32_t slotId)86 bool MultiSimController::ForgetAllData(int32_t slotId)
87 {
88 if (simDbHelper_ == nullptr) {
89 TELEPHONY_LOGE("simDbHelper_ is nullptr");
90 return false;
91 }
92 return simDbHelper_->ForgetAllData(slotId) != INVALID_VALUE;
93 }
94
InitData(int32_t slotId)95 bool MultiSimController::InitData(int32_t slotId)
96 {
97 TELEPHONY_LOGI("start to initData slotId is %{public}d", slotId);
98 if (!IsValidData(slotId)) {
99 TELEPHONY_LOGE("has no sim card, abandon");
100 return false;
101 }
102 if (!InitIccId(slotId)) { // check if we insert or reactive a data
103 TELEPHONY_LOGE("can not init IccId");
104 return false;
105 }
106 if (!GetListFromDataBase()) { // init data base to local cache
107 TELEPHONY_LOGE("can not get dataBase");
108 return false;
109 }
110 if (localCacheInfo_.size() <= 0) {
111 TELEPHONY_LOGE("MultiSimController::we get nothing from init");
112 return false;
113 }
114 if (!InitActive(slotId)) {
115 TELEPHONY_LOGE("InitActive failed");
116 return false;
117 }
118 if (!InitShowNumber(slotId)) {
119 TELEPHONY_LOGE("InitShowNumber failed");
120 }
121 if (InitPrimary()) {
122 TELEPHONY_LOGI("InitPrimary start");
123 CheckIfNeedSwitchMainSlotId();
124 }
125 return true;
126 }
127
InitActive(int slotId)128 bool MultiSimController::InitActive(int slotId)
129 {
130 bool result = true;
131 if (!simStateManager_[slotId]->HasSimCard()) {
132 TELEPHONY_LOGI("has no sim and not need to active");
133 return result;
134 }
135 if (!IsSimActive(slotId)) {
136 result = (SetActiveSim(slotId, DEACTIVE, true) == TELEPHONY_ERR_SUCCESS);
137 }
138 if (IsSimActive(slotId)) {
139 result = (SetActiveSim(slotId, ACTIVE, true) == TELEPHONY_ERR_SUCCESS);
140 }
141 return result;
142 }
143
InitPrimary()144 bool MultiSimController::InitPrimary()
145 {
146 if (maxCount_ <= 1) {
147 TELEPHONY_LOGI("no need to init");
148 return false;
149 }
150 if (!IsAllModemInitDone()) {
151 TELEPHONY_LOGI("wait for the other modem init");
152 return false;
153 }
154 unInitModemSlotId_ = INVALID_VALUE;
155 if (IsAllCardsReady() && !IsAllCardsLoaded()) {
156 TELEPHONY_LOGI("wait for the other card ready");
157 return false;
158 }
159 return true;
160 }
161
ReCheckPrimary()162 void MultiSimController::ReCheckPrimary()
163 {
164 if (InitPrimary()) {
165 TELEPHONY_LOGI("ReCheckPrimary start");
166 CheckIfNeedSwitchMainSlotId();
167 }
168 }
169
IsAllCardsReady()170 bool MultiSimController::IsAllCardsReady()
171 {
172 for (int32_t i = 0; i < maxCount_; i++) {
173 if (simStateManager_[i] != nullptr && simStateManager_[i]->GetSimState() != SimState::SIM_STATE_READY) {
174 TELEPHONY_LOGI("single card ready");
175 return false;
176 }
177 }
178 return true;
179 }
180
IsAllModemInitDone()181 bool MultiSimController::IsAllModemInitDone()
182 {
183 for (int32_t i = 0; i < maxCount_; i++) {
184 if (simStateManager_[i] != nullptr && !(simStateManager_[i]->IfModemInitDone())) {
185 TELEPHONY_LOGI("single modem init done");
186 unInitModemSlotId_ = i;
187 return false;
188 }
189 }
190 return true;
191 }
192
IsAllCardsLoaded()193 bool MultiSimController::IsAllCardsLoaded()
194 {
195 if (localCacheInfo_.empty()) {
196 TELEPHONY_LOGI("there is no card loaded");
197 return false;
198 }
199 for (int32_t i = 0; i < maxCount_; i++) {
200 if (localCacheInfo_[i].iccId.empty()) {
201 TELEPHONY_LOGI("single card loaded");
202 return false;
203 }
204 }
205 return true;
206 }
207
InitIccId(int slotId)208 bool MultiSimController::InitIccId(int slotId)
209 {
210 if (simFileManager_[slotId] == nullptr) {
211 TELEPHONY_LOGE("can not get simFileManager");
212 return false;
213 }
214 std::string newIccId = Str16ToStr8(simFileManager_[slotId]->GetSimIccId());
215 if (newIccId.empty()) {
216 TELEPHONY_LOGE("can not get iccId");
217 return false;
218 }
219 if (simDbHelper_ == nullptr) {
220 TELEPHONY_LOGE("failed by nullptr");
221 return false;
222 }
223 int32_t result;
224 SimRdbInfo simRdbInfo;
225 if (simDbHelper_->QueryDataByIccId(newIccId, simRdbInfo) == INVALID_VALUE) {
226 TELEPHONY_LOGE("query fail");
227 return false;
228 }
229 if (!simRdbInfo.iccId.empty()) { // already have this card, reactive it
230 TELEPHONY_LOGI("old sim insert");
231 result = UpdateDataByIccId(slotId, newIccId);
232 } else { // insert a new data for new IccId
233 TELEPHONY_LOGI("new sim insert");
234 result = InsertData(slotId, newIccId);
235 }
236 if (result == INVALID_VALUE) {
237 TELEPHONY_LOGE("failed to init data");
238 return false;
239 }
240 TELEPHONY_LOGI("result is %{public}d", result);
241 return true;
242 }
243
UpdateDataByIccId(int slotId,const std::string & newIccId)244 int32_t MultiSimController::UpdateDataByIccId(int slotId, const std::string &newIccId)
245 {
246 if (simDbHelper_ == nullptr) {
247 TELEPHONY_LOGE("failed by nullptr");
248 return INVALID_VALUE;
249 }
250 DataShare::DataShareValuesBucket values;
251 DataShare::DataShareValueObject slotObj(slotId);
252 values.Put(SimData::SLOT_INDEX, slotObj);
253 const int32_t slotSingle = 1;
254 if (SIM_SLOT_COUNT == slotSingle) {
255 DataShare::DataShareValueObject mainCardObj(MAIN_CARD);
256 values.Put(SimData::IS_MAIN_CARD, mainCardObj);
257 values.Put(SimData::IS_VOICE_CARD, mainCardObj);
258 values.Put(SimData::IS_MESSAGE_CARD, mainCardObj);
259 values.Put(SimData::IS_CELLULAR_DATA_CARD, mainCardObj);
260 }
261 return simDbHelper_->UpdateDataByIccId(newIccId, values);
262 }
263
InsertData(int slotId,const std::string & newIccId)264 int32_t MultiSimController::InsertData(int slotId, const std::string &newIccId)
265 {
266 if (simDbHelper_ == nullptr) {
267 TELEPHONY_LOGE("failed by nullptr");
268 return INVALID_VALUE;
269 }
270 DataShare::DataShareValuesBucket values;
271 DataShare::DataShareValueObject slotObj(slotId);
272 DataShare::DataShareValueObject iccidObj(newIccId);
273 DataShare::DataShareValueObject valueObj(ACTIVE);
274 values.Put(SimData::SLOT_INDEX, slotObj);
275 values.Put(SimData::ICC_ID, iccidObj);
276 values.Put(SimData::CARD_ID, iccidObj); // iccId == cardId by now
277 values.Put(SimData::IS_ACTIVE, valueObj);
278 const int32_t slotSingle = 1;
279 if (SIM_SLOT_COUNT == slotSingle) {
280 DataShare::DataShareValueObject mainCardObj(MAIN_CARD);
281 values.Put(SimData::IS_MAIN_CARD, mainCardObj);
282 values.Put(SimData::IS_VOICE_CARD, mainCardObj);
283 values.Put(SimData::IS_MESSAGE_CARD, mainCardObj);
284 values.Put(SimData::IS_CELLULAR_DATA_CARD, mainCardObj);
285 } else {
286 DataShare::DataShareValueObject notMainCardObj(NOT_MAIN);
287 values.Put(SimData::IS_MAIN_CARD, notMainCardObj);
288 values.Put(SimData::IS_VOICE_CARD, notMainCardObj);
289 values.Put(SimData::IS_MESSAGE_CARD, notMainCardObj);
290 values.Put(SimData::IS_CELLULAR_DATA_CARD, notMainCardObj);
291 }
292 int64_t id;
293 return simDbHelper_->InsertData(id, values);
294 }
295
InitShowNumber(int slotId)296 bool MultiSimController::InitShowNumber(int slotId)
297 {
298 std::u16string showNumber;
299 if (!IsValidData(slotId)) {
300 TELEPHONY_LOGE("InValidData");
301 return false;
302 }
303 if (simFileManager_[slotId] == nullptr) {
304 TELEPHONY_LOGE("can not get simFileManager");
305 return false;
306 }
307 showNumber = simFileManager_[slotId]->GetSimTelephoneNumber();
308 int32_t result = TELEPHONY_ERROR;
309 result = SetShowNumberToDB(slotId, showNumber);
310 return result == TELEPHONY_ERR_SUCCESS;
311 }
312
GetListFromDataBase()313 bool MultiSimController::GetListFromDataBase()
314 {
315 TELEPHONY_LOGD("start");
316 std::vector<SimRdbInfo> newCache;
317 if (simDbHelper_ == nullptr) {
318 TELEPHONY_LOGE("failed by nullptr");
319 return false;
320 }
321 int32_t result = simDbHelper_->QueryAllValidData(newCache);
322 TELEPHONY_LOGI("QueryAllValidData result is %{public}d", result);
323 std::unique_lock<std::mutex> lock(mutex_);
324 if (localCacheInfo_.size() > 0) {
325 localCacheInfo_.clear();
326 }
327 localCacheInfo_ = newCache;
328 SortCache();
329 return (result != INVALID_VALUE) ? true : false;
330 }
331
SortCache()332 void MultiSimController::SortCache()
333 {
334 size_t count = localCacheInfo_.size();
335 TELEPHONY_LOGI("count = %{public}lu", static_cast<unsigned long>(count));
336 if (count <= 0) {
337 TELEPHONY_LOGE("empty");
338 return;
339 }
340 std::vector<SimRdbInfo> sortCache;
341 SimRdbInfo emptyUnit;
342 emptyUnit.isActive = DEACTIVE;
343 emptyUnit.iccId = "";
344 for (int i = 0; i < maxCount_; i++) {
345 emptyUnit.slotIndex = i;
346 sortCache.emplace_back(emptyUnit);
347 }
348 for (size_t j = 0; j < count; j++) {
349 TELEPHONY_LOGD(
350 "index = %{public}d j = %{public}lu", localCacheInfo_[j].slotIndex, static_cast<unsigned long>(j));
351 sortCache[localCacheInfo_[j].slotIndex] = localCacheInfo_[j];
352 }
353 localCacheInfo_ = sortCache;
354 }
355
356 /*
357 * check the data is valid, if we don't have SimCard the data is not valid
358 */
IsValidData(int32_t slotId)359 bool MultiSimController::IsValidData(int32_t slotId)
360 {
361 if ((slotId < DEFAULT_SIM_SLOT_ID) || (slotId >= SIM_SLOT_COUNT)) {
362 TELEPHONY_LOGE("can not get simStateManager");
363 return false;
364 }
365 if (simStateManager_.empty() || static_cast<uint32_t>(slotId) >= simStateManager_.size() ||
366 simStateManager_[slotId] == nullptr) {
367 TELEPHONY_LOGE("can not get simStateManager");
368 return false;
369 }
370 return simStateManager_[slotId]->HasSimCard();
371 }
372
RefreshActiveIccAccountInfoList()373 bool MultiSimController::RefreshActiveIccAccountInfoList()
374 {
375 std::unique_lock<std::mutex> lock(mutex_);
376 if (localCacheInfo_.empty()) {
377 TELEPHONY_LOGE("failed by invalid data");
378 return false;
379 }
380 std::vector<SimRdbInfo>::iterator it = localCacheInfo_.begin();
381 if (iccAccountInfoList_.size() > 0) {
382 iccAccountInfoList_.clear();
383 }
384 while (it != localCacheInfo_.end()) { // loop data list
385 if (it->isActive == ACTIVE) { // pick Active item
386 iccAccountInfo_.Init(it->simId, it->slotIndex);
387 iccAccountInfo_.showName = Str8ToStr16(it->showName);
388 iccAccountInfo_.showNumber = Str8ToStr16(it->phoneNumber);
389 iccAccountInfo_.iccId = Str8ToStr16(it->iccId);
390 iccAccountInfo_.isActive = it->isActive;
391 iccAccountInfoList_.emplace_back(iccAccountInfo_);
392 }
393 ++it;
394 }
395 return true;
396 }
397
GetSlotId(int32_t simId)398 int32_t MultiSimController::GetSlotId(int32_t simId)
399 {
400 std::unique_lock<std::mutex> lock(mutex_);
401 if (localCacheInfo_.empty()) {
402 TELEPHONY_LOGE("failed by nullptr");
403 return INVALID_VALUE;
404 }
405 std::vector<SimRdbInfo>::iterator it = localCacheInfo_.begin();
406
407 while (it != localCacheInfo_.end()) { // loop data list
408 if (it->isActive == ACTIVE && it->simId == simId) { // pick Active item
409 return it->slotIndex;
410 }
411 ++it;
412 }
413 return INVALID_VALUE;
414 }
415
IsSimActive(int32_t slotId)416 bool MultiSimController::IsSimActive(int32_t slotId)
417 {
418 if (!IsValidData(slotId)) {
419 TELEPHONY_LOGE("InValidData");
420 return false;
421 }
422 if (static_cast<uint32_t>(slotId) >= localCacheInfo_.size()) {
423 TELEPHONY_LOGE("failed by out of range");
424 return false;
425 }
426 return localCacheInfo_[slotId].isActive == ACTIVE ? true : false;
427 }
428
SetActiveSim(int32_t slotId,int32_t enable,bool force)429 int32_t MultiSimController::SetActiveSim(int32_t slotId, int32_t enable, bool force)
430 {
431 TELEPHONY_LOGI("enable = %{public}d slotId = %{public}d", enable, slotId);
432 if (!IsValidData(slotId)) {
433 TELEPHONY_LOGE("invalid slotid or sim card absent.");
434 return TELEPHONY_ERR_NO_SIM_CARD;
435 }
436 int curSimId = 0;
437 if (GetTargetSimId(slotId, curSimId) != TELEPHONY_ERR_SUCCESS) {
438 TELEPHONY_LOGE("failed by out of range");
439 return TELEPHONY_ERR_ARGUMENT_INVALID;
440 }
441 if (!SetActiveSimToRil(slotId, ENTITY_CARD, enable)) {
442 TELEPHONY_LOGE("SetActiveSimToRil failed");
443 return TELEPHONY_ERR_RIL_CMD_FAIL;
444 }
445 if (force) {
446 TELEPHONY_LOGD("no need to update cache");
447 return TELEPHONY_ERR_SUCCESS;
448 }
449 if (simDbHelper_ == nullptr) {
450 TELEPHONY_LOGE("failed by nullptr");
451 return TELEPHONY_ERR_LOCAL_PTR_NULL;
452 }
453 DataShare::DataShareValuesBucket values;
454 DataShare::DataShareValueObject valueObj(enable);
455 values.Put(SimData::IS_ACTIVE, valueObj);
456 int32_t result = simDbHelper_->UpdateDataBySimId(curSimId, values);
457 if (result == INVALID_VALUE) {
458 TELEPHONY_LOGE("failed by database");
459 return TELEPHONY_ERR_DATABASE_WRITE_FAIL;
460 }
461 std::unique_lock<std::mutex> lock(mutex_);
462 if (static_cast<uint32_t>(slotId) >= localCacheInfo_.size()) {
463 TELEPHONY_LOGE("failed by out of range");
464 return TELEPHONY_ERR_ARGUMENT_INVALID;
465 }
466 localCacheInfo_[slotId].isActive = enable;
467 lock.unlock();
468 CheckIfNeedSwitchMainSlotId();
469 return TELEPHONY_ERR_SUCCESS;
470 }
471
CheckIfNeedSwitchMainSlotId()472 void MultiSimController::CheckIfNeedSwitchMainSlotId()
473 {
474 TELEPHONY_LOGD("start");
475 if (IsSimActive(lastPrimarySlotId_)) {
476 TELEPHONY_LOGI("main slotId active, no need to switch main card");
477 if (!IsAllCardsReady()) {
478 SavePrimarySlotIdInfo(lastPrimarySlotId_);
479 }
480 } else {
481 int32_t firstActivedSlotId = GetFirstActivedSlotId();
482 if (!IsValidSlotId(firstActivedSlotId)) {
483 TELEPHONY_LOGE("active slotId is invalid");
484 return;
485 }
486 TELEPHONY_LOGI("need to set slot%{public}d primary", firstActivedSlotId);
487 std::thread initDataTask([&, firstActivedSlotId = firstActivedSlotId]() {
488 pthread_setname_np(pthread_self(), "SetPrimarySlotId");
489 CoreManagerInner::GetInstance().SetPrimarySlotId(firstActivedSlotId);
490 });
491 initDataTask.detach();
492 }
493 }
494
IsValidSlotId(int32_t slotId)495 bool MultiSimController::IsValidSlotId(int32_t slotId)
496 {
497 return ((slotId >= DEFAULT_SIM_SLOT_ID) && (slotId < SIM_SLOT_COUNT));
498 }
499
SetActiveSimToRil(int32_t slotId,int32_t type,int32_t enable)500 bool MultiSimController::SetActiveSimToRil(int32_t slotId, int32_t type, int32_t enable)
501 {
502 if (radioProtocolController_ == nullptr) {
503 TELEPHONY_LOGE("radioProtocolController_ is nullptr");
504 return false;
505 }
506 std::unique_lock<std::mutex> lck(radioProtocolController_->ctx_);
507 radioProtocolController_->RadioProtocolControllerWait();
508 if (!radioProtocolController_->SetActiveSimToRil(slotId, type, enable)) {
509 TELEPHONY_LOGE("MultiSimController::SetActiveSimToRil failed");
510 return false;
511 }
512 while (!radioProtocolController_->RadioProtocolControllerPoll()) {
513 TELEPHONY_LOGI("MultiSimController SetActiveSimToRil wait");
514 radioProtocolController_->cv_.wait(lck);
515 }
516 return radioProtocolController_->GetActiveSimToRilResult() == static_cast<int32_t>(HRilErrType::NONE);
517 }
518
GetSimAccountInfo(int32_t slotId,bool denied,IccAccountInfo & info)519 int32_t MultiSimController::GetSimAccountInfo(int32_t slotId, bool denied, IccAccountInfo &info)
520 {
521 if (!IsValidData(slotId)) {
522 TELEPHONY_LOGE("MultiSimController::GetSimAccountInfo InValidData");
523 return TELEPHONY_ERR_NO_SIM_CARD;
524 }
525 std::unique_lock<std::mutex> lock(mutex_);
526 if (static_cast<uint32_t>(slotId) >= localCacheInfo_.size()) {
527 TELEPHONY_LOGE("MultiSimController::GetSimAccountInfo failed by out of range");
528 return TELEPHONY_ERR_SLOTID_INVALID;
529 }
530 if (localCacheInfo_[slotId].iccId.empty()) {
531 TELEPHONY_LOGE("MultiSimController::GetSimAccountInfo failed by no data");
532 return CORE_ERR_SIM_CARD_LOAD_FAILED;
533 }
534 info.slotIndex = localCacheInfo_[slotId].slotIndex;
535 info.simId = localCacheInfo_[slotId].simId;
536 info.isActive = localCacheInfo_[slotId].isActive;
537 info.showName = Str8ToStr16(localCacheInfo_[slotId].showName);
538 info.isEsim = false;
539 if (!denied) {
540 info.showNumber = Str8ToStr16(localCacheInfo_[slotId].phoneNumber);
541 info.iccId = Str8ToStr16(localCacheInfo_[slotId].iccId);
542 }
543 return TELEPHONY_ERR_SUCCESS;
544 }
545
GetDefaultVoiceSlotId()546 int32_t MultiSimController::GetDefaultVoiceSlotId()
547 {
548 if (GetLocalCacheSize() == 0) {
549 TELEPHONY_LOGE("failed by nullptr");
550 if (simDbHelper_ == nullptr) {
551 TELEPHONY_LOGE("simDbHelper is nullptr");
552 return INVALID_VALUE;
553 }
554 return simDbHelper_->GetDefaultVoiceCardSlotId();
555 }
556 std::unique_lock<std::mutex> lock(mutex_);
557 if (localCacheInfo_.size() != static_cast<size_t>(maxCount_)) {
558 TELEPHONY_LOGE("localCacheInfo_ is empty or invalid");
559 return INVALID_VALUE;
560 }
561 int32_t i = DEFAULT_SIM_SLOT_ID;
562 for (; i < maxCount_; i++) {
563 if (localCacheInfo_[i].isVoiceCard == MAIN_CARD && localCacheInfo_[i].isActive == ACTIVE) {
564 return i;
565 }
566 }
567 return INVALID_VALUE;
568 }
569
GetLocalCacheSize()570 size_t MultiSimController::GetLocalCacheSize()
571 {
572 std::unique_lock<std::mutex> lock(mutex_);
573 return localCacheInfo_.size();
574 }
575
GetTargetSimId(int32_t slotId,int & simId)576 int32_t MultiSimController::GetTargetSimId(int32_t slotId, int &simId)
577 {
578 std::unique_lock<std::mutex> lock(mutex_);
579 simId = 0;
580 if (static_cast<uint32_t>(slotId) >= localCacheInfo_.size()) {
581 return TELEPHONY_ERR_ARGUMENT_INVALID;
582 }
583 simId = localCacheInfo_[slotId].simId;
584 return TELEPHONY_ERR_SUCCESS;
585 }
586
GetFirstActivedSlotId()587 int32_t MultiSimController::GetFirstActivedSlotId()
588 {
589 int32_t i = DEFAULT_SIM_SLOT_ID;
590 for (; i < maxCount_; i++) {
591 if (localCacheInfo_[i].isActive == ACTIVE) {
592 return localCacheInfo_[i].slotIndex;
593 }
594 }
595 return INVALID_VALUE;
596 }
597
SetDefaultVoiceSlotId(int32_t slotId)598 int32_t MultiSimController::SetDefaultVoiceSlotId(int32_t slotId)
599 {
600 TELEPHONY_LOGD("slotId = %{public}d", slotId);
601 int curSimId = 0;
602 int32_t ret = GetTargetDefaultSimId(slotId, curSimId);
603 if (ret != TELEPHONY_ERR_SUCCESS) {
604 TELEPHONY_LOGE("ret is %{public}d", ret);
605 return ret;
606 }
607 if (simDbHelper_ == nullptr) {
608 TELEPHONY_LOGE("failed by nullptr");
609 return TELEPHONY_ERR_LOCAL_PTR_NULL;
610 }
611 int32_t result = simDbHelper_->SetDefaultVoiceCard(curSimId);
612 if (result == INVALID_VALUE) {
613 TELEPHONY_LOGE("get Data Base failed");
614 return TELEPHONY_ERR_DATABASE_WRITE_FAIL;
615 }
616 int32_t i = DEFAULT_SIM_SLOT_ID;
617 std::unique_lock<std::mutex> lock(mutex_);
618 if (localCacheInfo_.size() != static_cast<size_t>(maxCount_)) {
619 TELEPHONY_LOGE("no sim card");
620 return TELEPHONY_ERR_NO_SIM_CARD;
621 }
622 for (; i < maxCount_; i++) { // save to cache
623 if (slotId == i) {
624 localCacheInfo_[i].isVoiceCard = MAIN_CARD;
625 curSimId = localCacheInfo_[i].simId;
626 continue;
627 }
628 localCacheInfo_[i].isVoiceCard = NOT_MAIN;
629 }
630 lock.unlock();
631 if (curSimId == defaultVoiceSimId_) {
632 TELEPHONY_LOGE("no need to AnnounceDefaultVoiceSimIdChanged");
633 return TELEPHONY_ERR_SUCCESS;
634 }
635 defaultVoiceSimId_ = curSimId;
636 if (!AnnounceDefaultVoiceSimIdChanged(defaultVoiceSimId_)) {
637 return TELEPHONY_ERR_PUBLISH_BROADCAST_FAIL;
638 }
639 return TELEPHONY_ERR_SUCCESS;
640 }
641
GetDefaultSmsSlotId()642 int32_t MultiSimController::GetDefaultSmsSlotId()
643 {
644 if (GetLocalCacheSize() == 0) {
645 TELEPHONY_LOGE("failed by nullptr");
646 if (simDbHelper_ == nullptr) {
647 TELEPHONY_LOGE("simDbHelper is nullptr");
648 return INVALID_VALUE;
649 }
650 return simDbHelper_->GetDefaultMessageCardSlotId();
651 }
652 std::unique_lock<std::mutex> lock(mutex_);
653 if (localCacheInfo_.size() != static_cast<size_t>(maxCount_)) {
654 TELEPHONY_LOGE("localCacheInfo_ is empty or invalid");
655 return INVALID_VALUE;
656 }
657 int32_t i = DEFAULT_SIM_SLOT_ID;
658 for (; i < maxCount_; i++) {
659 if (localCacheInfo_[i].isMessageCard == MAIN_CARD && localCacheInfo_[i].isActive == ACTIVE) {
660 return i;
661 }
662 }
663 return GetFirstActivedSlotId();
664 }
665
SetDefaultSmsSlotId(int32_t slotId)666 int32_t MultiSimController::SetDefaultSmsSlotId(int32_t slotId)
667 {
668 TELEPHONY_LOGD("slotId = %{public}d", slotId);
669 int curSimId = 0;
670 int32_t ret = GetTargetDefaultSimId(slotId, curSimId);
671 if (ret != TELEPHONY_ERR_SUCCESS) {
672 TELEPHONY_LOGE("ret is %{public}d", ret);
673 return ret;
674 }
675 if (simDbHelper_ == nullptr) {
676 TELEPHONY_LOGE("failed by nullptr");
677 return TELEPHONY_ERR_LOCAL_PTR_NULL;
678 }
679 int32_t result = simDbHelper_->SetDefaultMessageCard(curSimId);
680 if (result == INVALID_VALUE) {
681 TELEPHONY_LOGE("get Data Base failed");
682 return TELEPHONY_ERR_DATABASE_WRITE_FAIL;
683 }
684 int32_t i = DEFAULT_SIM_SLOT_ID;
685 std::unique_lock<std::mutex> lock(mutex_);
686 if (localCacheInfo_.size() != static_cast<size_t>(maxCount_)) {
687 TELEPHONY_LOGE("localCacheInfo_ is empty");
688 return TELEPHONY_ERR_NO_SIM_CARD;
689 }
690 for (; i < maxCount_; i++) { // save to cache
691 if (slotId == i) {
692 localCacheInfo_[i].isMessageCard = MAIN_CARD;
693 curSimId = localCacheInfo_[slotId].simId;
694 continue;
695 }
696 localCacheInfo_[i].isMessageCard = NOT_MAIN;
697 }
698 lock.unlock();
699 if (curSimId == defaultSmsSimId_) {
700 TELEPHONY_LOGE("no need to AnnounceDefaultSmsSimIdChanged");
701 return TELEPHONY_ERR_SUCCESS;
702 }
703 defaultSmsSimId_ = curSimId;
704 if (!AnnounceDefaultSmsSimIdChanged(defaultSmsSimId_)) {
705 return TELEPHONY_ERR_PUBLISH_BROADCAST_FAIL;
706 }
707 return TELEPHONY_ERR_SUCCESS;
708 }
709
GetTargetDefaultSimId(int32_t slotId,int & simId)710 int32_t MultiSimController::GetTargetDefaultSimId(int32_t slotId, int &simId)
711 {
712 std::unique_lock<std::mutex> lock(mutex_);
713 simId = 0;
714 if ((slotId == DEFAULT_SIM_SLOT_ID_REMOVE && localCacheInfo_.empty()) ||
715 (slotId != DEFAULT_SIM_SLOT_ID_REMOVE && !IsValidData(slotId))) {
716 TELEPHONY_LOGE("no sim card");
717 return TELEPHONY_ERR_NO_SIM_CARD;
718 }
719 if (slotId != DEFAULT_SIM_SLOT_ID_REMOVE && !IsSimActive(slotId)) {
720 TELEPHONY_LOGE("slotId is not active!");
721 return CORE_SERVICE_SIM_CARD_IS_NOT_ACTIVE;
722 }
723 if (slotId != DEFAULT_SIM_SLOT_ID_REMOVE) {
724 simId = localCacheInfo_[slotId].simId;
725 }
726 return TELEPHONY_ERR_SUCCESS;
727 }
728
GetDefaultCellularDataSlotId()729 int32_t MultiSimController::GetDefaultCellularDataSlotId()
730 {
731 TELEPHONY_LOGD("start lastCellularDataSlotId_ is %{public}d", lastCellularDataSlotId_);
732 return lastCellularDataSlotId_;
733 }
734
SetDefaultCellularDataSlotId(int32_t slotId)735 int32_t MultiSimController::SetDefaultCellularDataSlotId(int32_t slotId)
736 {
737 SaveDefaultCellularDataSlotIdInfo(slotId);
738 lastCellularDataSlotId_ = slotId;
739 CoreServiceHiSysEvent::WriteDefaultDataSlotIdBehaviorEvent(slotId);
740 return TELEPHONY_ERR_SUCCESS;
741 }
742
GetPrimarySlotId()743 int32_t MultiSimController::GetPrimarySlotId()
744 {
745 TELEPHONY_LOGD("start lastPrimarySlotId_ is %{public}d", lastPrimarySlotId_);
746 return lastPrimarySlotId_;
747 }
748
SetPrimarySlotId(int32_t slotId)749 int32_t MultiSimController::SetPrimarySlotId(int32_t slotId)
750 {
751 TELEPHONY_LOGD("slotId = %{public}d", slotId);
752 if (!IsValidData(slotId)) {
753 TELEPHONY_LOGE("no sim card");
754 return TELEPHONY_ERR_NO_SIM_CARD;
755 }
756 if (lastPrimarySlotId_ == slotId) {
757 TELEPHONY_LOGI("The current slot is the main slot, no need to set primary slot");
758 SavePrimarySlotIdInfo(slotId);
759 return TELEPHONY_ERR_SUCCESS;
760 }
761 // change protocol for default cellulardata slotId
762 PublishSetPrimaryEvent(false);
763 if (radioProtocolController_ == nullptr || !radioProtocolController_->SetRadioProtocol(slotId)) {
764 TELEPHONY_LOGE("SetRadioProtocol failed");
765 PublishSetPrimaryEvent(true);
766 return TELEPHONY_ERR_LOCAL_PTR_NULL;
767 }
768 SavePrimarySlotIdInfo(slotId);
769 PublishSetPrimaryEvent(true);
770 for (int32_t i = 0; i < maxCount_; i++) {
771 if (!(localCacheInfo_[i].iccId.empty())) {
772 InitActive(i);
773 }
774 }
775 return TELEPHONY_ERR_SUCCESS;
776 }
777
PublishSetPrimaryEvent(bool setDone)778 void MultiSimController::PublishSetPrimaryEvent(bool setDone)
779 {
780 AAFwk::Want want;
781 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_SET_PRIMARY_SLOT_STATUS);
782 want.SetParam(PARAM_SET_PRIMARY_STATUS, setDone);
783 EventFwk::CommonEventData data;
784 data.SetWant(want);
785
786 EventFwk::CommonEventPublishInfo publishInfo;
787 publishInfo.SetSticky(true);
788 bool publishResult = EventFwk::CommonEventManager::PublishCommonEvent(data, publishInfo, nullptr);
789 TELEPHONY_LOGI("result : %{public}d", publishResult);
790 }
791
SendMainCardBroadCast(int32_t slotId)792 void MultiSimController::SendMainCardBroadCast(int32_t slotId)
793 {
794 std::unique_lock<std::mutex> lock(mutex_);
795 if (localCacheInfo_.empty() || static_cast<uint32_t>(slotId) >= localCacheInfo_.size()) {
796 TELEPHONY_LOGE("no need to update cache");
797 return;
798 }
799 if (localCacheInfo_[slotId].simId == primarySimId_) {
800 TELEPHONY_LOGE("no need to AnnouncePrimarySimIdChanged");
801 return;
802 }
803 primarySimId_ = localCacheInfo_[slotId].simId;
804 lock.unlock();
805 TELEPHONY_LOGI("Announce main simId %{public}d", primarySimId_);
806 AnnouncePrimarySimIdChanged(primarySimId_);
807 }
808
SendDefaultCellularDataBroadCast(int32_t slotId)809 void MultiSimController::SendDefaultCellularDataBroadCast(int32_t slotId)
810 {
811 if (localCacheInfo_.empty() || static_cast<uint32_t>(slotId) >= localCacheInfo_.size()) {
812 TELEPHONY_LOGE("no need to update cache");
813 return;
814 }
815 if (localCacheInfo_[slotId].simId == defaultCellularSimId_) {
816 TELEPHONY_LOGE("no need to AnnouncePrimarySimIdChanged");
817 return;
818 }
819 defaultCellularSimId_ = localCacheInfo_[slotId].simId;
820 TELEPHONY_LOGI("Announce default cellular data simId %{public}d", defaultCellularSimId_);
821 AnnounceDefaultCellularDataSimIdChanged(defaultCellularSimId_);
822 }
823
EncryptIccId(const std::string iccid)824 std::string MultiSimController::EncryptIccId(const std::string iccid)
825 {
826 unsigned char hash[SHA256_DIGEST_LENGTH];
827 SHA256_CTX sha256;
828 SHA256_Init(&sha256);
829 SHA256_Update(&sha256, iccid.c_str(), iccid.size());
830 SHA256_Final(hash, &sha256);
831 std::string encryptIccId = SIMUtils::BytesConvertToHexString(hash, SHA256_DIGEST_LENGTH);
832 return encryptIccId;
833 }
834
SavePrimarySlotIdInfo(int32_t slotId)835 void MultiSimController::SavePrimarySlotIdInfo(int32_t slotId)
836 {
837 lastPrimarySlotId_ = slotId;
838 SetParameter(PRIMARY_SLOTID_KEY.c_str(), std::to_string(slotId).c_str());
839 if (simFileManager_[slotId] == nullptr) {
840 TELEPHONY_LOGE("simFileManager_ is null slotId is %{public}d", slotId);
841 return;
842 }
843 std::string iccId = Str16ToStr8(simFileManager_[slotId]->GetSimIccId());
844 TELEPHONY_LOGI("save data is empty %{public}d", iccId.empty());
845 if (!iccId.empty()) {
846 std::string encryptIccId = EncryptIccId(iccId);
847 SetParameter(MAIN_CARD_ICCID_KEY.c_str(), encryptIccId.c_str());
848 }
849 SendMainCardBroadCast(slotId);
850 SetDefaultCellularDataSlotId(slotId);
851 }
852
SaveDefaultCellularDataSlotIdInfo(int32_t slotId)853 void MultiSimController::SaveDefaultCellularDataSlotIdInfo(int32_t slotId)
854 {
855 SetParameter(MAIN_CELLULAR_DATA_SLOTID_KEY.c_str(), std::to_string(slotId).c_str());
856 SendDefaultCellularDataBroadCast(slotId);
857 }
858
InitMainCardSlotId()859 void MultiSimController::InitMainCardSlotId()
860 {
861 char lastPrimarySlotId[SYSTEM_PARAMETER_LENGTH] = { 0 };
862 GetParameter(PRIMARY_SLOTID_KEY.c_str(), PRIMARY_SLOTID.c_str(), lastPrimarySlotId, SYSTEM_PARAMETER_LENGTH);
863 lastPrimarySlotId_ = std::atoi(lastPrimarySlotId);
864
865 char lastCellularDataSlotId[SYSTEM_PARAMETER_LENGTH] = { 0 };
866 GetParameter(
867 MAIN_CELLULAR_DATA_SLOTID_KEY.c_str(), PRIMARY_SLOTID.c_str(), lastCellularDataSlotId, SYSTEM_PARAMETER_LENGTH);
868 lastCellularDataSlotId_ = std::atoi(lastCellularDataSlotId);
869 }
870
GetShowNumber(int32_t slotId,std::u16string & showNumber)871 int32_t MultiSimController::GetShowNumber(int32_t slotId, std::u16string &showNumber)
872 {
873 if (!IsValidData(slotId)) {
874 TELEPHONY_LOGE("InValidData");
875 return TELEPHONY_ERR_NO_SIM_CARD;
876 }
877 if (simFileManager_[slotId] == nullptr) {
878 TELEPHONY_LOGE("can not get simFileManager");
879 return TELEPHONY_ERR_LOCAL_PTR_NULL;
880 }
881 showNumber = simFileManager_[slotId]->GetSimTelephoneNumber();
882 if (!showNumber.empty()) {
883 return TELEPHONY_ERR_SUCCESS;
884 }
885 std::unique_lock<std::mutex> lock(mutex_);
886 if (static_cast<uint32_t>(slotId) >= localCacheInfo_.size()) {
887 TELEPHONY_LOGE("failed by nullptr");
888 return TELEPHONY_ERR_ARGUMENT_INVALID;
889 }
890 showNumber = Str8ToStr16(localCacheInfo_[slotId].phoneNumber);
891 if (!showNumber.empty()) {
892 return TELEPHONY_ERR_SUCCESS;
893 }
894 return GetSimTelephoneNumber(slotId, showNumber);
895 }
896
SetShowNumber(int32_t slotId,std::u16string number,bool force)897 int32_t MultiSimController::SetShowNumber(int32_t slotId, std::u16string number, bool force)
898 {
899 TELEPHONY_LOGI("MultiSimController::SetShowNumber slotId = %{public}d", slotId);
900 if (!force && !IsValidData(slotId)) {
901 TELEPHONY_LOGE("MultiSimController::SetShowNumber InValidData");
902 return TELEPHONY_ERR_NO_SIM_CARD;
903 }
904 if (simFileManager_[slotId] == nullptr) {
905 TELEPHONY_LOGE("can not get simFileManager");
906 return TELEPHONY_ERR_LOCAL_PTR_NULL;
907 }
908 std::u16string alphaTag = simFileManager_[slotId]->GetSimTeleNumberIdentifier();
909 if (!simFileManager_[slotId]->SetSimTelephoneNumber(alphaTag, number)) {
910 return TELEPHONY_ERR_FAIL;
911 }
912 return SetShowNumberToDB(slotId, number);
913 }
914
SetShowNumberToDB(int32_t slotId,std::u16string number)915 int32_t MultiSimController::SetShowNumberToDB(int32_t slotId, std::u16string number)
916 {
917 if (static_cast<uint32_t>(slotId) >= localCacheInfo_.size()) {
918 TELEPHONY_LOGE("failed by nullptr");
919 return false;
920 }
921 int curSimId;
922 if (GetTargetSimId(slotId, curSimId) != TELEPHONY_ERR_SUCCESS) {
923 TELEPHONY_LOGE("MultiSimController::SetShowNumber failed by out of range");
924 return TELEPHONY_ERR_ARGUMENT_INVALID;
925 }
926 if (simDbHelper_ == nullptr) {
927 TELEPHONY_LOGE("MultiSimController::SetShowNumber failed by nullptr");
928 return TELEPHONY_ERR_LOCAL_PTR_NULL;
929 }
930 DataShare::DataShareValuesBucket values;
931 DataShare::DataShareValueObject valueObj(Str16ToStr8(number));
932 values.Put(SimData::PHONE_NUMBER, valueObj);
933 int32_t result = simDbHelper_->UpdateDataBySimId(curSimId, values);
934 if (result == INVALID_VALUE) {
935 TELEPHONY_LOGE("MultiSimController::SetShowNumber set Data Base failed");
936 return TELEPHONY_ERR_DATABASE_WRITE_FAIL;
937 }
938 std::unique_lock<std::mutex> lock(mutex_);
939 if ((static_cast<uint32_t>(slotId) >= localCacheInfo_.size())) {
940 TELEPHONY_LOGE("localCacheInfo_ is empty");
941 return TELEPHONY_ERR_NO_SIM_CARD;
942 }
943 localCacheInfo_[slotId].phoneNumber = Str16ToStr8(number); // save to cache
944 return TELEPHONY_ERR_SUCCESS;
945 }
946
GetShowName(int32_t slotId,std::u16string & showName)947 int32_t MultiSimController::GetShowName(int32_t slotId, std::u16string &showName)
948 {
949 if (!IsValidData(slotId)) {
950 TELEPHONY_LOGE("InValidData");
951 return TELEPHONY_ERR_NO_SIM_CARD;
952 }
953 std::unique_lock<std::mutex> lock(mutex_);
954 if (static_cast<uint32_t>(slotId) >= localCacheInfo_.size()) {
955 TELEPHONY_LOGE("failed by nullptr");
956 return TELEPHONY_ERR_ARGUMENT_INVALID;
957 }
958 showName = Str8ToStr16(localCacheInfo_[slotId].showName);
959 lock.unlock();
960 TELEPHONY_LOGI("Get the SIM name set by the user");
961 return TELEPHONY_ERR_SUCCESS;
962 }
963
SetShowName(int32_t slotId,std::u16string name,bool force)964 int32_t MultiSimController::SetShowName(int32_t slotId, std::u16string name, bool force)
965 {
966 if (!force && !IsValidData(slotId)) {
967 TELEPHONY_LOGE("MultiSimController::SetShowNumber InValidData");
968 return TELEPHONY_ERR_NO_SIM_CARD;
969 }
970 int curSimId;
971 if (GetTargetSimId(slotId, curSimId) != TELEPHONY_ERR_SUCCESS) {
972 TELEPHONY_LOGE("MultiSimController::SetShowName failed by out of range");
973 return TELEPHONY_ERR_ARGUMENT_INVALID;
974 }
975 if (simDbHelper_ == nullptr) {
976 TELEPHONY_LOGE("MultiSimController::SetShowName get Data Base failed");
977 return TELEPHONY_ERR_LOCAL_PTR_NULL;
978 }
979 DataShare::DataShareValuesBucket values;
980 DataShare::DataShareValueObject valueObj(Str16ToStr8(name));
981 values.Put(SimData::SHOW_NAME, valueObj);
982 int32_t result = simDbHelper_->UpdateDataBySimId(curSimId, values);
983 if (result == INVALID_VALUE) {
984 TELEPHONY_LOGE("MultiSimController::SetShowName set Data Base failed");
985 return TELEPHONY_ERR_DATABASE_WRITE_FAIL;
986 }
987 std::unique_lock<std::mutex> lock(mutex_);
988 if ((static_cast<uint32_t>(slotId) >= localCacheInfo_.size())) {
989 TELEPHONY_LOGE("failed by out of range");
990 return TELEPHONY_ERR_ARGUMENT_INVALID;
991 }
992 localCacheInfo_[slotId].showName = Str16ToStr8(name); // save to cache
993 return TELEPHONY_ERR_SUCCESS;
994 }
995
GetSimTelephoneNumber(int32_t slotId,std::u16string & telephoneNumber)996 int32_t MultiSimController::GetSimTelephoneNumber(int32_t slotId, std::u16string &telephoneNumber)
997 {
998 if (!IsValidData(slotId)) {
999 TELEPHONY_LOGE("InValidData");
1000 return TELEPHONY_ERR_NO_SIM_CARD;
1001 }
1002 std::shared_ptr<ImsCoreServiceClient> imsCoreServiceClient = DelayedSingleton<ImsCoreServiceClient>::GetInstance();
1003 if (imsCoreServiceClient == nullptr) {
1004 TELEPHONY_LOGE("can not get imsCoreServiceClient");
1005 return TELEPHONY_ERR_LOCAL_PTR_NULL;
1006 }
1007 std::string result = "";
1008 imsCoreServiceClient->GetPhoneNumberFromIMPU(slotId, result);
1009 telephoneNumber = Str8ToStr16(result);
1010 TELEPHONY_LOGI("impu result is empty:%{public}s, slotId:%{public}d", (telephoneNumber.empty() ? "true" : "false"),
1011 slotId);
1012 return TELEPHONY_ERR_SUCCESS;
1013 }
1014
GetTargetIccId(int32_t slotId,std::string & iccId)1015 int32_t MultiSimController::GetTargetIccId(int32_t slotId, std::string &iccId)
1016 {
1017 std::unique_lock<std::mutex> lock(mutex_);
1018 iccId = "";
1019 if (static_cast<uint32_t>(slotId) >= localCacheInfo_.size()) {
1020 TELEPHONY_LOGE("failed by out of range");
1021 return TELEPHONY_ERROR;
1022 }
1023 iccId = localCacheInfo_[slotId].iccId;
1024 return TELEPHONY_ERR_SUCCESS;
1025 }
1026
AnnounceDefaultVoiceSimIdChanged(int32_t simId)1027 bool MultiSimController::AnnounceDefaultVoiceSimIdChanged(int32_t simId)
1028 {
1029 AAFwk::Want want;
1030 want.SetParam(PARAM_SIMID, simId);
1031 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_SIM_CARD_DEFAULT_VOICE_SUBSCRIPTION_CHANGED);
1032 int32_t eventCode = EVENT_CODE;
1033 std::string eventData(DEFAULT_VOICE_SIMID_CHANGED);
1034 return PublishSimFileEvent(want, eventCode, eventData);
1035 }
1036
AnnounceDefaultSmsSimIdChanged(int32_t simId)1037 bool MultiSimController::AnnounceDefaultSmsSimIdChanged(int32_t simId)
1038 {
1039 AAFwk::Want want;
1040 want.SetParam(PARAM_SIMID, simId);
1041 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_SIM_CARD_DEFAULT_SMS_SUBSCRIPTION_CHANGED);
1042 int32_t eventCode = EVENT_CODE;
1043 std::string eventData(DEFAULT_SMS_SIMID_CHANGED);
1044 return PublishSimFileEvent(want, eventCode, eventData);
1045 }
1046
AnnounceDefaultCellularDataSimIdChanged(int32_t simId)1047 bool MultiSimController::AnnounceDefaultCellularDataSimIdChanged(int32_t simId)
1048 {
1049 AAFwk::Want want;
1050 want.SetParam(PARAM_SIMID, simId);
1051 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_SIM_CARD_DEFAULT_DATA_SUBSCRIPTION_CHANGED);
1052 int32_t eventCode = EVENT_CODE;
1053 std::string eventData(DEFAULT_CELLULAR_DATA_SIMID_CHANGED);
1054 return PublishSimFileEvent(want, eventCode, eventData);
1055 }
1056
AnnouncePrimarySimIdChanged(int32_t simId)1057 bool MultiSimController::AnnouncePrimarySimIdChanged(int32_t simId)
1058 {
1059 AAFwk::Want want;
1060 want.SetParam(PARAM_SIMID, simId);
1061 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_SIM_CARD_DEFAULT_MAIN_SUBSCRIPTION_CHANGED);
1062 int32_t eventCode = EVENT_CODE;
1063 std::string eventData(DEFAULT_MAIN_SIMID_CHANGED);
1064 return PublishSimFileEvent(want, eventCode, eventData);
1065 }
1066
PublishSimFileEvent(const AAFwk::Want & want,int eventCode,const std::string & eventData)1067 bool MultiSimController::PublishSimFileEvent(const AAFwk::Want &want, int eventCode, const std::string &eventData)
1068 {
1069 EventFwk::CommonEventData data;
1070 data.SetWant(want);
1071 data.SetCode(eventCode);
1072 data.SetData(eventData);
1073 EventFwk::CommonEventPublishInfo publishInfo;
1074 publishInfo.SetOrdered(false);
1075 bool publishResult = EventFwk::CommonEventManager::PublishCommonEvent(data, publishInfo, nullptr);
1076 TELEPHONY_LOGD("MultiSimController::PublishSimFileEvent end###publishResult = %{public}d", publishResult);
1077 return publishResult;
1078 }
1079
SaveImsSwitch(int32_t slotId,int32_t imsSwitchValue)1080 int32_t MultiSimController::SaveImsSwitch(int32_t slotId, int32_t imsSwitchValue)
1081 {
1082 std::string curIccid = "";
1083 if (GetTargetIccId(slotId, curIccid) != TELEPHONY_SUCCESS || simDbHelper_ == nullptr) {
1084 TELEPHONY_LOGE("failed by out of range or simDbHelper is nullptr");
1085 imsSwitchValue = IMS_SWITCH_VALUE_UNKNOWN;
1086 return TELEPHONY_ERROR;
1087 }
1088 DataShare::DataShareValuesBucket values;
1089 DataShare::DataShareValueObject valueObj(imsSwitchValue);
1090 values.Put(SimData::IMS_SWITCH, valueObj);
1091 return simDbHelper_->UpdateDataByIccId(curIccid, values);
1092 }
1093
QueryImsSwitch(int32_t slotId,int32_t & imsSwitchValue)1094 int32_t MultiSimController::QueryImsSwitch(int32_t slotId, int32_t &imsSwitchValue)
1095 {
1096 std::string curIccid = "";
1097 if (GetTargetIccId(slotId, curIccid) != TELEPHONY_SUCCESS || simDbHelper_ == nullptr) {
1098 TELEPHONY_LOGE("failed by out of range or simDbHelper is nullptr");
1099 imsSwitchValue = IMS_SWITCH_VALUE_UNKNOWN;
1100 return TELEPHONY_ERROR;
1101 }
1102 SimRdbInfo simRdbInfo;
1103 simDbHelper_->QueryDataByIccId(curIccid, simRdbInfo);
1104 imsSwitchValue = simRdbInfo.imsSwitch;
1105 return TELEPHONY_SUCCESS;
1106 }
1107
GetActiveSimAccountInfoList(bool denied,std::vector<IccAccountInfo> & iccAccountInfoList)1108 int32_t MultiSimController::GetActiveSimAccountInfoList(bool denied, std::vector<IccAccountInfo> &iccAccountInfoList)
1109 {
1110 if (!RefreshActiveIccAccountInfoList()) {
1111 TELEPHONY_LOGE("refresh failed");
1112 return TELEPHONY_ERR_NO_SIM_CARD;
1113 }
1114 iccAccountInfoList.clear();
1115 std::unique_lock<std::mutex> lock(mutex_);
1116 std::vector<IccAccountInfo>::iterator it = iccAccountInfoList_.begin();
1117 while (it != iccAccountInfoList_.end()) {
1118 TELEPHONY_LOGI("slotIndex=%{public}d", it->slotIndex);
1119 if (denied) {
1120 it->iccId = u"";
1121 it->showNumber = u"";
1122 }
1123 iccAccountInfoList.emplace_back(*it);
1124 ++it;
1125 }
1126 return iccAccountInfoList.size() > 0 ? TELEPHONY_ERR_SUCCESS : TELEPHONY_ERR_NO_SIM_CARD;
1127 }
1128
GetRadioProtocolTech(int32_t slotId)1129 int32_t MultiSimController::GetRadioProtocolTech(int32_t slotId)
1130 {
1131 if (radioProtocolController_ == nullptr) {
1132 TELEPHONY_LOGE("radioProtocolController_ is nullptr");
1133 return static_cast<int32_t>(RadioProtocolTech::RADIO_PROTOCOL_TECH_UNKNOWN);
1134 }
1135 return radioProtocolController_->GetRadioProtocolTech(slotId);
1136 }
1137
GetRadioProtocol(int32_t slotId)1138 void MultiSimController::GetRadioProtocol(int32_t slotId)
1139 {
1140 if (radioProtocolController_ == nullptr) {
1141 TELEPHONY_LOGE("radioProtocolController_ is nullptr");
1142 return;
1143 }
1144 radioProtocolController_->GetRadioProtocol(slotId);
1145 }
1146 } // namespace Telephony
1147 } // namespace OHOS
1148