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