1 /*
2 * Copyright (c) 2023-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 "js_embeddable_ui_ability_context.h"
17
18 #include <chrono>
19 #include <cstdint>
20 #include <string>
21
22 #include "ability_manager_client.h"
23 #include "event_handler.h"
24 #include "hilog_tag_wrapper.h"
25 #include "js_context_utils.h"
26 #include "js_data_struct_converter.h"
27 #include "js_error_utils.h"
28 #include "js_runtime.h"
29 #include "js_runtime_utils.h"
30 #include "napi/native_api.h"
31 #include "napi_common_ability.h"
32 #include "napi_common_want.h"
33 #include "napi_common_util.h"
34 #include "napi_common_start_options.h"
35 #include "want.h"
36
37 namespace OHOS {
38 namespace AbilityRuntime {
39 #define CHECK_POINTER_RETURN(env, object) \
40 if (!(object)) { \
41 TAG_LOGE(AAFwkTag::UI_EXT, "null context"); \
42 return CreateJsUndefined(env); \
43 }
44
45 namespace {
46 const std::string ERR_MSG_NOT_SUPPORT = "Not support the interface in embedded screen mode of atomic service.";
47
IsEmbeddableStart(int32_t screenMode)48 bool IsEmbeddableStart(int32_t screenMode)
49 {
50 return screenMode == AAFwk::EMBEDDED_FULL_SCREEN_MODE ||
51 screenMode == AAFwk::EMBEDDED_HALF_SCREEN_MODE;
52 }
53 }
54
JsEmbeddableUIAbilityContext(const std::shared_ptr<AbilityContext> & uiAbiContext,const std::shared_ptr<UIExtensionContext> & uiExtContext,int32_t screenMode)55 JsEmbeddableUIAbilityContext::JsEmbeddableUIAbilityContext(const std::shared_ptr<AbilityContext>& uiAbiContext,
56 const std::shared_ptr<UIExtensionContext>& uiExtContext, int32_t screenMode)
57 {
58 jsAbilityContext_ = std::make_shared<JsAbilityContext>(uiAbiContext);
59 jsUIExtensionContext_ = std::make_shared<JsUIExtensionContext>(uiExtContext);
60 screenMode_ = screenMode;
61 }
62
Finalizer(napi_env env,void * data,void * hint)63 void JsEmbeddableUIAbilityContext::Finalizer(napi_env env, void* data, void* hint)
64 {
65 TAG_LOGD(AAFwkTag::UI_EXT, "called");
66 std::unique_ptr<JsEmbeddableUIAbilityContext>(static_cast<JsEmbeddableUIAbilityContext*>(data));
67 }
68
StartAbility(napi_env env,napi_callback_info info)69 napi_value JsEmbeddableUIAbilityContext::StartAbility(napi_env env, napi_callback_info info)
70 {
71 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnStartAbility);
72 }
73
OpenLink(napi_env env,napi_callback_info info)74 napi_value JsEmbeddableUIAbilityContext::OpenLink(napi_env env, napi_callback_info info)
75 {
76 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnOpenLink);
77 }
78
StartAbilityForResult(napi_env env,napi_callback_info info)79 napi_value JsEmbeddableUIAbilityContext::StartAbilityForResult(napi_env env, napi_callback_info info)
80 {
81 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnStartAbilityForResult);
82 }
83
ConnectAbility(napi_env env,napi_callback_info info)84 napi_value JsEmbeddableUIAbilityContext::ConnectAbility(napi_env env, napi_callback_info info)
85 {
86 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnConnectAbility);
87 }
88
DisconnectAbility(napi_env env,napi_callback_info info)89 napi_value JsEmbeddableUIAbilityContext::DisconnectAbility(napi_env env, napi_callback_info info)
90 {
91 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnDisconnectAbility);
92 }
93
TerminateSelf(napi_env env,napi_callback_info info)94 napi_value JsEmbeddableUIAbilityContext::TerminateSelf(napi_env env, napi_callback_info info)
95 {
96 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnTerminateSelf);
97 }
98
TerminateSelfWithResult(napi_env env,napi_callback_info info)99 napi_value JsEmbeddableUIAbilityContext::TerminateSelfWithResult(napi_env env, napi_callback_info info)
100 {
101 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnTerminateSelfWithResult);
102 }
103
BackToCallerAbilityWithResult(napi_env env,napi_callback_info info)104 napi_value JsEmbeddableUIAbilityContext::BackToCallerAbilityWithResult(napi_env env, napi_callback_info info)
105 {
106 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnBackToCallerAbilityWithResult);
107 }
108
StartAbilityAsCaller(napi_env env,napi_callback_info info)109 napi_value JsEmbeddableUIAbilityContext::StartAbilityAsCaller(napi_env env, napi_callback_info info)
110 {
111 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnStartAbilityAsCaller);
112 }
113
StartAbilityWithAccount(napi_env env,napi_callback_info info)114 napi_value JsEmbeddableUIAbilityContext::StartAbilityWithAccount(napi_env env, napi_callback_info info)
115 {
116 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnStartAbilityWithAccount);
117 }
118
StartAbilityByCall(napi_env env,napi_callback_info info)119 napi_value JsEmbeddableUIAbilityContext::StartAbilityByCall(napi_env env, napi_callback_info info)
120 {
121 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnStartAbilityByCall);
122 }
123
StartAbilityForResultWithAccount(napi_env env,napi_callback_info info)124 napi_value JsEmbeddableUIAbilityContext::StartAbilityForResultWithAccount(napi_env env, napi_callback_info info)
125 {
126 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnStartAbilityForResultWithAccount);
127 }
128
StartServiceExtensionAbility(napi_env env,napi_callback_info info)129 napi_value JsEmbeddableUIAbilityContext::StartServiceExtensionAbility(napi_env env, napi_callback_info info)
130 {
131 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnStartExtensionAbility);
132 }
133
StartServiceExtensionAbilityWithAccount(napi_env env,napi_callback_info info)134 napi_value JsEmbeddableUIAbilityContext::StartServiceExtensionAbilityWithAccount(napi_env env, napi_callback_info info)
135 {
136 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnStartExtensionAbilityWithAccount);
137 }
138
StopServiceExtensionAbility(napi_env env,napi_callback_info info)139 napi_value JsEmbeddableUIAbilityContext::StopServiceExtensionAbility(napi_env env, napi_callback_info info)
140 {
141 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnStopExtensionAbility);
142 }
143
StopServiceExtensionAbilityWithAccount(napi_env env,napi_callback_info info)144 napi_value JsEmbeddableUIAbilityContext::StopServiceExtensionAbilityWithAccount(napi_env env, napi_callback_info info)
145 {
146 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnStopExtensionAbilityWithAccount);
147 }
148
ConnectAbilityWithAccount(napi_env env,napi_callback_info info)149 napi_value JsEmbeddableUIAbilityContext::ConnectAbilityWithAccount(napi_env env, napi_callback_info info)
150 {
151 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnConnectAbilityWithAccount);
152 }
153
RestoreWindowStage(napi_env env,napi_callback_info info)154 napi_value JsEmbeddableUIAbilityContext::RestoreWindowStage(napi_env env, napi_callback_info info)
155 {
156 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnRestoreWindowStage);
157 }
158
IsTerminating(napi_env env,napi_callback_info info)159 napi_value JsEmbeddableUIAbilityContext::IsTerminating(napi_env env, napi_callback_info info)
160 {
161 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnIsTerminating);
162 }
163
StartRecentAbility(napi_env env,napi_callback_info info)164 napi_value JsEmbeddableUIAbilityContext::StartRecentAbility(napi_env env, napi_callback_info info)
165 {
166 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnStartRecentAbility);
167 }
168
RequestDialogService(napi_env env,napi_callback_info info)169 napi_value JsEmbeddableUIAbilityContext::RequestDialogService(napi_env env, napi_callback_info info)
170 {
171 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnRequestDialogService);
172 }
173
ReportDrawnCompleted(napi_env env,napi_callback_info info)174 napi_value JsEmbeddableUIAbilityContext::ReportDrawnCompleted(napi_env env, napi_callback_info info)
175 {
176 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnReportDrawnCompleted);
177 }
178
SetMissionContinueState(napi_env env,napi_callback_info info)179 napi_value JsEmbeddableUIAbilityContext::SetMissionContinueState(napi_env env, napi_callback_info info)
180 {
181 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnSetMissionContinueState);
182 }
183
StartAbilityByType(napi_env env,napi_callback_info info)184 napi_value JsEmbeddableUIAbilityContext::StartAbilityByType(napi_env env, napi_callback_info info)
185 {
186 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnStartAbilityByType);
187 }
188
MoveAbilityToBackground(napi_env env,napi_callback_info info)189 napi_value JsEmbeddableUIAbilityContext::MoveAbilityToBackground(napi_env env, napi_callback_info info)
190 {
191 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnMoveAbilityToBackground);
192 }
193
RequestModalUIExtension(napi_env env,napi_callback_info info)194 napi_value JsEmbeddableUIAbilityContext::RequestModalUIExtension(napi_env env, napi_callback_info info)
195 {
196 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnRequestModalUIExtension);
197 }
198
OpenAtomicService(napi_env env,napi_callback_info info)199 napi_value JsEmbeddableUIAbilityContext::OpenAtomicService(napi_env env, napi_callback_info info)
200 {
201 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnOpenAtomicService);
202 }
203
ShowAbility(napi_env env,napi_callback_info info)204 napi_value JsEmbeddableUIAbilityContext::ShowAbility(napi_env env, napi_callback_info info)
205 {
206 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnShowAbility);
207 }
208
HideAbility(napi_env env,napi_callback_info info)209 napi_value JsEmbeddableUIAbilityContext::HideAbility(napi_env env, napi_callback_info info)
210 {
211 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnHideAbility);
212 }
213
SetRestoreEnabled(napi_env env,napi_callback_info info)214 napi_value JsEmbeddableUIAbilityContext::SetRestoreEnabled(napi_env env, napi_callback_info info)
215 {
216 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnSetRestoreEnabled);
217 }
218
OnStartAbility(napi_env env,NapiCallbackInfo & info)219 napi_value JsEmbeddableUIAbilityContext::OnStartAbility(napi_env env, NapiCallbackInfo& info)
220 {
221 if (IsEmbeddableStart(screenMode_)) {
222 TAG_LOGI(AAFwkTag::UI_EXT, "Start ability in embedded screen mode");
223 CHECK_POINTER_RETURN(env, jsUIExtensionContext_);
224 return jsUIExtensionContext_->OnStartAbility(env, info);
225 }
226 CHECK_POINTER_RETURN(env, jsAbilityContext_);
227 return jsAbilityContext_->OnStartAbility(env, info);
228 }
229
OnOpenLink(napi_env env,NapiCallbackInfo & info)230 napi_value JsEmbeddableUIAbilityContext::OnOpenLink(napi_env env, NapiCallbackInfo& info)
231 {
232 if (IsEmbeddableStart(screenMode_)) {
233 TAG_LOGI(AAFwkTag::UI_EXT, "Start openLink in embedded screen mode");
234 CHECK_POINTER_RETURN(env, jsUIExtensionContext_);
235 return jsUIExtensionContext_->OnOpenLink(env, info);
236 }
237 CHECK_POINTER_RETURN(env, jsAbilityContext_);
238 return jsAbilityContext_->OnOpenLink(env, info);
239 }
240
OnStartAbilityForResult(napi_env env,NapiCallbackInfo & info)241 napi_value JsEmbeddableUIAbilityContext::OnStartAbilityForResult(napi_env env, NapiCallbackInfo& info)
242 {
243 if (IsEmbeddableStart(screenMode_)) {
244 TAG_LOGI(AAFwkTag::UI_EXT, "Start ability for result in embedded screen mode");
245 CHECK_POINTER_RETURN(env, jsUIExtensionContext_);
246 return jsUIExtensionContext_->OnStartAbilityForResult(env, info);
247 }
248 CHECK_POINTER_RETURN(env, jsAbilityContext_);
249 return jsAbilityContext_->OnStartAbilityForResult(env, info);
250 }
251
OnConnectAbility(napi_env env,NapiCallbackInfo & info)252 napi_value JsEmbeddableUIAbilityContext::OnConnectAbility(napi_env env, NapiCallbackInfo& info)
253 {
254 if (IsEmbeddableStart(screenMode_)) {
255 TAG_LOGI(AAFwkTag::UI_EXT, "Connect ability in embedded screen mode");
256 CHECK_POINTER_RETURN(env, jsUIExtensionContext_);
257 return jsUIExtensionContext_->OnConnectAbility(env, info);
258 }
259 CHECK_POINTER_RETURN(env, jsAbilityContext_);
260 return jsAbilityContext_->OnConnectAbility(env, info);
261 }
262
OnDisconnectAbility(napi_env env,NapiCallbackInfo & info)263 napi_value JsEmbeddableUIAbilityContext::OnDisconnectAbility(napi_env env, NapiCallbackInfo& info)
264 {
265 if (IsEmbeddableStart(screenMode_)) {
266 TAG_LOGI(AAFwkTag::UI_EXT, "Disconnect ability in embedded screen mode");
267 CHECK_POINTER_RETURN(env, jsUIExtensionContext_);
268 return jsUIExtensionContext_->OnDisconnectAbility(env, info);
269 }
270 CHECK_POINTER_RETURN(env, jsAbilityContext_);
271 return jsAbilityContext_->OnDisconnectAbility(env, info);
272 }
273
OnTerminateSelf(napi_env env,NapiCallbackInfo & info)274 napi_value JsEmbeddableUIAbilityContext::OnTerminateSelf(napi_env env, NapiCallbackInfo& info)
275 {
276 if (IsEmbeddableStart(screenMode_)) {
277 TAG_LOGI(AAFwkTag::UI_EXT, "TerminateSelf in embedded screen mode");
278 CHECK_POINTER_RETURN(env, jsUIExtensionContext_);
279 return jsUIExtensionContext_->OnTerminateSelf(env, info);
280 }
281 CHECK_POINTER_RETURN(env, jsAbilityContext_);
282 return jsAbilityContext_->OnTerminateSelf(env, info);
283 }
284
OnTerminateSelfWithResult(napi_env env,NapiCallbackInfo & info)285 napi_value JsEmbeddableUIAbilityContext::OnTerminateSelfWithResult(napi_env env, NapiCallbackInfo& info)
286 {
287 if (IsEmbeddableStart(screenMode_)) {
288 TAG_LOGI(AAFwkTag::UI_EXT, "TerminateSelfWithResult ability in embedded screen mode");
289 CHECK_POINTER_RETURN(env, jsUIExtensionContext_);
290 return jsUIExtensionContext_->OnTerminateSelfWithResult(env, info);
291 }
292 CHECK_POINTER_RETURN(env, jsAbilityContext_);
293 return jsAbilityContext_->OnTerminateSelfWithResult(env, info);
294 }
295
OnBackToCallerAbilityWithResult(napi_env env,NapiCallbackInfo & info)296 napi_value JsEmbeddableUIAbilityContext::OnBackToCallerAbilityWithResult(napi_env env, NapiCallbackInfo& info)
297 {
298 if (IsEmbeddableStart(screenMode_)) {
299 TAG_LOGE(AAFwkTag::UI_EXT, "BackToCallerAbilityWithResult in embedded screen mode");
300 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
301 return CreateJsUndefined(env);
302 }
303 CHECK_POINTER_RETURN(env, jsAbilityContext_);
304 return jsAbilityContext_->OnBackToCallerAbilityWithResult(env, info);
305 }
306
OnStartAbilityAsCaller(napi_env env,NapiCallbackInfo & info)307 napi_value JsEmbeddableUIAbilityContext::OnStartAbilityAsCaller(napi_env env, NapiCallbackInfo& info)
308 {
309 if (IsEmbeddableStart(screenMode_)) {
310 TAG_LOGE(AAFwkTag::UI_EXT, "Start ability as caller in embedded screen mode");
311 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
312 return CreateJsUndefined(env);
313 }
314 CHECK_POINTER_RETURN(env, jsAbilityContext_);
315 return jsAbilityContext_->OnStartAbilityAsCaller(env, info);
316 }
317
OnStartAbilityWithAccount(napi_env env,NapiCallbackInfo & info)318 napi_value JsEmbeddableUIAbilityContext::OnStartAbilityWithAccount(napi_env env, NapiCallbackInfo& info)
319 {
320 if (IsEmbeddableStart(screenMode_)) {
321 TAG_LOGE(AAFwkTag::UI_EXT, "Start ability with account in embedded screen mode");
322 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
323 return CreateJsUndefined(env);
324 }
325 CHECK_POINTER_RETURN(env, jsAbilityContext_);
326 return jsAbilityContext_->OnStartAbilityWithAccount(env, info);
327 }
328
OnStartAbilityByCall(napi_env env,NapiCallbackInfo & info)329 napi_value JsEmbeddableUIAbilityContext::OnStartAbilityByCall(napi_env env, NapiCallbackInfo& info)
330 {
331 if (IsEmbeddableStart(screenMode_)) {
332 TAG_LOGE(AAFwkTag::UI_EXT, "Start ability by caller in embedded screen mode");
333 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
334 return CreateJsUndefined(env);
335 }
336 CHECK_POINTER_RETURN(env, jsAbilityContext_);
337 return jsAbilityContext_->OnStartAbilityByCall(env, info);
338 }
339
OnStartAbilityForResultWithAccount(napi_env env,NapiCallbackInfo & info)340 napi_value JsEmbeddableUIAbilityContext::OnStartAbilityForResultWithAccount(napi_env env, NapiCallbackInfo& info)
341 {
342 if (IsEmbeddableStart(screenMode_)) {
343 TAG_LOGE(AAFwkTag::UI_EXT, "Start ability for result in embedded screen mode");
344 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
345 return CreateJsUndefined(env);
346 }
347 CHECK_POINTER_RETURN(env, jsAbilityContext_);
348 return jsAbilityContext_->OnStartAbilityForResultWithAccount(env, info);
349 }
350
OnStartExtensionAbility(napi_env env,NapiCallbackInfo & info)351 napi_value JsEmbeddableUIAbilityContext::OnStartExtensionAbility(napi_env env, NapiCallbackInfo& info)
352 {
353 if (IsEmbeddableStart(screenMode_)) {
354 TAG_LOGE(AAFwkTag::UI_EXT, "Start extension in embedded screen mode");
355 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
356 return CreateJsUndefined(env);
357 }
358 CHECK_POINTER_RETURN(env, jsAbilityContext_);
359 return jsAbilityContext_->OnStartExtensionAbility(env, info);
360 }
361
OnStartExtensionAbilityWithAccount(napi_env env,NapiCallbackInfo & info)362 napi_value JsEmbeddableUIAbilityContext::OnStartExtensionAbilityWithAccount(napi_env env, NapiCallbackInfo& info)
363 {
364 if (IsEmbeddableStart(screenMode_)) {
365 TAG_LOGE(AAFwkTag::UI_EXT, "Start extension with account in embedded screen mode");
366 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
367 return CreateJsUndefined(env);
368 }
369 CHECK_POINTER_RETURN(env, jsAbilityContext_);
370 return jsAbilityContext_->OnStartExtensionAbilityWithAccount(env, info);
371 }
372
OnStopExtensionAbility(napi_env env,NapiCallbackInfo & info)373 napi_value JsEmbeddableUIAbilityContext::OnStopExtensionAbility(napi_env env, NapiCallbackInfo& info)
374 {
375 if (IsEmbeddableStart(screenMode_)) {
376 TAG_LOGE(AAFwkTag::UI_EXT, "Stop extension in embedded screen mode");
377 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
378 return CreateJsUndefined(env);
379 }
380 CHECK_POINTER_RETURN(env, jsAbilityContext_);
381 return jsAbilityContext_->OnStopExtensionAbility(env, info);
382 }
383
OnStopExtensionAbilityWithAccount(napi_env env,NapiCallbackInfo & info)384 napi_value JsEmbeddableUIAbilityContext::OnStopExtensionAbilityWithAccount(napi_env env, NapiCallbackInfo& info)
385 {
386 if (IsEmbeddableStart(screenMode_)) {
387 TAG_LOGE(AAFwkTag::UI_EXT, "Stop extension with account in embedded screen mode");
388 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
389 return CreateJsUndefined(env);
390 }
391 CHECK_POINTER_RETURN(env, jsAbilityContext_);
392 return jsAbilityContext_->OnStopExtensionAbilityWithAccount(env, info);
393 }
394
OnConnectAbilityWithAccount(napi_env env,NapiCallbackInfo & info)395 napi_value JsEmbeddableUIAbilityContext::OnConnectAbilityWithAccount(napi_env env, NapiCallbackInfo& info)
396 {
397 if (IsEmbeddableStart(screenMode_)) {
398 TAG_LOGE(AAFwkTag::UI_EXT, "Connect ability with account in embedded screen mode");
399 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
400 return CreateJsUndefined(env);
401 }
402 CHECK_POINTER_RETURN(env, jsAbilityContext_);
403 return jsAbilityContext_->OnConnectAbilityWithAccount(env, info);
404 }
405
OnRestoreWindowStage(napi_env env,NapiCallbackInfo & info)406 napi_value JsEmbeddableUIAbilityContext::OnRestoreWindowStage(napi_env env, NapiCallbackInfo& info)
407 {
408 if (IsEmbeddableStart(screenMode_)) {
409 TAG_LOGE(AAFwkTag::UI_EXT, "Restore window stage with account in embedded screen mode");
410 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
411 return CreateJsUndefined(env);
412 }
413 CHECK_POINTER_RETURN(env, jsAbilityContext_);
414 return jsAbilityContext_->OnRestoreWindowStage(env, info);
415 }
416
OnIsTerminating(napi_env env,NapiCallbackInfo & info)417 napi_value JsEmbeddableUIAbilityContext::OnIsTerminating(napi_env env, NapiCallbackInfo& info)
418 {
419 if (IsEmbeddableStart(screenMode_)) {
420 TAG_LOGE(AAFwkTag::UI_EXT, "Get terminating state in embedded screen mode");
421 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
422 return CreateJsUndefined(env);
423 }
424 CHECK_POINTER_RETURN(env, jsAbilityContext_);
425 return jsAbilityContext_->OnIsTerminating(env, info);
426 }
427
OnStartRecentAbility(napi_env env,NapiCallbackInfo & info)428 napi_value JsEmbeddableUIAbilityContext::OnStartRecentAbility(napi_env env, NapiCallbackInfo& info)
429 {
430 if (IsEmbeddableStart(screenMode_)) {
431 TAG_LOGE(AAFwkTag::UI_EXT, "Start recent ability in embedded screen mode");
432 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
433 return CreateJsUndefined(env);
434 }
435 CHECK_POINTER_RETURN(env, jsAbilityContext_);
436 return jsAbilityContext_->OnStartRecentAbility(env, info);
437 }
438
OnRequestDialogService(napi_env env,NapiCallbackInfo & info)439 napi_value JsEmbeddableUIAbilityContext::OnRequestDialogService(napi_env env, NapiCallbackInfo& info)
440 {
441 if (IsEmbeddableStart(screenMode_)) {
442 TAG_LOGE(AAFwkTag::UI_EXT, "Request dialog service in embedded screen mode");
443 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
444 return CreateJsUndefined(env);
445 }
446 CHECK_POINTER_RETURN(env, jsAbilityContext_);
447 return jsAbilityContext_->OnRequestDialogService(env, info);
448 }
449
OnReportDrawnCompleted(napi_env env,NapiCallbackInfo & info)450 napi_value JsEmbeddableUIAbilityContext::OnReportDrawnCompleted(napi_env env, NapiCallbackInfo& info)
451 {
452 if (IsEmbeddableStart(screenMode_)) {
453 TAG_LOGI(AAFwkTag::UI_EXT, "Report Drawn Completed in half screen mode");
454 CHECK_POINTER_RETURN(env, jsUIExtensionContext_);
455 return jsUIExtensionContext_->OnReportDrawnCompleted(env, info);
456 }
457 CHECK_POINTER_RETURN(env, jsAbilityContext_);
458 return jsAbilityContext_->OnReportDrawnCompleted(env, info);
459 }
460
OnSetMissionContinueState(napi_env env,NapiCallbackInfo & info)461 napi_value JsEmbeddableUIAbilityContext::OnSetMissionContinueState(napi_env env, NapiCallbackInfo& info)
462 {
463 if (IsEmbeddableStart(screenMode_)) {
464 TAG_LOGE(AAFwkTag::UI_EXT, "Set mission continue state in embedded screen mode");
465 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
466 return CreateJsUndefined(env);
467 }
468 CHECK_POINTER_RETURN(env, jsAbilityContext_);
469 return jsAbilityContext_->OnSetMissionContinueState(env, info);
470 }
471
OnStartAbilityByType(napi_env env,NapiCallbackInfo & info)472 napi_value JsEmbeddableUIAbilityContext::OnStartAbilityByType(napi_env env, NapiCallbackInfo& info)
473 {
474 if (IsEmbeddableStart(screenMode_)) {
475 TAG_LOGE(AAFwkTag::UI_EXT, "Start ability by type in embedded screen mode");
476 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
477 return CreateJsUndefined(env);
478 }
479 CHECK_POINTER_RETURN(env, jsAbilityContext_);
480 return jsAbilityContext_->OnStartAbilityByType(env, info);
481 }
482
OnMoveAbilityToBackground(napi_env env,NapiCallbackInfo & info)483 napi_value JsEmbeddableUIAbilityContext::OnMoveAbilityToBackground(napi_env env, NapiCallbackInfo& info)
484 {
485 if (IsEmbeddableStart(screenMode_)) {
486 TAG_LOGE(AAFwkTag::UI_EXT, "OnMoveAbilityToBackground in half screen mode");
487 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
488 return CreateJsUndefined(env);
489 }
490 CHECK_POINTER_RETURN(env, jsAbilityContext_);
491 return jsAbilityContext_->OnMoveAbilityToBackground(env, info);
492 }
493
OnRequestModalUIExtension(napi_env env,NapiCallbackInfo & info)494 napi_value JsEmbeddableUIAbilityContext::OnRequestModalUIExtension(napi_env env, NapiCallbackInfo& info)
495 {
496 if (IsEmbeddableStart(screenMode_)) {
497 TAG_LOGE(AAFwkTag::UI_EXT, "OnRequestModalUIExtension in half screen mode");
498 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
499 return CreateJsUndefined(env);
500 }
501 CHECK_POINTER_RETURN(env, jsAbilityContext_);
502 return jsAbilityContext_->OnRequestModalUIExtension(env, info);
503 }
504
OnOpenAtomicService(napi_env env,NapiCallbackInfo & info)505 napi_value JsEmbeddableUIAbilityContext::OnOpenAtomicService(napi_env env, NapiCallbackInfo& info)
506 {
507 if (IsEmbeddableStart(screenMode_)) {
508 TAG_LOGI(AAFwkTag::UI_EXT, "OpenAtomicService in embedded screen mode");
509 CHECK_POINTER_RETURN(env, jsUIExtensionContext_);
510 return jsUIExtensionContext_->OnOpenAtomicService(env, info);
511 }
512 CHECK_POINTER_RETURN(env, jsAbilityContext_);
513 return jsAbilityContext_->OnOpenAtomicService(env, info);
514 }
515
OnShowAbility(napi_env env,NapiCallbackInfo & info)516 napi_value JsEmbeddableUIAbilityContext::OnShowAbility(napi_env env, NapiCallbackInfo& info)
517 {
518 if (IsEmbeddableStart(screenMode_)) {
519 TAG_LOGE(AAFwkTag::UI_EXT, "OnShowAbility in half screen mode");
520 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
521 return CreateJsUndefined(env);
522 }
523 CHECK_POINTER_RETURN(env, jsAbilityContext_);
524 return jsAbilityContext_->OnShowAbility(env, info);
525 }
526
OnHideAbility(napi_env env,NapiCallbackInfo & info)527 napi_value JsEmbeddableUIAbilityContext::OnHideAbility(napi_env env, NapiCallbackInfo& info)
528 {
529 if (IsEmbeddableStart(screenMode_)) {
530 TAG_LOGE(AAFwkTag::UI_EXT, "OnHideAbility in half screen mode");
531 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
532 return CreateJsUndefined(env);
533 }
534 CHECK_POINTER_RETURN(env, jsAbilityContext_);
535 return jsAbilityContext_->OnHideAbility(env, info);
536 }
537
OnSetRestoreEnabled(napi_env env,NapiCallbackInfo & info)538 napi_value JsEmbeddableUIAbilityContext::OnSetRestoreEnabled(napi_env env, NapiCallbackInfo& info)
539 {
540 if (IsEmbeddableStart(screenMode_)) {
541 TAG_LOGE(AAFwkTag::UI_EXT, "OnSetRestoreEnabled in half screen mode");
542 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
543 return CreateJsUndefined(env);
544 }
545 CHECK_POINTER_RETURN(env, jsAbilityContext_);
546 return jsAbilityContext_->OnSetRestoreEnabled(env, info);
547 }
548
549 #ifdef SUPPORT_GRAPHICS
SetMissionLabel(napi_env env,napi_callback_info info)550 napi_value JsEmbeddableUIAbilityContext::SetMissionLabel(napi_env env, napi_callback_info info)
551 {
552 TAG_LOGI(AAFwkTag::UI_EXT, "called");
553 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnSetMissionLabel);
554 }
555
SetMissionIcon(napi_env env,napi_callback_info info)556 napi_value JsEmbeddableUIAbilityContext::SetMissionIcon(napi_env env, napi_callback_info info)
557 {
558 TAG_LOGI(AAFwkTag::UI_EXT, "called");
559 GET_NAPI_INFO_AND_CALL(env, info, JsEmbeddableUIAbilityContext, OnSetMissionIcon);
560 }
561
OnSetMissionLabel(napi_env env,NapiCallbackInfo & info)562 napi_value JsEmbeddableUIAbilityContext::OnSetMissionLabel(napi_env env, NapiCallbackInfo& info)
563 {
564 if (IsEmbeddableStart(screenMode_)) {
565 TAG_LOGE(AAFwkTag::UI_EXT, "Set mission label in embedded screen mode");
566 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
567 return CreateJsUndefined(env);
568 }
569 CHECK_POINTER_RETURN(env, jsAbilityContext_);
570 return jsAbilityContext_->OnSetMissionLabel(env, info);
571 }
572
OnSetMissionIcon(napi_env env,NapiCallbackInfo & info)573 napi_value JsEmbeddableUIAbilityContext::OnSetMissionIcon(napi_env env, NapiCallbackInfo& info)
574 {
575 if (IsEmbeddableStart(screenMode_)) {
576 TAG_LOGE(AAFwkTag::UI_EXT, "Set mission icon in embedded screen mode");
577 ThrowError(env, static_cast<int32_t>(AbilityErrorCode::ERROR_CODE_INNER), ERR_MSG_NOT_SUPPORT);
578 return CreateJsUndefined(env);
579 }
580 CHECK_POINTER_RETURN(env, jsAbilityContext_);
581 return jsAbilityContext_->OnSetMissionIcon(env, info);
582 }
583 #endif
584
WrapJsUIAbilityContext(napi_env env,std::shared_ptr<AbilityContext> uiAbiContext,napi_value & objValue,int32_t screenMode)585 void JsEmbeddableUIAbilityContext::WrapJsUIAbilityContext(napi_env env,
586 std::shared_ptr<AbilityContext> uiAbiContext, napi_value &objValue, int32_t screenMode)
587 {
588 if (uiAbiContext == nullptr) {
589 TAG_LOGE(AAFwkTag::UI_EXT, "null uiAbiContext");
590 return;
591 }
592 objValue = CreateJsBaseContext(env, uiAbiContext);
593 std::unique_ptr<JsEmbeddableUIAbilityContext> jsContext = std::make_unique<JsEmbeddableUIAbilityContext>(
594 uiAbiContext, nullptr, screenMode);
595 napi_wrap(env, objValue, jsContext.release(), Finalizer, nullptr, nullptr);
596
597 auto abilityInfo = uiAbiContext->GetAbilityInfo();
598 if (abilityInfo != nullptr) {
599 napi_set_named_property(env, objValue, "abilityInfo", CreateJsAbilityInfo(env, *abilityInfo));
600 }
601
602 auto configuration = uiAbiContext->GetConfiguration();
603 if (configuration != nullptr) {
604 napi_set_named_property(env, objValue, "config", CreateJsConfiguration(env, *configuration));
605 }
606 }
607
WrapJsUIExtensionContext(napi_env env,std::shared_ptr<UIExtensionContext> uiExtContext,napi_value & objValue,int32_t screenMode)608 void JsEmbeddableUIAbilityContext::WrapJsUIExtensionContext(napi_env env,
609 std::shared_ptr<UIExtensionContext> uiExtContext, napi_value &objValue, int32_t screenMode)
610 {
611 if (uiExtContext == nullptr) {
612 TAG_LOGE(AAFwkTag::UI_EXT, "null uiExtContext");
613 return;
614 }
615 objValue = CreateJsBaseContext(env, uiExtContext);
616 std::unique_ptr<JsEmbeddableUIAbilityContext> jsContext = std::make_unique<JsEmbeddableUIAbilityContext>(
617 nullptr, uiExtContext, screenMode);
618 napi_wrap(env, objValue, jsContext.release(), Finalizer, nullptr, nullptr);
619
620 auto abilityInfo = uiExtContext->GetAbilityInfo();
621 if (abilityInfo != nullptr) {
622 napi_set_named_property(env, objValue, "abilityInfo", CreateJsAbilityInfo(env, *abilityInfo));
623 }
624
625 auto configuration = uiExtContext->GetConfiguration();
626 if (configuration != nullptr) {
627 napi_set_named_property(env, objValue, "config", CreateJsConfiguration(env, *configuration));
628 }
629 }
630
CreateJsEmbeddableUIAbilityContext(napi_env env,std::shared_ptr<AbilityContext> uiAbiContext,std::shared_ptr<UIExtensionContext> uiExtContext,int32_t screenMode)631 napi_value JsEmbeddableUIAbilityContext::CreateJsEmbeddableUIAbilityContext(napi_env env,
632 std::shared_ptr<AbilityContext> uiAbiContext, std::shared_ptr<UIExtensionContext> uiExtContext, int32_t screenMode)
633 {
634 TAG_LOGD(AAFwkTag::UI_EXT, "begin");
635 napi_value objValue = nullptr;
636 if (screenMode == AAFwk::JUMP_SCREEN_MODE) {
637 WrapJsUIAbilityContext(env, uiAbiContext, objValue, screenMode);
638 } else if (IsEmbeddableStart(screenMode)) {
639 WrapJsUIExtensionContext(env, uiExtContext, objValue, screenMode);
640 }
641
642 const char* moduleName = "JsEmbeddableUIAbilityContext";
643 BindNativeFunction(env, objValue, "startAbility", moduleName, StartAbility);
644 BindNativeFunction(env, objValue, "openLink", moduleName, OpenLink);
645 BindNativeFunction(env, objValue, "startAbilityForResult", moduleName, StartAbilityForResult);
646 BindNativeFunction(env, objValue, "connectServiceExtensionAbility", moduleName, ConnectAbility);
647 BindNativeFunction(env, objValue, "disconnectServiceExtensionAbility", moduleName, DisconnectAbility);
648 BindNativeFunction(env, objValue, "terminateSelf", moduleName, TerminateSelf);
649 BindNativeFunction(env, objValue, "terminateSelfWithResult", moduleName, TerminateSelfWithResult);
650 BindNativeFunction(env, objValue, "backToCallerAbilityWithResult", moduleName, BackToCallerAbilityWithResult);
651 BindNativeFunction(env, objValue, "startAbilityAsCaller", moduleName, StartAbilityAsCaller);
652 BindNativeFunction(env, objValue, "startAbilityWithAccount", moduleName, StartAbilityWithAccount);
653 BindNativeFunction(env, objValue, "startAbilityByCall", moduleName, StartAbilityByCall);
654 BindNativeFunction(env, objValue, "startAbilityForResultWithAccount", moduleName,
655 StartAbilityForResultWithAccount);
656 BindNativeFunction(env, objValue, "startServiceExtensionAbility", moduleName, StartServiceExtensionAbility);
657 BindNativeFunction(env, objValue, "startServiceExtensionAbilityWithAccount", moduleName,
658 StartServiceExtensionAbilityWithAccount);
659 BindNativeFunction(env, objValue, "stopServiceExtensionAbility", moduleName, StopServiceExtensionAbility);
660 BindNativeFunction(env, objValue, "stopServiceExtensionAbilityWithAccount", moduleName,
661 StopServiceExtensionAbilityWithAccount);
662 BindNativeFunction(env, objValue, "connectServiceExtensionAbilityWithAccount", moduleName,
663 ConnectAbilityWithAccount);
664 BindNativeFunction(env, objValue, "restoreWindowStage", moduleName, RestoreWindowStage);
665 BindNativeFunction(env, objValue, "isTerminating", moduleName, IsTerminating);
666 BindNativeFunction(env, objValue, "startRecentAbility", moduleName, StartRecentAbility);
667 BindNativeFunction(env, objValue, "requestDialogService", moduleName, RequestDialogService);
668 BindNativeFunction(env, objValue, "reportDrawnCompleted", moduleName, ReportDrawnCompleted);
669 BindNativeFunction(env, objValue, "setMissionContinueState", moduleName, SetMissionContinueState);
670 BindNativeFunction(env, objValue, "startAbilityByType", moduleName, StartAbilityByType);
671 BindNativeFunction(env, objValue, "requestModalUIExtension", moduleName, RequestModalUIExtension);
672 BindNativeFunction(env, objValue, "openAtomicService", moduleName, OpenAtomicService);
673 BindNativeFunction(env, objValue, "showAbility", moduleName, ShowAbility);
674 BindNativeFunction(env, objValue, "hideAbility", moduleName, HideAbility);
675 BindNativeFunction(env, objValue, "setRestoreEnabled", moduleName, SetRestoreEnabled);
676
677 #ifdef SUPPORT_GRAPHICS
678 BindNativeFunction(env, objValue, "setMissionLabel", moduleName, SetMissionLabel);
679 BindNativeFunction(env, objValue, "setMissionIcon", moduleName, SetMissionIcon);
680 BindNativeFunction(env, objValue, "moveAbilityToBackground", moduleName, MoveAbilityToBackground);
681 #endif
682 return objValue;
683 }
684 } // namespace AbilityRuntime
685 } // namespace OHOS
686