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