• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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