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 
31 namespace OHOS {
32 namespace Telephony {
33 using namespace OHOS::EventFwk;
CallBroadcastSubscriber(const OHOS::EventFwk::CommonEventSubscribeInfo &subscriberInfo)34 CallBroadcastSubscriber::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 
OnReceiveEvent(const EventFwk::CommonEventData &data)53 void 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 
UnknownBroadcast(const EventFwk::CommonEventData &data)83 void CallBroadcastSubscriber::UnknownBroadcast(const EventFwk::CommonEventData &data)
84 {
85     TELEPHONY_LOGI("you receive one unknown broadcast!");
86 }
87 
SimStateBroadcast(const EventFwk::CommonEventData &data)88 void CallBroadcastSubscriber::SimStateBroadcast(const EventFwk::CommonEventData &data)
89 {
90     TELEPHONY_LOGI("sim state broadcast code:%{public}d", data.GetCode());
91 }
92 
ConnectCallUiServiceBroadcast(const EventFwk::CommonEventData &data)93 void 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 
HighTempLevelChangedBroadcast(const EventFwk::CommonEventData &data)100 void 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 
ConnectCallUiSuperPrivacyModeBroadcast(const EventFwk::CommonEventData &data)107 void 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 
UpdateBluetoothDeviceName(const EventFwk::CommonEventData &data)142 void 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 
ConnectCallUiUserSwitchedBroadcast(const EventFwk::CommonEventData &data)149 void 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