• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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