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 #include "number_identity_service.h"
30 #include "os_account_manager.h"
31 #include "call_object_manager.h"
32 #include "bluetooth_call_connection.h"
33
34 namespace OHOS {
35 namespace Telephony {
36 using namespace OHOS::EventFwk;
37 static constexpr int16_t INCOMING_CALL_MISSED_CODE = 0;
38 static constexpr int16_t PUBLISH_MISSCALL_EVENT_DELAY_TIME = 2000;
CallBroadcastSubscriber(const OHOS::EventFwk::CommonEventSubscribeInfo & subscriberInfo)39 CallBroadcastSubscriber::CallBroadcastSubscriber(const OHOS::EventFwk::CommonEventSubscribeInfo &subscriberInfo)
40 : CommonEventSubscriber(subscriberInfo)
41 {
42 memberFuncMap_[UNKNOWN_BROADCAST_EVENT] =
43 [this](const EventFwk::CommonEventData &data) { UnknownBroadcast(data); };
44 memberFuncMap_[SIM_STATE_BROADCAST_EVENT] =
45 [this](const EventFwk::CommonEventData &data) { SimStateBroadcast(data); };
46 memberFuncMap_[CONNECT_CALLUI_SERVICE] =
47 [this](const EventFwk::CommonEventData &data) { ConnectCallUiServiceBroadcast(data); };
48 memberFuncMap_[HIGH_TEMP_LEVEL_CHANGED] =
49 [this](const EventFwk::CommonEventData &data) { HighTempLevelChangedBroadcast(data); };
50 memberFuncMap_[SUPER_PRIVACY_MODE] =
51 [this](const EventFwk::CommonEventData &data) { ConnectCallUiSuperPrivacyModeBroadcast(data); };
52 memberFuncMap_[BLUETOOTH_REMOTEDEVICE_NAME_UPDATE] =
53 [this](const EventFwk::CommonEventData &data) { UpdateBluetoothDeviceName(data); };
54 memberFuncMap_[USER_SWITCHED] =
55 [this](const EventFwk::CommonEventData &data) { ConnectCallUiUserSwitchedBroadcast(data); };
56 memberFuncMap_[SHUTDOWN] =
57 [this](const EventFwk::CommonEventData &data) { ShutdownBroadcast(data); };
58 memberFuncMap_[HSDR_EVENT] =
59 [this](const EventFwk::CommonEventData &data) { HsdrEventBroadcast(data); };
60 memberFuncMap_[HFP_EVENT] =
61 [this](const EventFwk::CommonEventData &data) { HfpConnectBroadcast(data); };
62 memberFuncMap_[SCREEN_UNLOCKED] =
63 [this](const EventFwk::CommonEventData &data) { ScreenUnlockedBroadcast(data); };
64 }
65
OnReceiveEvent(const EventFwk::CommonEventData & data)66 void CallBroadcastSubscriber::OnReceiveEvent(const EventFwk::CommonEventData &data)
67 {
68 uint32_t code = UNKNOWN_BROADCAST_EVENT;
69 OHOS::EventFwk::Want want = data.GetWant();
70 std::string action = data.GetWant().GetAction();
71 TELEPHONY_LOGI("receive one broadcast:%{public}s", action.c_str());
72 if (action == EventFwk::CommonEventSupport::COMMON_EVENT_SIM_STATE_CHANGED) {
73 code = SIM_STATE_BROADCAST_EVENT;
74 } else if (action == "event.custom.contacts.PAGE_STATE_CHANGE") {
75 code = CONNECT_CALLUI_SERVICE;
76 } else if (action == "usual.event.thermal.satcomm.HIGH_TEMP_LEVEL") {
77 code = HIGH_TEMP_LEVEL_CHANGED;
78 } else if (action == "usual.event.SUPER_PRIVACY_MODE") {
79 code = SUPER_PRIVACY_MODE;
80 } else if (action == "usual.event.HSDR_EVENT") {
81 code = HSDR_EVENT;
82 } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_NAME_UPDATE) {
83 code = BLUETOOTH_REMOTEDEVICE_NAME_UPDATE;
84 } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_USER_SWITCHED) {
85 code = USER_SWITCHED;
86 } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_SHUTDOWN) {
87 code = SHUTDOWN;
88 } else if (action == EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_UNLOCKED) {
89 code = SCREEN_UNLOCKED;
90 } else if (action == "usual.event.bluetooth.CONNECT_HFP_HF") {
91 code = HFP_EVENT;
92 } else {
93 code = UNKNOWN_BROADCAST_EVENT;
94 }
95 auto itFunc = memberFuncMap_.find(code);
96 if (itFunc != memberFuncMap_.end()) {
97 auto memberFunc = itFunc->second;
98 if (memberFunc != nullptr) {
99 return memberFunc(data);
100 }
101 }
102 }
103
UnknownBroadcast(const EventFwk::CommonEventData & data)104 void CallBroadcastSubscriber::UnknownBroadcast(const EventFwk::CommonEventData &data)
105 {
106 TELEPHONY_LOGI("you receive one unknown broadcast!");
107 }
108
SimStateBroadcast(const EventFwk::CommonEventData & data)109 void CallBroadcastSubscriber::SimStateBroadcast(const EventFwk::CommonEventData &data)
110 {
111 TELEPHONY_LOGI("sim state broadcast code:%{public}d", data.GetCode());
112 }
113
ConnectCallUiServiceBroadcast(const EventFwk::CommonEventData & data)114 void CallBroadcastSubscriber::ConnectCallUiServiceBroadcast(const EventFwk::CommonEventData &data)
115 {
116 bool isConnectService = data.GetWant().GetBoolParam("isShouldConnect", false);
117 TELEPHONY_LOGI("isConnectService:%{public}d", isConnectService);
118 DelayedSingleton<CallControlManager>::GetInstance()->ConnectCallUiService(isConnectService);
119 }
120
HighTempLevelChangedBroadcast(const EventFwk::CommonEventData & data)121 void CallBroadcastSubscriber::HighTempLevelChangedBroadcast(const EventFwk::CommonEventData &data)
122 {
123 int32_t satcommHighTempLevel = data.GetWant().GetIntParam("satcomm_high_temp_level", -1);
124 TELEPHONY_LOGI("satcommHighTempLevel:%{public}d", satcommHighTempLevel);
125 DelayedSingleton<SatelliteCallControl>::GetInstance()->SetSatcommTempLevel(satcommHighTempLevel);
126 }
127
ConnectCallUiSuperPrivacyModeBroadcast(const EventFwk::CommonEventData & data)128 void CallBroadcastSubscriber::ConnectCallUiSuperPrivacyModeBroadcast(const EventFwk::CommonEventData &data)
129 {
130 bool isInCall = data.GetWant().GetBoolParam("isInCall", false);
131 bool isHangup = data.GetWant().GetBoolParam("isHangup", false);
132 if (isInCall && isHangup) {
133 DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->CloseAllCall();
134 return;
135 }
136 int32_t videoState = data.GetWant().GetIntParam("videoState", -1);
137 bool isAnswer = data.GetWant().GetBoolParam("isAnswer", false);
138 DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->SetOldSuperPrivacyMode();
139 DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->SetIsChangeSuperPrivacyMode(true);
140 if (isInCall) {
141 DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->CloseSuperPrivacyMode();
142 return;
143 }
144 TELEPHONY_LOGI("CallUiSuperPrivacyModeBroadcast isAnswer:%{public}d", isAnswer);
145 if (isAnswer) {
146 int32_t callId = data.GetWant().GetIntParam("callId", -1);
147 TELEPHONY_LOGI("CallUiSuperPrivacyModeBroadcast_Answer callId:%{public}d", callId);
148 DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->
149 CloseAnswerSuperPrivacyMode(callId, videoState);
150 } else {
151 std::string phoneNumber = data.GetWant().GetStringParam("phoneNumber");
152 std::u16string phNumber = Str8ToStr16(phoneNumber);
153 int32_t accountId = data.GetWant().GetIntParam("accountId", -1);
154 TELEPHONY_LOGI("CallUiSuperPrivacyModeBroadcast_Answer accountId:%{public}d", accountId);
155 int32_t dialScene = data.GetWant().GetIntParam("dialScene", -1);
156 int32_t dialType = data.GetWant().GetIntParam("dialType", -1);
157 int32_t callType = data.GetWant().GetIntParam("callType", -1);
158 DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->CloseCallSuperPrivacyMode(
159 phNumber, accountId, videoState, dialScene, dialType, callType);
160 }
161 }
162
UpdateBluetoothDeviceName(const EventFwk::CommonEventData & data)163 void CallBroadcastSubscriber::UpdateBluetoothDeviceName(const EventFwk::CommonEventData &data)
164 {
165 std::string macAddress = data.GetWant().GetStringParam("deviceAddr");
166 std::string deviceName = data.GetWant().GetStringParam("remoteName");
167 DelayedSingleton<AudioDeviceManager>::GetInstance()->UpdateBluetoothDeviceName(macAddress, deviceName);
168 }
169
ConnectCallUiUserSwitchedBroadcast(const EventFwk::CommonEventData & data)170 void CallBroadcastSubscriber::ConnectCallUiUserSwitchedBroadcast(const EventFwk::CommonEventData &data)
171 {
172 if (!DelayedSingleton<CallConnectAbility>::GetInstance()->GetConnectFlag()) {
173 TELEPHONY_LOGE("is not connected");
174 return;
175 }
176 TELEPHONY_LOGI("User switched, need reconnect ability");
177 DelayedSingleton<CallConnectAbility>::GetInstance()->DisconnectAbility();
178 sptr<CallAbilityConnectCallback> connectCallback_ = new CallAbilityConnectCallback();
179 connectCallback_->ReConnectAbility();
180 }
181
ShutdownBroadcast(const EventFwk::CommonEventData & data)182 void CallBroadcastSubscriber::ShutdownBroadcast(const EventFwk::CommonEventData &data)
183 {
184 TELEPHONY_LOGI("system is shutdown.");
185 DelayedSingleton<CallControlManager>::GetInstance()->DisconnectAllCalls();
186 }
187
HsdrEventBroadcast(const EventFwk::CommonEventData & data)188 void CallBroadcastSubscriber::HsdrEventBroadcast(const EventFwk::CommonEventData &data)
189 {
190 TELEPHONY_LOGI("HsdrEventBroadcast begin");
191 auto dataStr = data.GetData();
192 if (dataStr.find("com.numberidentity.devicenumber") != std::string::npos) {
193 DelayedRefSingleton<NumberIdentityServiceHelper>::GetInstance().NotifyNumberMarkDataUpdate();
194 }
195 TELEPHONY_LOGI("HsdrEventBroadcast end");
196 }
197
HfpConnectBroadcast(const EventFwk::CommonEventData & data)198 void CallBroadcastSubscriber::HfpConnectBroadcast(const EventFwk::CommonEventData &data)
199 {
200 TELEPHONY_LOGI("HfpConnectBroadcast begin");
201 std::string phoneNumber = data.GetWant().GetStringParam("phoneNumber");
202 std::string contactName = data.GetWant().GetStringParam("contact");
203 DelayedSingleton<CallConnectAbility>::GetInstance()->ConnectAbility();
204 constexpr static uint64_t DISCONNECT_DELAY_TIME = 3000000;
205 DelayedSingleton<CallObjectManager>::GetInstance()->DelayedDisconnectCallConnectAbility(DISCONNECT_DELAY_TIME);
206 if (contactName.empty()) {
207 TELEPHONY_LOGI("contactName is empty.");
208 return;
209 }
210 sptr<CallBase> foregroundCall = CallObjectManager::GetForegroundCall(false);
211 if (foregroundCall == nullptr || phoneNumber != foregroundCall->GetAccountNumber()) {
212 TELEPHONY_LOGI("foregroundCall is nullptr.");
213 DelayedSingleton<BluetoothCallConnection>::GetInstance()->SetHfpContactName(phoneNumber, contactName);
214 } else {
215 TELEPHONY_LOGI("need SetCallerInfo.");
216 ContactInfo contactInfo = foregroundCall->GetCallerInfo();
217 contactInfo.name = contactName;
218 contactInfo.isContacterExists = true;
219 foregroundCall->SetCallerInfo(contactInfo);
220 }
221 TELEPHONY_LOGI("HfpConnectBroadcast end");
222 }
223
ScreenUnlockedBroadcast(const EventFwk::CommonEventData & data)224 void CallBroadcastSubscriber::ScreenUnlockedBroadcast(const EventFwk::CommonEventData &data)
225 {
226 int32_t userId = 0;
227 bool isUserUnlocked = false;
228 AccountSA::OsAccountManager::GetForegroundOsAccountLocalId(userId);
229 AccountSA::OsAccountManager::IsOsAccountVerified(userId, isUserUnlocked);
230 TELEPHONY_LOGI("isUserUnlocked: %{public}d", isUserUnlocked);
231 if (!isUserUnlocked) {
232 std::this_thread::sleep_for(std::chrono::milliseconds(PUBLISH_MISSCALL_EVENT_DELAY_TIME));
233 AAFwk::Want want;
234 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_INCOMING_CALL_MISSED);
235 EventFwk::CommonEventData eventData;
236 eventData.SetWant(want);
237 eventData.SetCode(INCOMING_CALL_MISSED_CODE);
238 EventFwk::CommonEventPublishInfo publishInfo;
239 publishInfo.SetOrdered(true);
240 EventFwk::CommonEventManager::PublishCommonEvent(eventData, publishInfo, nullptr);
241 }
242 }
243 } // namespace Telephony
244 } // namespace OHOS
245