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