1 /*
2 * Copyright (c) 2025 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_live_form_extension_context.h"
17 #include "js_ui_extension_context.h"
18 #include "js_error_utils.h"
19 #include "js_runtime.h"
20 #include "js_runtime_utils.h"
21 #include "napi_common_util.h"
22 #include "napi_common_want.h"
23 #include "element_name.h"
24 #include "fms_log_wrapper.h"
25 #include "form_constants.h"
26 #include "form_errors.h"
27
28 namespace OHOS {
29 namespace AbilityRuntime {
30 using namespace OHOS::AppExecFwk;
31 namespace {
32 constexpr size_t ARGC_TWO = 2;
33 } // namespace
34
Finalizer(napi_env env,void * data,void * hint)35 void JsLiveFormExtensionContext::Finalizer(napi_env env, void *data, void *hint)
36 {
37 HILOG_DEBUG("called");
38 std::unique_ptr<JsLiveFormExtensionContext>(static_cast<JsLiveFormExtensionContext *>(data));
39 }
40
CreateJsLiveFormExtensionContext(napi_env env,std::shared_ptr<LiveFormExtensionContext> context)41 napi_value JsLiveFormExtensionContext::CreateJsLiveFormExtensionContext(
42 napi_env env, std::shared_ptr<LiveFormExtensionContext> context)
43 {
44 HILOG_DEBUG("begin");
45 std::shared_ptr<OHOS::AppExecFwk::AbilityInfo> abilityInfo = nullptr;
46 if (context) {
47 abilityInfo = context->GetAbilityInfo();
48 }
49
50 napi_value objValue = JsUIExtensionContext::CreateJsUIExtensionContext(env, context);
51 std::unique_ptr<JsLiveFormExtensionContext> jsContext = std::make_unique<JsLiveFormExtensionContext>(context);
52 napi_status status = napi_wrap(env, objValue, jsContext.release(), Finalizer, nullptr, nullptr);
53 if (status != napi_ok) {
54 HILOG_ERROR("Failed to do napi wrap");
55 }
56
57 const char *moduleName = "JsLiveFormExtensionContext";
58 BindNativeFunction(env, objValue, "setWindowBackgroundColor", moduleName, SetWindowBackgroundColor);
59 BindNativeFunction(env, objValue, "startAbilityByLiveForm", moduleName, StartAbilityByLiveForm);
60
61 return objValue;
62 }
63
SetWindowBackgroundColor(napi_env env,napi_callback_info info)64 napi_value JsLiveFormExtensionContext::SetWindowBackgroundColor(napi_env env, napi_callback_info info)
65 {
66 HILOG_DEBUG("called");
67 GET_NAPI_INFO_AND_CALL(env, info, JsLiveFormExtensionContext, OnSetWindowBackgroundColor);
68 }
69
StartAbilityByLiveForm(napi_env env,napi_callback_info info)70 napi_value JsLiveFormExtensionContext::StartAbilityByLiveForm(napi_env env, napi_callback_info info)
71 {
72 HILOG_DEBUG("called");
73 GET_NAPI_INFO_AND_CALL(env, info, JsLiveFormExtensionContext, OnStartAbilityByLiveForm);
74 }
75
OnSetWindowBackgroundColor(napi_env env,NapiCallbackInfo & info)76 napi_value JsLiveFormExtensionContext::OnSetWindowBackgroundColor(napi_env env, NapiCallbackInfo &info)
77 {
78 HILOG_DEBUG("called");
79 NapiAsyncTask::CompleteCallback complete =
80 [weak = context_](napi_env env, NapiAsyncTask &task, int32_t status) {
81 HILOG_DEBUG("OnSetWindowBackgroundColor begin");
82 auto context = weak.lock();
83 if (!context) {
84 HILOG_ERROR("null context");
85 task.Reject(env, CreateJsError(env, static_cast<int32_t>(ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR),
86 FormErrors::GetInstance().GetErrorMsgByExternalErrorCode(ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR)));
87 return;
88 }
89
90 bool isSuccess = context->SetWindowBackgroundColor();
91 if (!isSuccess) {
92 HILOG_ERROR("SetWindowBackgroundColor failed");
93 task.Reject(env, CreateJsError(env, static_cast<int32_t>(ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR),
94 FormErrors::GetInstance().GetErrorMsgByExternalErrorCode(ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR)));
95 return;
96 }
97
98 task.ResolveWithNoError(env, CreateJsUndefined(env));
99 };
100
101 napi_value result = nullptr;
102 NapiAsyncTask::ScheduleHighQos("JsLiveFormExtensionContext OnSetWindowBackgroundColor", env,
103 CreateAsyncTaskWithLastParam(env, nullptr, nullptr, std::move(complete), &result));
104 return result;
105 }
106
OnStartAbilityByLiveForm(napi_env env,NapiCallbackInfo & info)107 napi_value JsLiveFormExtensionContext::OnStartAbilityByLiveForm(napi_env env, NapiCallbackInfo &info)
108 {
109 HILOG_DEBUG("called: param size: %{public}d", static_cast<int32_t>(info.argc));
110 if (info.argc != ARGC_TWO) {
111 HILOG_ERROR("argc is not two");
112 ThrowError(env, static_cast<int32_t>(ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR),
113 FormErrors::GetInstance().GetErrorMsgByExternalErrorCode(ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR));
114 return CreateJsUndefined(env);
115 }
116
117 auto context = context_.lock();
118 if (context == nullptr) {
119 HILOG_ERROR("Context is nullptr");
120 ThrowError(env, static_cast<int32_t>(ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR),
121 FormErrors::GetInstance().GetErrorMsgByExternalErrorCode(ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR));
122 return CreateJsUndefined(env);
123 }
124
125 AAFwk::Want want;
126 OHOS::AppExecFwk::UnwrapWant(env, info.argv[0], want);
127 std::string formId;
128 if (!AppExecFwk::UnwrapStringFromJS2(env, info.argv[1], formId)) {
129 HILOG_ERROR("parse param failed");
130 return CreateJsUndefined(env);
131 }
132 NapiAsyncTask::CompleteCallback complete =
133 [weak = context_, want, formId](napi_env env, NapiAsyncTask &task, int32_t status) {
134 HILOG_DEBUG("OnStartAbilityByLiveForm begin");
135 auto context = weak.lock();
136 if (!context) {
137 HILOG_ERROR("Context is nullptr");
138 task.Reject(env, CreateJsError(env, static_cast<int32_t>(ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR),
139 FormErrors::GetInstance().GetErrorMsgByExternalErrorCode(ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR)));
140 return;
141 }
142
143 ErrCode errCode = context->StartAbilityByFms(want, formId);
144 if (errCode != ERR_OK) {
145 HILOG_ERROR("StartAbilityByFms failed");
146 task.Reject(env, CreateJsError(env, static_cast<int32_t>(ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR),
147 FormErrors::GetInstance().GetErrorMsgByExternalErrorCode(ERR_FORM_EXTERNAL_FUNCTIONAL_ERROR)));
148 return;
149 }
150
151 task.ResolveWithNoError(env, CreateJsUndefined(env));
152 };
153
154 napi_value result = nullptr;
155 NapiAsyncTask::ScheduleHighQos("JsLiveFormExtensionContext OnStartAbilityByLiveForm", env,
156 CreateAsyncTaskWithLastParam(env, nullptr, nullptr, std::move(complete), &result));
157
158 return result;
159 }
160 } // namespace AbilityRuntime
161 } // namespace OHOS