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