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