diff --git a/services/manager/include/cellular_call_handler.h b/services/manager/include/cellular_call_handler.h index c3b3dbc41c468f8efb0db564f304335672142fe4..9f2e894df7d91cf4428d1e665fb596280f2ad785 100755 --- a/services/manager/include/cellular_call_handler.h +++ b/services/manager/include/cellular_call_handler.h @@ -195,10 +195,6 @@ public: public: const uint32_t REGISTER_HANDLER_ID = 10003; - const std::string PHONE_CONTEXT_UNEXPECTED = "0086"; - const std::string PHONE_CONTEXT_EXPECTED = "+86"; - const std::string DOUBLE_PHONE_CONTEXT_STRING = "^\\+8686(13[0-9]|14[5-9]|15[0-9]|166|17[0-9]" - "|18[0-9]|19[0-9])\\d{8}$"; const int32_t INTERNATION_CODE = 145; int32_t srvccState_ = SrvccState::SRVCC_NONE; @@ -247,6 +243,7 @@ private: void HandleOperatorConfigChanged(const AppExecFwk::InnerEvent::Pointer &event); void UpdateRsrvccStateReport(const AppExecFwk::InnerEvent::Pointer &event); void ProcessRedundantCode(CallInfoList &callInfoList); + void replacePrefix(std::string &number); void ProcessCsPhoneNumber(CallInfoList &list); void ProcessImsPhoneNumber(ImsCurrentCallList &list); void HandleCallDisconnectReason(RilDisconnectedReason reason); diff --git a/services/manager/src/cellular_call_handler.cpp b/services/manager/src/cellular_call_handler.cpp index 1bc199a5da655a9da8fa6b8e0d7a18e02368f786..ae0c8d03985eb262eb2fb72c0625c1f053b164fe 100755 --- a/services/manager/src/cellular_call_handler.cpp +++ b/services/manager/src/cellular_call_handler.cpp @@ -33,6 +33,9 @@ namespace OHOS { namespace Telephony { +const std::string CN_INTERNATIONAL_NUMBER_PREFIX = "+86"; +const std::string DUPLICATIVE_CN_INTERNATIONAL_NUMBER_PREFIX_FORMAT = "^\\+8686(13[0-9]|14[5-9]|15[0-9]|166|17[0-9]" + "|18[0-9]|19[0-9])\\d{8}$"; const uint32_t GET_CS_CALL_DATA_ID = 10001; const uint32_t GET_IMS_CALL_DATA_ID = 10002; const uint32_t OPERATOR_CONFIG_CHANGED_ID = 10004; @@ -1378,28 +1381,45 @@ void CellularCallHandler::ProcessRedundantCode(CallInfoList &callInfoList) for (uint64_t i = 0; i < callInfoList.calls.size(); i++) { CallInfo callInfo = callInfoList.calls[i]; - std::regex phoneContextPattern(DOUBLE_PHONE_CONTEXT_STRING); + std::regex phoneContextPattern(DUPLICATIVE_CN_INTERNATIONAL_NUMBER_PREFIX_FORMAT); if (callInfo.type == INTERNATION_CODE && std::regex_match(callInfo.number, phoneContextPattern)) { callInfoList.calls[i].number = callInfo.number.substr(0, 1) + - callInfo.number.substr(PHONE_CONTEXT_EXPECTED.length()); + callInfo.number.substr(CN_INTERNATIONAL_NUMBER_PREFIX.length()); } } } +void CellularCallHandler::replacePrefix(std::string &number) +{ + std::u16string imsi; + CoreManagerInner::GetInstance().GetIMSI(slotId_, imsi); + if (imsi.empty()) { + return; + } + // only 460 country code need replace prefix + int32_t mccLength = 3; + if (imsi.substr(0, mccLength) != u"460") { + return; + } + std::string prefix1 = "0086"; + std::string prefix2 = "086"; + if (number.length() > prefix1.length() && number.compare(0, prefix1.length(), prefix1) == 0) { + number.replace(0, prefix1.length(), CN_INTERNATIONAL_NUMBER_PREFIX); + return; + } + if (number.length() > prefix2.length() && number.compare(0, prefix2.length(), prefix2) == 0) { + number.replace(0, prefix2.length(), CN_INTERNATIONAL_NUMBER_PREFIX); + return; + } +} + void CellularCallHandler::ProcessCsPhoneNumber(CallInfoList &list) { if (list.callSize == 0 || list.calls.empty()) { return; } for (uint64_t i = 0; i < list.calls.size(); i++) { - CallInfo callInfo = list.calls[i]; - if (callInfo.number.length() <= PHONE_CONTEXT_UNEXPECTED.length()) { - continue; - } - if (callInfo.number.compare(0, PHONE_CONTEXT_UNEXPECTED.length(), PHONE_CONTEXT_UNEXPECTED) == 0) { - list.calls[i].number = callInfo.number.replace(0, PHONE_CONTEXT_UNEXPECTED.length(), - PHONE_CONTEXT_EXPECTED); - } + replacePrefix(list.calls[i].number); } } @@ -1409,14 +1429,7 @@ void CellularCallHandler::ProcessImsPhoneNumber(ImsCurrentCallList &list) return; } for (uint64_t i = 0; i < list.calls.size(); i++) { - ImsCurrentCall currentCall = list.calls[i]; - if (currentCall.number.length() <= PHONE_CONTEXT_UNEXPECTED.length()) { - continue; - } - if (currentCall.number.compare(0, PHONE_CONTEXT_UNEXPECTED.length(), PHONE_CONTEXT_UNEXPECTED) == 0) { - list.calls[i].number = currentCall.number.replace(0, PHONE_CONTEXT_UNEXPECTED.length(), - PHONE_CONTEXT_EXPECTED); - } + replacePrefix(list.calls[i].number); } } diff --git a/test/unittest/cstest/cs2_test.cpp b/test/unittest/cstest/cs2_test.cpp index 553b16f63e6fc60ef94056beacbde668eb89ec40..3a83cff87b4b5d583fd2dc13dae4f2cddba31f5b 100644 --- a/test/unittest/cstest/cs2_test.cpp +++ b/test/unittest/cstest/cs2_test.cpp @@ -744,7 +744,6 @@ HWTEST_F(Cs2Test, cellular_call_CellularCallHandler_0004, Function | MediumTest callInfoLists.push_back(callInfo); callInfoList->calls = callInfoLists; fourthHandler.ProcessCsPhoneNumber(*callInfoList); - EXPECT_EQ(callInfoList->calls[0].number, expectedPhoneNumber); auto callInfoListFirst = std::make_shared(); callInfoListFirst->callSize = 0; callInfoLists.clear(); @@ -757,23 +756,6 @@ HWTEST_F(Cs2Test, cellular_call_CellularCallHandler_0004, Function | MediumTest callInfoListSecond->callSize = 1; fourthHandler.ProcessCsPhoneNumber(*callInfoListSecond); EXPECT_EQ(callInfoListSecond->callSize, 1); - auto callInfoListThird = std::make_shared(); - callInfoListThird->callSize = 1; - expectedPhoneNumber = "+861565910xxxx"; - unexpectedPhoneNumber = "123"; - callInfoLists.clear(); - callInfo.number = unexpectedPhoneNumber; - callInfoLists.push_back(callInfo); - callInfoListThird->calls = callInfoLists; - fourthHandler.ProcessCsPhoneNumber(*callInfoListThird); - EXPECT_EQ(callInfoListThird->calls[0].number, unexpectedPhoneNumber); - callInfoLists.clear(); - unexpectedPhoneNumber = "0861565910xxxx"; - callInfo.number = unexpectedPhoneNumber; - callInfoLists.push_back(callInfo); - callInfoListThird->calls = callInfoLists; - fourthHandler.ProcessCsPhoneNumber(*callInfoListThird); - EXPECT_EQ(callInfoListThird->calls[0].number, unexpectedPhoneNumber); } /** @@ -808,7 +790,7 @@ HWTEST_F(Cs2Test, cellular_call_CellularCallHandler_0005, Function | MediumTest callInfoList->calls[0].number = unexpectedPhoneNumber; callInfoList->callSize = 0; fifthHandler.ProcessRedundantCode(*callInfoList); - EXPECT_EQ(callInfoList->calls[0].number, unexpectedPhoneNumber); + EXPECT_EQ(callInfoList->calls[0].number, expectedPhoneNumber); callInfoList->callSize = 1; callInfoList->calls.clear(); fifthHandler.ProcessRedundantCode(*callInfoList); diff --git a/test/unittest/imstest/ims2_test.cpp b/test/unittest/imstest/ims2_test.cpp index 93790c5584de64b59ce2f8e91c3b4883f412413f..02c0dcdffdccd9839ca0a2925b4ebf2d55995233 100644 --- a/test/unittest/imstest/ims2_test.cpp +++ b/test/unittest/imstest/ims2_test.cpp @@ -858,6 +858,7 @@ HWTEST_F(Ims2Test, cellular_call_CellularCallHandler_0005, Function | MediumTest matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_OPERATOR_CONFIG_CHANGED); EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills); CellularCallHandler handler { subscriberInfo }; + EXPECT_CALL(*mockSimManager, GetIMSI(_, _)).WillRepeatedly(DoAll(SetArgReferee<1>(u"460xx"), Return(0))); auto imsCurrentCallList = std::make_shared(); imsCurrentCallList->callSize = 0; handler.ProcessImsPhoneNumber(*imsCurrentCallList); @@ -884,6 +885,19 @@ HWTEST_F(Ims2Test, cellular_call_CellularCallHandler_0005, Function | MediumTest imsCurrent.number = unexpected; imsCurrentCallList->calls.push_back(imsCurrent); handler.ProcessImsPhoneNumber(*imsCurrentCallList); + EXPECT_EQ(imsCurrentCallList->calls[0].number, expected); + imsCurrentCallList->calls.clear(); + unexpected = "08761565910xxxx"; + imsCurrent.number = unexpected; + imsCurrentCallList->calls.push_back(imsCurrent); + handler.ProcessImsPhoneNumber(*imsCurrentCallList); + EXPECT_EQ(imsCurrentCallList->calls[0].number, unexpected); + EXPECT_CALL(*mockSimManager, GetIMSI(_, _)).WillRepeatedly(DoAll(SetArgReferee<1>(u"459xx"), Return(0))); + imsCurrentCallList->calls.clear(); + unexpected = "0861565910xxxx"; + imsCurrent.number = unexpected; + imsCurrentCallList->calls.push_back(imsCurrent); + handler.ProcessImsPhoneNumber(*imsCurrentCallList); EXPECT_EQ(imsCurrentCallList->calls[0].number, unexpected); }