1/* 2 * Copyright (C) 2021 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 "call_broadcast_subscriber.h" 17 18#include <string_ex.h> 19 20#include "audio_device_manager.h" 21#include "call_manager_errors.h" 22#include "telephony_log_wrapper.h" 23#include "call_control_manager.h" 24#include "satellite_call_control.h" 25#include "securec.h" 26#include "call_superprivacy_control_manager.h" 27#include "call_connect_ability.h" 28#include "call_ability_connect_callback.h" 29 30 31namespace OHOS { 32namespace Telephony { 33using namespace OHOS::EventFwk; 34CallBroadcastSubscriber::CallBroadcastSubscriber(const OHOS::EventFwk::CommonEventSubscribeInfo &subscriberInfo) 35 : CommonEventSubscriber(subscriberInfo) 36{ 37 memberFuncMap_[UNKNOWN_BROADCAST_EVENT] = 38 [this](const EventFwk::CommonEventData &data) { UnknownBroadcast(data); }; 39 memberFuncMap_[SIM_STATE_BROADCAST_EVENT] = 40 [this](const EventFwk::CommonEventData &data) { SimStateBroadcast(data); }; 41 memberFuncMap_[CONNECT_CALLUI_SERVICE] = 42 [this](const EventFwk::CommonEventData &data) { ConnectCallUiServiceBroadcast(data); }; 43 memberFuncMap_[HIGH_TEMP_LEVEL_CHANGED] = 44 [this](const EventFwk::CommonEventData &data) { HighTempLevelChangedBroadcast(data); }; 45 memberFuncMap_[SUPER_PRIVACY_MODE] = 46 [this](const EventFwk::CommonEventData &data) { ConnectCallUiSuperPrivacyModeBroadcast(data); }; 47 memberFuncMap_[BLUETOOTH_REMOTEDEVICE_NAME_UPDATE] = 48 [this](const EventFwk::CommonEventData &data) { UpdateBluetoothDeviceName(data); }; 49 memberFuncMap_[USER_SWITCHED] = 50 [this](const EventFwk::CommonEventData &data) { ConnectCallUiUserSwitchedBroadcast(data); }; 51} 52 53void CallBroadcastSubscriber::OnReceiveEvent(const EventFwk::CommonEventData &data) 54{ 55 uint32_t code = UNKNOWN_BROADCAST_EVENT; 56 OHOS::EventFwk::Want want = data.GetWant(); 57 std::string action = data.GetWant().GetAction(); 58 TELEPHONY_LOGI("receive one broadcast:%{public}s", action.c_str()); 59 if (action == EventFwk::CommonEventSupport::COMMON_EVENT_SIM_STATE_CHANGED) { 60 code = SIM_STATE_BROADCAST_EVENT; 61 } else if (action == "event.custom.contacts.PAGE_STATE_CHANGE") { 62 code = CONNECT_CALLUI_SERVICE; 63 } else if (action == "usual.event.thermal.satcomm.HIGH_TEMP_LEVEL") { 64 code = HIGH_TEMP_LEVEL_CHANGED; 65 } else if (action == "usual.event.SUPER_PRIVACY_MODE") { 66 code = SUPER_PRIVACY_MODE; 67 } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_NAME_UPDATE) { 68 code = BLUETOOTH_REMOTEDEVICE_NAME_UPDATE; 69 } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_USER_SWITCHED) { 70 code = USER_SWITCHED; 71 } else { 72 code = UNKNOWN_BROADCAST_EVENT; 73 } 74 auto itFunc = memberFuncMap_.find(code); 75 if (itFunc != memberFuncMap_.end()) { 76 auto memberFunc = itFunc->second; 77 if (memberFunc != nullptr) { 78 return memberFunc(data); 79 } 80 } 81} 82 83void CallBroadcastSubscriber::UnknownBroadcast(const EventFwk::CommonEventData &data) 84{ 85 TELEPHONY_LOGI("you receive one unknown broadcast!"); 86} 87 88void CallBroadcastSubscriber::SimStateBroadcast(const EventFwk::CommonEventData &data) 89{ 90 TELEPHONY_LOGI("sim state broadcast code:%{public}d", data.GetCode()); 91} 92 93void CallBroadcastSubscriber::ConnectCallUiServiceBroadcast(const EventFwk::CommonEventData &data) 94{ 95 bool isConnectService = data.GetWant().GetBoolParam("isShouldConnect", false); 96 TELEPHONY_LOGI("isConnectService:%{public}d", isConnectService); 97 DelayedSingleton<CallControlManager>::GetInstance()->ConnectCallUiService(isConnectService); 98} 99 100void CallBroadcastSubscriber::HighTempLevelChangedBroadcast(const EventFwk::CommonEventData &data) 101{ 102 int32_t satcommHighTempLevel = data.GetWant().GetIntParam("satcomm_high_temp_level", -1); 103 TELEPHONY_LOGI("satcommHighTempLevel:%{public}d", satcommHighTempLevel); 104 DelayedSingleton<SatelliteCallControl>::GetInstance()->SetSatcommTempLevel(satcommHighTempLevel); 105} 106 107void CallBroadcastSubscriber::ConnectCallUiSuperPrivacyModeBroadcast(const EventFwk::CommonEventData &data) 108{ 109 bool isInCall = data.GetWant().GetBoolParam("isInCall", false); 110 bool isHangup = data.GetWant().GetBoolParam("isHangup", false); 111 if (isInCall && isHangup) { 112 DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->CloseAllCall(); 113 return; 114 } 115 int32_t videoState = data.GetWant().GetIntParam("videoState", -1); 116 bool isAnswer = data.GetWant().GetBoolParam("isAnswer", false); 117 DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->SetOldSuperPrivacyMode(); 118 DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->SetIsChangeSuperPrivacyMode(true); 119 if (isInCall) { 120 DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->CloseSuperPrivacyMode(); 121 return; 122 } 123 TELEPHONY_LOGI("CallUiSuperPrivacyModeBroadcast isAnswer:%{public}d", isAnswer); 124 if (isAnswer) { 125 int32_t callId = data.GetWant().GetIntParam("callId", -1); 126 TELEPHONY_LOGI("CallUiSuperPrivacyModeBroadcast_Answer callId:%{public}d", callId); 127 DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()-> 128 CloseAnswerSuperPrivacyMode(callId, videoState); 129 } else { 130 std::string phoneNumber = data.GetWant().GetStringParam("phoneNumber"); 131 std::u16string phNumber = Str8ToStr16(phoneNumber); 132 int32_t accountId = data.GetWant().GetIntParam("accountId", -1); 133 TELEPHONY_LOGI("CallUiSuperPrivacyModeBroadcast_Answer accountId:%{public}d", accountId); 134 int32_t dialScene = data.GetWant().GetIntParam("dialScene", -1); 135 int32_t dialType = data.GetWant().GetIntParam("dialType", -1); 136 int32_t callType = data.GetWant().GetIntParam("callType", -1); 137 DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->CloseCallSuperPrivacyMode( 138 phNumber, accountId, videoState, dialScene, dialType, callType); 139 } 140} 141 142void CallBroadcastSubscriber::UpdateBluetoothDeviceName(const EventFwk::CommonEventData &data) 143{ 144 std::string macAddress = data.GetWant().GetStringParam("deviceAddr"); 145 std::string deviceName = data.GetWant().GetStringParam("remoteName"); 146 DelayedSingleton<AudioDeviceManager>::GetInstance()->UpdateBluetoothDeviceName(macAddress, deviceName); 147} 148 149void CallBroadcastSubscriber::ConnectCallUiUserSwitchedBroadcast(const EventFwk::CommonEventData &data) 150{ 151 if (!DelayedSingleton<CallConnectAbility>::GetInstance()->GetConnectFlag()) { 152 TELEPHONY_LOGE("is not connected"); 153 return; 154 } 155 TELEPHONY_LOGI("User switched, need reconnect ability"); 156 DelayedSingleton<CallConnectAbility>::GetInstance()->DisconnectAbility(); 157 sptr<CallAbilityConnectCallback> connectCallback_ = new CallAbilityConnectCallback(); 158 connectCallback_->ReConnectAbility(); 159} 160} // namespace Telephony 161} // namespace OHOS 162