1 /*
2 * Copyright (C) 2024 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_dialog.h"
17
18 #include "extension_manager_client.h"
19 #include "ipc_skeleton.h"
20 #include "nlohmann/json.hpp"
21 #include "telephony_log_wrapper.h"
22 #include <securec.h>
23 #include "display_manager.h"
24 #include "fold_status_manager.h"
25 #include "call_object_manager.h"
26 #include "call_superprivacy_control_manager.h"
27
28 namespace OHOS {
29 namespace Telephony {
30 constexpr int32_t DEFAULT_USER_ID = -1;
31 const int32_t SCB_SYS_DIALOG_ZORDER_UNDER_LOCK = 1;
32 const int32_t SOURCE_SCREENLOCKED = 2;
33
DialogConnectExtension(const std::string & dialogReason)34 bool CallDialog::DialogConnectExtension(const std::string &dialogReason)
35 {
36 return DialogConnectExtension(dialogReason, -1);
37 }
38
DialogConnectExtension(const std::string & dialogReason,int32_t slotId)39 bool CallDialog::DialogConnectExtension(const std::string &dialogReason, int32_t slotId)
40 {
41 std::string commandStr = BuildStartCommand(dialogReason, slotId);
42 AAFwk::Want want;
43 std::string bundleName = "com.ohos.sceneboard";
44 std::string abilityName = "com.ohos.sceneboard.systemdialog";
45 want.SetElementName(bundleName, abilityName);
46 bool connectResult = false;
47 if (dialogReason.find("SATELLITE") != std::string::npos) {
48 connectResult = CallSettingDialogConnectExtensionAbility(want, commandStr);
49 } else {
50 connectResult = DialogConnectExtensionAbility(want, commandStr);
51 }
52 if (!connectResult) {
53 TELEPHONY_LOGE("DialogConnectExtensionAbility failed!");
54 return false;
55 }
56 return true;
57 }
58
DialogConnectExtensionAbility(const AAFwk::Want & want,const std::string commandStr)59 bool CallDialog::DialogConnectExtensionAbility(const AAFwk::Want &want, const std::string commandStr)
60 {
61 TELEPHONY_LOGI("DialogConnectExtensionAbility start");
62 sptr<CallAbilityConnection> connection =
63 sptr<CallAbilityConnection> (new (std::nothrow) CallAbilityConnection(commandStr));
64 if (connection == nullptr) {
65 TELEPHONY_LOGE("connection is nullptr");
66 return false;
67 }
68 std::string identity = IPCSkeleton::ResetCallingIdentity();
69 auto connectResult = AAFwk::ExtensionManagerClient::GetInstance().ConnectServiceExtensionAbility(want,
70 connection, nullptr, DEFAULT_USER_ID);
71 IPCSkeleton::SetCallingIdentity(identity);
72 if (connectResult != 0) {
73 TELEPHONY_LOGE("ConnectServiceExtensionAbility Failed!");
74 return false;
75 }
76 return true;
77 }
78
CallSettingDialogConnectExtensionAbility(const AAFwk::Want & want,const std::string commandStr)79 bool CallDialog::CallSettingDialogConnectExtensionAbility(const AAFwk::Want &want,
80 const std::string commandStr)
81 {
82 TELEPHONY_LOGI("CallSettingDialogConnectExtensionAbility start");
83 sptr<CallSettingAbilityConnection> callSettingConnection = sptr<CallSettingAbilityConnection> (new (std::nothrow)
84 CallSettingAbilityConnection(commandStr));
85 if (callSettingConnection == nullptr) {
86 TELEPHONY_LOGE("connection is nullptr");
87 return false;
88 }
89 std::string identity = IPCSkeleton::ResetCallingIdentity();
90 auto connectResult = AAFwk::ExtensionManagerClient::GetInstance().ConnectServiceExtensionAbility(want,
91 callSettingConnection, nullptr, DEFAULT_USER_ID);
92 IPCSkeleton::SetCallingIdentity(identity);
93 if (connectResult != 0) {
94 TELEPHONY_LOGE("ConnectServiceExtensionAbility Failed!");
95 return false;
96 }
97 return true;
98 }
99
BuildStartCommand(const std::string & dialogReason,int32_t slotId)100 std::string CallDialog::BuildStartCommand(const std::string &dialogReason, int32_t slotId)
101 {
102 nlohmann::json root;
103 std::string uiExtensionType = "sysDialog/common";
104 root["ability.want.params.uiExtensionType"] = uiExtensionType;
105 root["sysDialogZOrder"] = SOURCE_SCREENLOCKED;
106 root["dialogReason"] = dialogReason;
107 root["slotId"] = slotId;
108 std::string startCommand = root.dump();
109 TELEPHONY_LOGI("startCommand is: %{public}s", startCommand.c_str());
110 return startCommand;
111 }
112
DialogConnectPrivpacyModeExtension(const std::string & dialogReason,std::u16string & number,int32_t & accountId,int32_t & videoState,int32_t & dialType,int32_t & dialScene,int32_t & callType,bool isVideo)113 bool CallDialog::DialogConnectPrivpacyModeExtension(const std::string &dialogReason, std::u16string &number,
114 int32_t &accountId, int32_t &videoState, int32_t &dialType, int32_t &dialScene, int32_t &callType, bool isVideo)
115 {
116 std::string commandStr = BuildStartPrivpacyModeCommand(dialogReason, number,
117 accountId, videoState, dialType, dialScene, callType, isVideo);
118 AAFwk::Want want;
119 std::string bundleName = "com.ohos.sceneboard";
120 std::string abilityName = "com.ohos.sceneboard.systemdialog";
121 want.SetElementName(bundleName, abilityName);
122 bool connectResult = CallSettingDialogConnectExtensionAbility(want, commandStr);
123 if (!connectResult) {
124 TELEPHONY_LOGE("CallSettingDialogConnectExtensionAbility failed!");
125 return false;
126 }
127 return true;
128 }
129
DialogConnectAnswerPrivpacyModeExtension(const std::string & dialogReason,int32_t & callId,int32_t & videoState,bool isVideo)130 bool CallDialog::DialogConnectAnswerPrivpacyModeExtension(const std::string &dialogReason,
131 int32_t &callId, int32_t &videoState, bool isVideo)
132 {
133 std::string commandStr = BuildStartAnswerPrivpacyModeCommand(dialogReason, callId, videoState, isVideo);
134 AAFwk::Want want;
135 std::string bundleName = "com.ohos.sceneboard";
136 std::string abilityName = "com.ohos.sceneboard.systemdialog";
137 want.SetElementName(bundleName, abilityName);
138 bool connectResult = CallSettingDialogConnectExtensionAbility(want, commandStr);
139 if (!connectResult) {
140 TELEPHONY_LOGE("CallSettingDialogConnectExtensionAbility failed!");
141 return false;
142 }
143 return true;
144 }
145
DialogCallingPrivacyModeExtension(Rosen::FoldStatus foldStatus)146 void CallDialog::DialogCallingPrivacyModeExtension(Rosen::FoldStatus foldStatus)
147 {
148 if (foldStatus != Rosen::FoldStatus::FOLDED
149 || !DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->GetCurrentIsSuperPrivacyMode()) {
150 return;
151 }
152 sptr<CallBase> foregroundCall = CallObjectManager::GetForegroundCall(false);
153 if (foregroundCall == nullptr || foregroundCall->GetTelCallState() == TelCallState::CALL_STATUS_INCOMING) {
154 return;
155 }
156 int32_t videoState = static_cast<int32_t>(foregroundCall->GetVideoStateType());
157 std::string commandStr = BuildCallingPrivacyModeCommand(videoState);
158 AAFwk::Want want;
159 std::string bundleName = "com.ohos.sceneboard";
160 std::string abilityName = "com.ohos.sceneboard.systemdialog";
161 want.SetElementName(bundleName, abilityName);
162 bool connectResult = CallSettingDialogConnectExtensionAbility(want, commandStr);
163 if (!connectResult) {
164 TELEPHONY_LOGE("DialogCallingPrivacyModeExtension failed!");
165 }
166 }
167
BuildStartPrivpacyModeCommand(const std::string & dialogReason,std::u16string & number,int32_t & accountId,int32_t & videoState,int32_t & dialType,int32_t & dialScene,int32_t & callType,bool isVideo)168 std::string CallDialog::BuildStartPrivpacyModeCommand(const std::string &dialogReason, std::u16string &number,
169 int32_t &accountId, int32_t &videoState, int32_t &dialType, int32_t &dialScene, int32_t &callType, bool isVideo)
170 {
171 nlohmann::json root;
172 std::string uiExtensionType = "sysDialog/common";
173 root["ability.want.params.uiExtensionType"] = uiExtensionType;
174 root["sysDialogZOrder"] = SOURCE_SCREENLOCKED;
175 root["dialogReason"] = dialogReason;
176 root["number"] = Str16ToStr8(number);
177 root["accountId"] = accountId;
178 root["videoState"] = videoState;
179 root["dialType"] = dialType;
180 root["dialScene"] = dialScene;
181 root["callType"] = callType;
182 root["isAnswer"] = false;
183 root["isVideo"] = isVideo;
184 root["isFold"] = FoldStatusManager::IsSmallFoldDevice()
185 && Rosen::DisplayManager::GetInstance().GetFoldStatus() == Rosen::FoldStatus::FOLDED;
186 std::string startCommand = root.dump();
187 TELEPHONY_LOGI("startCommand is: %{public}s", startCommand.c_str());
188 return startCommand;
189 }
190
BuildStartAnswerPrivpacyModeCommand(const std::string & dialogReason,int32_t & callId,int32_t & videoState,bool isVideo)191 std::string CallDialog::BuildStartAnswerPrivpacyModeCommand(const std::string &dialogReason,
192 int32_t &callId, int32_t &videoState, bool isVideo)
193 {
194 nlohmann::json root;
195 std::string uiExtensionType = "sysDialog/common";
196 root["ability.want.params.uiExtensionType"] = uiExtensionType;
197 root["sysDialogZOrder"] = SOURCE_SCREENLOCKED;
198 root["dialogReason"] = dialogReason;
199 root["callId"] = callId;
200 root["videoState"] = videoState;
201 root["isAnswer"] = true;
202 root["isVideo"] = isVideo;
203 root["isFold"] = FoldStatusManager::IsSmallFoldDevice()
204 && Rosen::DisplayManager::GetInstance().GetFoldStatus() == Rosen::FoldStatus::FOLDED;
205 std::string startCommand = root.dump();
206 TELEPHONY_LOGI("startCommand is: %{public}s", startCommand.c_str());
207 return startCommand;
208 }
209
BuildCallingPrivacyModeCommand(int32_t & videoState)210 std::string CallDialog::BuildCallingPrivacyModeCommand(int32_t &videoState)
211 {
212 nlohmann::json root;
213 std::string uiExtensionType = "sysDialog/common";
214 std::string dialogReason = "SUPER_PRIVACY_MODE";
215 root["ability.want.params.uiExtensionType"] = uiExtensionType;
216 root["sysDialogZOrder"] = SOURCE_SCREENLOCKED;
217 root["dialogReason"] = dialogReason;
218 root["videoState"] = videoState;
219 root["isInCall"] = true;
220 root["isAnswer"] = false;
221 root["isFold"] = true;
222 std::string startCommand = root.dump();
223 TELEPHONY_LOGI("startCommand is: %{public}s", startCommand.c_str());
224 return startCommand;
225 }
226
DialogProcessMMICodeExtension()227 void CallDialog::DialogProcessMMICodeExtension()
228 {
229 std::string commandStr = BuildProcessMMICodeCommand();
230 AAFwk::Want want;
231 std::string bundleName = "com.ohos.sceneboard";
232 std::string abilityName = "com.ohos.sceneboard.systemdialog";
233 want.SetElementName(bundleName, abilityName);
234 bool connectResult = CallSettingDialogConnectExtensionAbility(want, commandStr);
235 if (!connectResult) {
236 TELEPHONY_LOGE("CallSettingDialogConnectExtensionAbility failed!");
237 }
238 }
239
BuildProcessMMICodeCommand()240 std::string CallDialog::BuildProcessMMICodeCommand()
241 {
242 TELEPHONY_LOGI("BuildProcessMMICodeCommand enter");
243 nlohmann::json root;
244 std::string uiExtensionType = "sysDialog/common";
245 std::string dialogReason = "PROCESS_MMI_CODE";
246 root["ability.want.params.uiExtensionType"] = uiExtensionType;
247 root["sysDialogZOrder"] = SCB_SYS_DIALOG_ZORDER_UNDER_LOCK;
248 root["dialogReason"] = dialogReason;
249 std::string startCommand = root.dump();
250 TELEPHONY_LOGI("startCommand is: %{public}s", startCommand.c_str());
251 return startCommand;
252 }
253 } // namespace Telephony
254 } // namespace OHOS