* Copyright (c) 2025 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "customdialogexample.h"
#include <arkui/native_dialog.h>
#include <arkui/native_interface.h>
#include <arkui/native_node.h>
#include <arkui/native_type.h>
#include <js_native_api_types.h>
#include <mutex>
namespace ArkUICapiTest {
static ArkUI_CustomDialogOptions *g_dialogOption = nullptr;
static ArkUI_NativeDialogHandle globalCustomDialog = nullptr;
static ArkUI_NativeDialogAPI_3* g_dialogAPI3 = nullptr;
static int32_t g_dialogIdState = 0;
static std::mutex g_dialogIdMutex;
CallBackData CustomDialogTest::callBackData;
static bool g_isEventState = false;
static bool g_isOpenDialog = false;
static bool g_isOpenController = false;
napi_env CustomDialogTest::g_env = nullptr;
std::vector<napi_ref> CustomDialogTest::g_callback_refs{};
enum CustomDialogSettingType {
BACKGROUND_COLOR = 1,
CORNER_RADIUS,
BORDER_COLORS,
BORDER_STYLE,
BACKBOARD_SHADOW,
BACKBOARD_CUSTOM_SHADOW,
BACKGROUND_BLUR_STYLE,
ALIGN_MODE,
MODAL_MODE,
AUTO_CANCEL,
SUBWINDOW_MODE,
MASK,
KEYBOARD_AVOID_MODE,
HOVER_MODE_ENABLED,
HOVER_MODE_AREA,
BACKGROUND_BLUR_STYLE_OPTIONS,
BACKGROUND_EFFECT,
LEVEL_MODE,
LEVEL_UNIQUE_ID,
IMMERSIVE_MODE,
SHOULD_BLOCK_DISMISS,
};
enum ControllerAttributeType {
NATIVE_BACKGROUND_COLOR = 1,
NATIVE_CORNER_RADIUS,
NATIVE_BORDER_COLORS,
NATIVE_BORDER_STYLE,
NATIVE_BACKBOARD_SHADOW,
NATIVE_BACKBOARD_CUSTOM_SHADOW,
NATIVE_BACKGROUND_BLUR_STYLE,
NATIVE_HOVER_MODE_ENABLED,
NATIVE_HOVER_MODE_AREA,
NATIVE_FOCUSABLE,
NATIVE_BACKGROUND_BLUR_STYLE_OPTIONS,
NATIVE_BACKGROUND_EFFECT,
NATIVE_CONTENT_ALIGNMENT,
NATIVE_RESET_CONTENT_ALIGNMENT,
NATIVE_MODAL_MODE,
NATIVE_AUTO_CANCEL,
NATIVE_MASK,
NATIVE_COLUMN_COUNT,
NATIVE_CUSTOM_STYLE,
NATIVE_CUSTOM_ANIMATION,
NATIVE_KEYBOARD_AVOID_MODE,
NATIVE_LEVEL_MODE,
NATIVE_LEVEL_UNIQUE_ID,
NATIVE_IMMERSIVE_MODE,
NATIVE_LEVEL_ORDER,
NATIVE_REGISTER_ON_WILL_DISMISS,
NATIVE_REGISTER_ON_WILL_DISMISS_WITH_USER_DATA,
};
static void OnWillDismiss(ArkUI_DialogDismissEvent *event)
{
ArkUI_AttributeItem id_item = {};
id_item.string = "willDismiss";
CustomDialogTest::callBackData.willDismiss = id_item.string;
OH_ArkUI_DialogDismissEvent_SetShouldBlockDismiss(event, g_isEventState);
OH_ArkUI_DialogDismissEvent_GetUserData(event);
OH_ArkUI_DialogDismissEvent_GetDismissReason(event);
}
void CallCallbackMethodWithString(napi_env env, const char *methodName, const std::string &value)
{
if (CustomDialogTest::g_callback_refs.empty()) {
return;
}
for (auto &ref : CustomDialogTest::g_callback_refs) {
if (ref == nullptr) {
continue;
}
napi_value cbObj = nullptr;
if (napi_get_reference_value(env, ref, &cbObj) != napi_ok || cbObj == nullptr) {
continue;
}
napi_value method = nullptr;
if (napi_get_named_property(env, cbObj, methodName, &method) != napi_ok) {
continue;
}
napi_valuetype methodType;
if (napi_typeof(env, method, &methodType) != napi_ok || methodType != napi_function) {
continue;
}
napi_value argv[1];
napi_create_string_utf8(env, value.c_str(), NAPI_AUTO_LENGTH, &argv[0]);
napi_value result;
napi_call_function(env, cbObj, method, 1, argv, &result);
}
}
void ShowDialogState(ArkUI_DialogState state)
{
std::string resultStr;
switch (state) {
case DIALOG_UNINITIALIZED:
resultStr = "DIALOG_UNINITIALIZED";
break;
case DIALOG_INITIALIZED:
resultStr = "DIALOG_INITIALIZED";
break;
case DIALOG_APPEARING:
resultStr = "DIALOG_APPEARING";
break;
case DIALOG_APPEARED:
resultStr = "DIALOG_APPEARED";
break;
case DIALOG_DISAPPEARING:
resultStr = "DIALOG_DISAPPEARING";
break;
case DIALOG_DISAPPEARED:
resultStr = "DIALOG_DISAPPEARED";
break;
default:
break;
}
CallCallbackMethodWithString(CustomDialogTest::g_env, "fromNapiCallWithStringParam", resultStr);
}
static void OnWillAppear(void *userData)
{
ArkUI_AttributeItem id_item = {};
id_item.string = "willAppear";
CustomDialogTest::callBackData.willAppear = id_item.string;
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest", "OnWillAppear");
}
static void OnDidAppear(void *userData)
{
ArkUI_AttributeItem id_item = {};
id_item.string = "didAppear";
CustomDialogTest::callBackData.didAppear = id_item.string;
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest", "OnDidAppear");
ArkUI_DialogState state = DIALOG_UNINITIALIZED;
int32_t result = OH_ArkUI_CustomDialog_GetState(reinterpret_cast<ArkUI_NativeDialogHandle>(g_dialogOption), &state);
CallCallbackMethodWithString(CustomDialogTest::g_env, "fromNapiCallWithStringParam", "DIALOG_APPEARED");
}
static void OnWillDisappear(void *userData)
{
ArkUI_AttributeItem id_item = {};
id_item.string = "willDisappear";
CustomDialogTest::callBackData.willDisappear = id_item.string;
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest", "OnWillDisappear");
}
static void OnDidDisappear(void *userData)
{
ArkUI_AttributeItem id_item = {};
id_item.string = "didDisappear";
CustomDialogTest::callBackData.didDisappear = id_item.string;
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest", "OnDidDisappear");
ArkUI_DialogState state = DIALOG_UNINITIALIZED;
int32_t result = OH_ArkUI_CustomDialog_GetState(reinterpret_cast<ArkUI_NativeDialogHandle>(g_dialogOption), &state);
CallCallbackMethodWithString(CustomDialogTest::g_env, "fromNapiCallWithStringParam", "DIALOG_DISAPPEARED");
}
void MyCustomCallback(int32_t dialogId)
{
std::lock_guard<std::mutex> lock(g_dialogIdMutex);
g_dialogIdState = dialogId;
}
void MyCustomCallback2(int32_t dialogId)
{
std::lock_guard<std::mutex> lock(g_dialogIdMutex);
g_dialogIdState = dialogId;
}
void MyOnClose(ArkUI_NodeEvent *event)
{
if (g_dialogOption) {
std::lock_guard<std::mutex> lock(g_dialogIdMutex);
OH_ArkUI_CustomDialog_CloseDialog(g_dialogIdState);
}
}
ArkUI_NodeHandle CreateStyledButton(ArkUI_NativeNodeAPI_1 *nodeAPI,
ArkUI_NodeHandle parent,
const char *text,
void (*eventReceiver)(ArkUI_NodeEvent *callback),
int32_t eventId = 0)
{
if (!nodeAPI) {
return nullptr;
}
const char *id = text;
auto button = nodeAPI->createNode(ARKUI_NODE_BUTTON);
button = CustomDialogUtils::SetButton(nodeAPI, button, id, text);
int32_t ret = 0;
ret = nodeAPI->registerNodeEvent(button, NODE_ON_CLICK, eventId, nullptr);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"CreateStyledButton registerNodeEvent failed, ret = %{public}d ", ret);
}
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"CreateStyledButton registerNodeEvent failed, ret = %{public}d ", ret);
}
ret = nodeAPI->addNodeEventReceiver(button, eventReceiver);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"CreateStyledButton addNodeEventReceiver failed, ret = %{public}d ", ret);
}
nodeAPI->addChild(parent, button);
return button;
}
int32_t SetDialogBackgroundColor(uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_SetBackgroundColor(g_dialogOption, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetBackgroundColor failed, ret = %{public}d", ret);
}
ret = OH_ArkUI_CustomDialog_UpdateDialog(g_dialogOption, MyCustomCallback2);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_UpdateDialog failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetDialogBackboardShadow()
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_SetShadow(g_dialogOption, ARKUI_SHADOW_STYLE_OUTER_DEFAULT_LG);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetShadow failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetDialogBackboardCustomShadow()
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ArkUI_NumberValue custom_shadow_value[] = {
{.f32 = 50}, {.i32 = {}}, {.f32 = {}}, {.f32 = {}},
{.i32 = {}}, {.u32 = COLOR_RED}, {.u32 = PARAM_200}
};
ArkUI_AttributeItem custom_shadow_item = {
custom_shadow_value, sizeof(custom_shadow_value) / sizeof(ArkUI_NumberValue)
};
ret = OH_ArkUI_CustomDialog_SetCustomShadow(g_dialogOption, &custom_shadow_item);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetCustomShadow failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetDialogBorderColors(uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_SetBorderColor(g_dialogOption, nodeValue, nodeValue, nodeValue, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetBorderColor failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetDialogBorderStyle(uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
int32_t borderStyle = nodeValue;
ret = OH_ArkUI_CustomDialog_SetBorderStyle(g_dialogOption, borderStyle, borderStyle, borderStyle, borderStyle);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetBorderStyle failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetDialogCornerRadius(uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_SetCornerRadius(g_dialogOption, nodeValue, nodeValue, nodeValue, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetCornerRadius failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetDialogBackgroundBlurStyle(uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_SetBackgroundBlurStyle(g_dialogOption, (ArkUI_BlurStyle)nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetBackgroundBlurStyle failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetDialogAlignment(uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_SetAlignment(g_dialogOption, static_cast<ArkUI_Alignment>(nodeValue), 0, PARAM_200);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetAlignment failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetDialogModalMode(uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_SetModalMode(g_dialogOption, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetModalMode failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetDialogAutoCancel(uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_SetAutoCancel(g_dialogOption, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetAutoCancel failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetDialogSubwindowMode(uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_SetSubwindowMode(g_dialogOption, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetSubwindowMode failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetDialogMask()
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ArkUI_Rect maskRect = {PARAM_0, PARAM_0, PARAM_500, PARAM_500};
ret = OH_ArkUI_CustomDialog_SetMask(g_dialogOption, COLOR_RED, &maskRect);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetMask failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetDialogKeyboardAvoidMode(uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_SetKeyboardAvoidMode(g_dialogOption, (ArkUI_KeyboardAvoidMode)nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetKeyboardAvoidMode failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetDialogHoverModeEnabled(uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_SetHoverModeEnabled(g_dialogOption, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetHoverModeEnabled failed, ret = %{public}d", ret);
}
ret = OH_ArkUI_CustomDialog_SetHoverModeArea(g_dialogOption, ARKUI_HOVER_MODE_AREA_TYPE_BOTTOM);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetHoverModeArea failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetDialogHoverModeArea(uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_SetHoverModeEnabled(g_dialogOption, true);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetHoverModeEnabled failed, ret = %{public}d", ret);
}
ret = OH_ArkUI_CustomDialog_SetHoverModeArea(g_dialogOption, (ArkUI_HoverModeAreaType)nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetHoverModeArea failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetDialogBackgroundBlurStyleOptions()
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
ArkUI_NumberValue blurValues[] = {
{.i32 = ARKUI_COLOR_MODE_LIGHT},
{.i32 = ARKUI_ADAPTIVE_COLOR_AVERAGE},
{.f32 = PARAM_1},
{.u32 = PARAM_20},
{.u32 = PARAM_20},
{.i32 = ARKUI_BLUR_STYLE_ACTIVE_POLICY_ALWAYS_ACTIVE},
{.u32 = COLOR_RED}
};
ArkUI_AttributeItem blurItem = {
blurValues,
sizeof(blurValues) / sizeof(ArkUI_NumberValue)
};
int32_t ret = OH_ArkUI_CustomDialog_SetBackgroundBlurStyleOptions(g_dialogOption, &blurItem);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetBackgroundBlurStyleOptions failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetDialogBackgroundEffect()
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
ArkUI_NumberValue effectValues[] = {
{.f32 = 0}, {.f32 = 0}, {.f32 = 0.0001},
{.u32 = 0x66FFFFFF}, {.i32 = 0}, {.u32 = PARAM_300},
{.u32 = PARAM_300}, {.i32 = 1}, {.u32 = 0x00FF0000}
};
ArkUI_AttributeItem effectItem = {
effectValues,
sizeof(effectValues) / sizeof(ArkUI_NumberValue)
};
int32_t ret = OH_ArkUI_CustomDialog_SetBackgroundEffect(g_dialogOption, &effectItem);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetBackgroundEffect failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetDialogLevelMode(uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest", "SetDialogLevelMode");
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_SetLevelMode(g_dialogOption, (ArkUI_LevelMode)nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetLevelMode failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetDialogLevelUniqueId(uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_SetLevelUniqueId(g_dialogOption, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetLevelUniqueId failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetDialogImmersiveMode(uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_SetImmersiveMode(g_dialogOption, (ArkUI_ImmersiveMode)nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetImmersiveMode failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetDialogShouldBlockDismiss(ArkUI_NodeHandle contentNode, uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
g_isEventState = nodeValue;
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_RegisterOnWillDismissCallback(g_dialogOption, contentNode, OnWillDismiss);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_RegisterOnWillDismissCallback failed, ret = %{public}d", ret);
}
return ret;
}
int32_t SetCustomDialogProperties2(ArkUI_NodeHandle contentNode, int32_t nodeType, uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
CustomDialogSettingType settingType = static_cast<CustomDialogSettingType>(nodeType);
switch (settingType) {
case CustomDialogSettingType::MASK:
ret = SetDialogMask();
break;
case CustomDialogSettingType::KEYBOARD_AVOID_MODE:
ret = SetDialogKeyboardAvoidMode(nodeValue);
break;
case CustomDialogSettingType::HOVER_MODE_ENABLED:
ret = SetDialogHoverModeEnabled(nodeValue);
break;
case CustomDialogSettingType::HOVER_MODE_AREA:
ret = SetDialogHoverModeArea(nodeValue);
break;
case CustomDialogSettingType::BACKGROUND_BLUR_STYLE_OPTIONS:
ret = SetDialogBackgroundBlurStyleOptions();
break;
case CustomDialogSettingType::BACKGROUND_EFFECT:
ret = SetDialogBackgroundEffect();
break;
case CustomDialogSettingType::LEVEL_MODE:
ret = SetDialogLevelMode(nodeValue);
break;
case CustomDialogSettingType::LEVEL_UNIQUE_ID:
ret = SetDialogLevelUniqueId(nodeValue);
break;
case CustomDialogSettingType::IMMERSIVE_MODE:
ret = SetDialogImmersiveMode(nodeValue);
break;
case CustomDialogSettingType::
SHOULD_BLOCK_DISMISS:
ret = SetDialogShouldBlockDismiss(contentNode, nodeValue);
break;
default:
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
return ret;
}
int32_t SetCustomDialogProperties(ArkUI_NodeHandle contentNode, int32_t nodeType, uint32_t nodeValue)
{
if (!g_dialogOption) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
CustomDialogSettingType settingType = static_cast<CustomDialogSettingType>(nodeType);
switch (settingType) {
case CustomDialogSettingType::BACKGROUND_COLOR :
ret = SetDialogBackgroundColor(nodeValue);
break;
case CustomDialogSettingType::CORNER_RADIUS :
ret = SetDialogCornerRadius(nodeValue);
break;
case CustomDialogSettingType::BORDER_COLORS :
ret = SetDialogBorderColors(nodeValue);
break;
case CustomDialogSettingType::BORDER_STYLE:
ret = SetDialogBorderStyle(nodeValue);
break;
case CustomDialogSettingType::BACKBOARD_SHADOW:
ret = SetDialogBackboardShadow();
break;
case CustomDialogSettingType::BACKBOARD_CUSTOM_SHADOW:
ret = SetDialogBackboardCustomShadow();
break;
case CustomDialogSettingType::BACKGROUND_BLUR_STYLE:
ret = SetDialogBackgroundBlurStyle(nodeValue);
break;
case CustomDialogSettingType::ALIGN_MODE:
ret = SetDialogAlignment(nodeValue);
break;
case CustomDialogSettingType::MODAL_MODE:
ret = SetDialogModalMode(nodeValue);
break;
case CustomDialogSettingType::AUTO_CANCEL:
ret = SetDialogAutoCancel(nodeValue);
break;
case CustomDialogSettingType::SUBWINDOW_MODE:
ret = SetDialogSubwindowMode(nodeValue);
break;
default:
ret = SetCustomDialogProperties2(contentNode, nodeType, nodeValue);
break;
}
return ret;
}
void SetDialogBasicStyle(ArkUI_CustomDialogOptions* controller)
{
if (!controller) {
return;
}
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_SetBorderWidth(controller, PARAM_2, PARAM_2, PARAM_2, PARAM_2,
ARKUI_LENGTH_METRIC_UNIT_VP);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetBorderWidth failed, ret = %{public}d", ret);
}
ret = OH_ArkUI_CustomDialog_SetWidth(controller, PARAM_300, ARKUI_LENGTH_METRIC_UNIT_VP);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetWidth failed, ret = %{public}d", ret);
}
ret = OH_ArkUI_CustomDialog_SetHeight(controller, PARAM_200, ARKUI_LENGTH_METRIC_UNIT_VP);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_SetHeight failed, ret = %{public}d", ret);
}
}
void RegisterDialogCallbacks(ArkUI_CustomDialogOptions* controller, ArkUI_NodeHandle contentNode)
{
if (!controller) {
return;
}
int32_t ret = 0;
ret = OH_ArkUI_CustomDialog_RegisterOnWillAppearCallback(controller, contentNode, OnWillAppear);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_RegisterOnWillAppearCallback failed, ret = %{public}d", ret);
}
ret = OH_ArkUI_CustomDialog_RegisterOnDidAppearCallback(controller, contentNode, OnDidAppear);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_RegisterOnDidAppearCallback failed, ret = %{public}d", ret);
}
ret = OH_ArkUI_CustomDialog_RegisterOnWillDisappearCallback(controller, contentNode, OnWillDisappear);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_RegisterOnWillDisappearCallback failed, ret = %{public}d", ret);
}
ret = OH_ArkUI_CustomDialog_RegisterOnDidDisappearCallback(controller, contentNode, OnDidDisappear);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"OH_ArkUI_CustomDialog_RegisterOnDidDisappearCallback failed, ret = %{public}d", ret);
}
}
void InitDialogOptions(ArkUI_CustomDialogOptions* controller, ArkUI_NodeHandle contentNode)
{
if (!controller) {
return;
}
SetDialogBasicStyle(controller);
RegisterDialogCallbacks(controller, contentNode);
}
bool CreateCustomDialog()
{
ArkUI_NativeNodeAPI_1 *nodeAPI = nullptr;
OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI);
if (!nodeAPI) {
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Error", "nodeAPI is null");
return false;
}
auto column = nodeAPI->createNode(ARKUI_NODE_COLUMN);
if (!column) {
return false;
}
auto dialogController = OH_ArkUI_CustomDialog_CreateOptions(column);
if (!dialogController) {
return false;
}
g_dialogOption = dialogController;
ArkUI_DialogState state = DIALOG_UNINITIALIZED;
OH_ArkUI_CustomDialog_GetState(reinterpret_cast<ArkUI_NativeDialogHandle>(g_dialogOption), &state);
ShowDialogState(state);
InitDialogOptions(g_dialogOption, column);
CreateStyledButton(nodeAPI, column, "Close Dialog", MyOnClose);
g_isOpenDialog = true;
return true;
}
int32_t CustomDialogTest::SetCustomDialogDialogAttribute(int32_t nodeType, uint32_t nodeValue)
{
ArkUI_DialogState state = DIALOG_UNINITIALIZED;
int32_t result = OH_ArkUI_CustomDialog_GetState(reinterpret_cast<ArkUI_NativeDialogHandle>(g_dialogOption), &state);
ShowDialogState(state);
ArkUI_NodeHandle column;
if (!g_isOpenDialog && !g_dialogOption) {
bool ret = CreateCustomDialog();
if (!ret) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
}
result = SetCustomDialogProperties(column, nodeType, nodeValue);
return result;
}
static void CloseApplication()
{
std::lock_guard<std::mutex> lock(g_dialogIdMutex);
if (globalCustomDialog) {
g_dialogAPI3->nativeDialogAPI1.dispose(globalCustomDialog);
} else {
OH_ArkUI_CustomDialog_DisposeOptions(g_dialogOption);
}
}
napi_value CustomDialogTest::SetCustomDialog(napi_env env, napi_callback_info info)
{
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest", "customDialogAttrsTest");
size_t argc = 2;
napi_value argv[2];
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
if (argc < 2) {
napi_throw_error(env, nullptr, "Expected 2 arguments: nodeType (string) and nodeValue (number)");
return nullptr;
}
int32_t nodeType;
int status = napi_get_value_int32(env, argv[0], &nodeType);
if (status != napi_ok) {
napi_throw_type_error(env, nullptr, "nodeValue must be a number");
return nullptr;
}
uint32_t nodeValue;
status = napi_get_value_uint32(env, argv[1], &nodeValue);
if (status != napi_ok) {
napi_throw_type_error(env, nullptr, "nodeValue must be a number");
return nullptr;
}
g_env = env;
int32_t result = SetCustomDialogDialogAttribute(nodeType, nodeValue);
napi_value jsResult;
napi_create_int32(env, result, &jsResult);
return jsResult;
}
napi_value CustomDialogTest::CloseDialog(napi_env env, napi_callback_info info)
{
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest", "CloseDialog");
CloseApplication();
napi_value exports;
if (napi_create_object(env, &exports) != napi_ok) {
return nullptr;
}
return exports;
}
napi_value CustomDialogTest::CloseCustomDialog(napi_env env, napi_callback_info info)
{
if (g_dialogOption) {
std::lock_guard<std::mutex> lock(g_dialogIdMutex);
OH_ArkUI_CustomDialog_CloseDialog(g_dialogIdState);
g_dialogOption = nullptr;
ArkUI_DialogState state = DIALOG_UNINITIALIZED;
OH_ArkUI_CustomDialog_GetState(reinterpret_cast<ArkUI_NativeDialogHandle>(g_dialogOption), &state);
ShowDialogState(state);
g_isOpenDialog = false;
}
napi_value exports;
if (napi_create_object(env, &exports) != napi_ok) {
return nullptr;
}
return exports;
}
napi_value CustomDialogTest::OpenCustomDialog(napi_env env, napi_callback_info info)
{
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest", "CloseDialog");
if (!g_isOpenDialog && !g_dialogOption) {
bool ret = CreateCustomDialog();
if (!ret) {
return nullptr;
}
}
if (g_dialogOption) {
OH_ArkUI_CustomDialog_OpenDialog(g_dialogOption, MyCustomCallback);
}
napi_value exports;
if (napi_create_object(env, &exports) != napi_ok) {
return nullptr;
}
return exports;
}
napi_value CustomDialogTest::NAPI_Global_setNapiCallback(napi_env env, napi_callback_info info)
{
size_t argc = 1;
napi_value args[1] = { nullptr };
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
if (argc < 1 || args[0] == nullptr) {
napi_value undefinedRet;
napi_get_undefined(env, &undefinedRet);
return undefinedRet;
}
napi_valuetype valueType;
napi_typeof(env, args[0], &valueType);
if (valueType != napi_object) {
napi_value undefinedRet;
napi_get_undefined(env, &undefinedRet);
return undefinedRet;
}
napi_ref ref = nullptr;
napi_create_reference(env, args[0], 1, &ref);
if (ref != nullptr) {
CustomDialogTest::g_callback_refs.clear();
CustomDialogTest::g_callback_refs.push_back(ref);
}
napi_value undefinedRet;
napi_get_undefined(env, &undefinedRet);
return undefinedRet;
}
void RegisterDialogControllerCallbacks()
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return;
}
int32_t ret = 0;
ret = g_dialogAPI3->registerOnWillAppear(globalCustomDialog, nullptr, OnWillAppear);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"registerOnWillAppear failed, ret = %{public}d", ret);
}
ret = g_dialogAPI3->registerOnDidAppear(globalCustomDialog, nullptr, OnDidAppear);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"registerOnDidAppear failed, ret = %{public}d", ret);
}
ret = g_dialogAPI3->registerOnWillDisappear(globalCustomDialog, nullptr, OnWillDisappear);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"registerOnWillDisappear failed, ret = %{public}d", ret);
}
ret = g_dialogAPI3->registerOnDidDisappear(globalCustomDialog, nullptr, OnDidDisappear);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"registerOnDidDisappear failed, ret = %{public}d", ret);
}
}
static void SetDialogStyles()
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return;
}
int32_t ret = 0;
ret = g_dialogAPI3->setBorderWidth(globalCustomDialog, PARAM_2, PARAM_2, PARAM_2, PARAM_2,
ARKUI_LENGTH_METRIC_UNIT_PX);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"SetDialogStyles setBorderWidth failed, ret = %{public}d ", ret);
}
ret = g_dialogAPI3->setWidth(globalCustomDialog, PARAM_300, ARKUI_LENGTH_METRIC_UNIT_VP);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"SetDialogStyles setWidth failed, ret = %{public}d ", ret);
}
ret = g_dialogAPI3->setHeight(globalCustomDialog, PARAM_200, ARKUI_LENGTH_METRIC_UNIT_VP);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"SetDialogStyles setHeight failed, ret = %{public}d ", ret);
}
RegisterDialogControllerCallbacks();
}
int32_t SetNativeDialogBackgroundColor(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = g_dialogAPI3->nativeDialogAPI1.setBackgroundColor(globalCustomDialog, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setBackgroundColor failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogCornerRadius(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = g_dialogAPI3->nativeDialogAPI1.setCornerRadius(globalCustomDialog, nodeValue, nodeValue,
nodeValue, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setCornerRadius failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogBorderColor(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = g_dialogAPI3->setBorderColor(globalCustomDialog, nodeValue, nodeValue, nodeValue, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setBorderColor failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogBorderStyle(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = g_dialogAPI3->setBorderStyle(globalCustomDialog, nodeValue, nodeValue, nodeValue, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setBorderStyle failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogShadow()
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = g_dialogAPI3->setShadow(globalCustomDialog, ARKUI_SHADOW_STYLE_OUTER_DEFAULT_LG);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setShadow failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogCustomShadow()
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
ArkUI_NumberValue custom_shadow_value[] = {
{.f32 = 50}, {.i32 = {}}, {.f32 = {}}, {.f32 = {}},
{.i32 = {}}, {.u32 = COLOR_RED}, {.u32 = PARAM_200}
};
ArkUI_AttributeItem custom_shadow_item = {
custom_shadow_value, sizeof(custom_shadow_value) / sizeof(ArkUI_NumberValue)
};
int32_t ret = g_dialogAPI3->setCustomShadow(globalCustomDialog, &custom_shadow_item);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setCustomShadow failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogBackgroundBlurStyle()
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = g_dialogAPI3->setBackgroundBlurStyle(globalCustomDialog, ARKUI_BLUR_STYLE_COMPONENT_ULTRA_THICK);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setBackgroundBlurStyle failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogEnableHoverMode(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = g_dialogAPI3->enableHoverMode(globalCustomDialog, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"enableHoverMode failed, ret = %{public}d ", ret);
}
ret = g_dialogAPI3->setHoverModeArea(globalCustomDialog, ARKUI_HOVER_MODE_AREA_TYPE_BOTTOM);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setHoverModeArea failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogFocusable(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ret = g_dialogAPI3->setFocusable(globalCustomDialog, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setFocusable failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogHoverModeArea(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = g_dialogAPI3->enableHoverMode(globalCustomDialog, true);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"enableHoverMode failed, ret = %{public}d ", ret);
}
ret = g_dialogAPI3->setHoverModeArea(globalCustomDialog, static_cast<ArkUI_HoverModeAreaType>(nodeValue));
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setHoverModeArea failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogBackgroundBlurStyleOptions()
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
ArkUI_NumberValue custom_BlurStyleOptions_value[] = {
{.i32 = ARKUI_COLOR_MODE_LIGHT}, {.i32 = ARKUI_ADAPTIVE_COLOR_AVERAGE},
{.f32 = 1}, {.u32 = PARAM_20}, {.u32 = PARAM_20},
{.i32 = ARKUI_BLUR_STYLE_ACTIVE_POLICY_ALWAYS_ACTIVE}, {.u32 = COLOR_RED}
};
ArkUI_AttributeItem custom_BlurStyleOptions_item = {
custom_BlurStyleOptions_value, sizeof(custom_BlurStyleOptions_value) / sizeof(ArkUI_NumberValue)
};
int32_t ret = g_dialogAPI3->setBackgroundBlurStyleOptions(globalCustomDialog, &custom_BlurStyleOptions_item);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setBackgroundBlurStyleOptions failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogSetupBackgroundEffect()
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
ArkUI_NumberValue effectValues[] = {
{.f32 = 0}, {.f32 = 0}, {.f32 = 0.0001},
{.u32 = 0x66FFFFFF}, {.i32 = 0}, {.u32 = PARAM_300},
{.u32 = PARAM_300}, {.i32 = 1}, {.u32 = 0x00FF0000}
};
ArkUI_AttributeItem effectItem = {
effectValues,
sizeof(effectValues) / sizeof(ArkUI_NumberValue)
};
int32_t ret = g_dialogAPI3->setBackgroundEffect(globalCustomDialog, &effectItem);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setBackgroundEffect failed, ret = %{public}d ", ret);
}
return ret;
}
napi_value CustomDialogTest::SetDialogController(napi_env env, napi_callback_info info)
{
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest", "customDialogAttrsTest");
size_t argc = 2;
napi_value argv[2];
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
if (argc < 2) {
napi_throw_error(env, nullptr, "Expected 2 arguments: nodeType (string) and nodeValue (number)");
return nullptr;
}
int32_t nodeType;
int status = napi_get_value_int32(env, argv[0], &nodeType);
if (status != napi_ok) {
napi_throw_type_error(env, nullptr, "nodeValue must be a number");
return nullptr;
}
uint32_t nodeValue;
status = napi_get_value_uint32(env, argv[1], &nodeValue);
if (status != napi_ok) {
napi_throw_type_error(env, nullptr, "nodeValue must be a number");
return nullptr;
}
g_env = env;
int32_t result = OnEventReceiveTestAPI(nodeType, nodeValue);
napi_value jsResult;
napi_create_int32(env, result, &jsResult);
return jsResult;
}
int32_t CustomDialogTest::SetDialogControllerAttribute(int32_t nodeType, uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
auto type = static_cast<ControllerAttributeType>(nodeType);
switch (type) {
case ControllerAttributeType::NATIVE_BACKGROUND_COLOR :
ret = SetNativeDialogBackgroundColor(nodeValue);
break;
case ControllerAttributeType::NATIVE_CORNER_RADIUS :
ret = SetNativeDialogCornerRadius(nodeValue);
break;
case ControllerAttributeType::NATIVE_BORDER_COLORS:
ret = SetNativeDialogBorderColor(nodeValue);
break;
case ControllerAttributeType::NATIVE_BORDER_STYLE:
ret = SetNativeDialogBorderStyle(nodeValue);
break;
case ControllerAttributeType::NATIVE_BACKBOARD_SHADOW:
ret = SetNativeDialogShadow();
break;
case ControllerAttributeType::NATIVE_BACKBOARD_CUSTOM_SHADOW:
ret = SetNativeDialogCustomShadow();
break;
case ControllerAttributeType::NATIVE_BACKGROUND_BLUR_STYLE:
ret = SetNativeDialogBackgroundBlurStyle();
break;
case ControllerAttributeType::NATIVE_HOVER_MODE_ENABLED:
ret = SetNativeDialogEnableHoverMode(nodeValue);
break;
case ControllerAttributeType::NATIVE_HOVER_MODE_AREA:
ret = SetNativeDialogHoverModeArea(nodeValue);
break;
case ControllerAttributeType::NATIVE_FOCUSABLE:
ret = SetNativeDialogFocusable(nodeValue);
break;
case ControllerAttributeType::NATIVE_BACKGROUND_BLUR_STYLE_OPTIONS:
ret = SetNativeDialogBackgroundBlurStyleOptions();
break;
case ControllerAttributeType::NATIVE_BACKGROUND_EFFECT:
ret = SetNativeDialogSetupBackgroundEffect();
break;
default:
ret = -1;
break;
}
return ret;
}
int32_t SetNativeDialogContenAlignment()
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = g_dialogAPI3->nativeDialogAPI1.setContentAlignment(globalCustomDialog, ARKUI_ALIGNMENT_TOP, 0, 0);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setContentAlignment failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogResetContentAlignment()
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = g_dialogAPI3->nativeDialogAPI1.resetContentAlignment(globalCustomDialog);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"resetContentAlignment failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogModalMode(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = g_dialogAPI3->nativeDialogAPI1.setModalMode(globalCustomDialog, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setModalMode failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogAutoCancel(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = g_dialogAPI3->nativeDialogAPI1.setAutoCancel(globalCustomDialog, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setAutoCancel failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogMask()
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
ArkUI_Rect maskRect = {PARAM_0, PARAM_0, PARAM_500, PARAM_500};
int32_t ret = g_dialogAPI3->nativeDialogAPI1.setMask(globalCustomDialog, COLOR_RED, &maskRect);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest", "setMask failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogCornerRadius()
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
float topLeft = PARAM_15;
float topRight = PARAM_15;
float bottomLeft = PARAM_15;
float bottomRight = PARAM_15;
int32_t ret =
g_dialogAPI3->nativeDialogAPI1.setCornerRadius(globalCustomDialog, topLeft, topRight, bottomLeft, bottomRight);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setCornerRadius failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogGridColumnCount(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = g_dialogAPI3->nativeDialogAPI1.setGridColumnCount(globalCustomDialog, (int32_t)nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setGridColumnCount failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogCustomStyle(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = g_dialogAPI3->nativeDialogAPI1.enableCustomStyle(globalCustomDialog, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"enableCustomStyle failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogCustomAnimation(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = g_dialogAPI3->nativeDialogAPI1.enableCustomAnimation(globalCustomDialog, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"enableCustomAnimation failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogKeyboardAvoidMode(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = g_dialogAPI3->setKeyboardAvoidMode(globalCustomDialog, (ArkUI_KeyboardAvoidMode)nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setKeyboardAvoidMode failed, ret = %{public}d ", ret);
}
if (nodeValue == 0) {
ret = g_dialogAPI3->nativeDialogAPI2.setKeyboardAvoidDistance(globalCustomDialog, PARAM_100,
ARKUI_LENGTH_METRIC_UNIT_VP);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setKeyboardAvoidDistance failed, ret = %{public}d ", ret);
}
}
return ret;
}
int32_t SetNativeDialogLevelMode(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = g_dialogAPI3->nativeDialogAPI2.setLevelMode(globalCustomDialog, (ArkUI_LevelMode)nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setLevelMode failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogLevelUniqueId()
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = g_dialogAPI3->nativeDialogAPI2.setLevelUniqueId(globalCustomDialog, 0);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setLevelUniqueId failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogImmersiveMode(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = g_dialogAPI3->nativeDialogAPI2.setImmersiveMode(globalCustomDialog, (ArkUI_ImmersiveMode)nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setImmersiveMode failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetNativeDialogLevelOrder(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = g_dialogAPI3->setLevelOrder(globalCustomDialog, nodeValue);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"setLevelOrder failed, ret = %{public}d ", ret);
}
return ret;
}
static bool CloseNativeDialogEventCallback(int32_t reason)
{
if (reason == DIALOG_DISMISS_BACK_PRESS) {
ArkUI_NativeDialogAPI_1 *dialogAPI = nullptr;
OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_DIALOG, ArkUI_NativeDialogAPI_1, dialogAPI);
if (globalCustomDialog) {
dialogAPI->close(globalCustomDialog);
}
return true;
} else if (reason == DIALOG_DISMISS_TOUCH_OUTSIDE) {
ArkUI_NativeDialogAPI_1 *dialogAPI = nullptr;
OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_DIALOG, ArkUI_NativeDialogAPI_1, dialogAPI);
if (globalCustomDialog) {
dialogAPI->close(globalCustomDialog);
}
return true;
} else if (reason == DIALOG_DISMISS_CLOSE_BUTTON) {
ArkUI_NativeDialogAPI_1 *dialogAPI = nullptr;
OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_DIALOG, ArkUI_NativeDialogAPI_1, dialogAPI);
if (globalCustomDialog) {
dialogAPI->close(globalCustomDialog);
}
return true;
} else if (reason == DIALOG_DISMISS_SLIDE_DOWN) {
ArkUI_NativeDialogAPI_1 *dialogAPI = nullptr;
OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_DIALOG, ArkUI_NativeDialogAPI_1, dialogAPI);
if (globalCustomDialog) {
dialogAPI->close(globalCustomDialog);
}
return true;
}
return true;
}
int32_t SetNativeDialogRegisterOnWillDismiss(uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
if (nodeValue) {
ret = g_dialogAPI3->nativeDialogAPI1.registerOnWillDismiss(globalCustomDialog, &CloseNativeDialogEventCallback);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"registerOnWillDismiss failed, ret = %{public}d ", ret);
}
}
return ret;
}
int32_t SetNativeDialogRegisterOnWillDismissWithUserData()
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
g_isEventState = true;
ret = g_dialogAPI3->nativeDialogAPI1.registerOnWillDismissWithUserData(globalCustomDialog, globalCustomDialog,
OnWillDismiss);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"registerOnWillDismissWithUserData failed, ret = %{public}d ", ret);
}
return ret;
}
int32_t SetDialogControllerAttribute3(int32_t nodeType, uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ControllerAttributeType type = static_cast<ControllerAttributeType>(nodeType);
switch (type) {
case ControllerAttributeType::NATIVE_LEVEL_MODE:
ret = SetNativeDialogLevelMode(nodeValue);
break;
case ControllerAttributeType::NATIVE_LEVEL_UNIQUE_ID:
ret = SetNativeDialogLevelUniqueId();
break;
case ControllerAttributeType::NATIVE_IMMERSIVE_MODE:
ret = SetNativeDialogImmersiveMode(nodeValue);
break;
case ControllerAttributeType::NATIVE_LEVEL_ORDER:
ret = SetNativeDialogLevelOrder(nodeValue);
break;
case ControllerAttributeType::NATIVE_REGISTER_ON_WILL_DISMISS:
ret = SetNativeDialogRegisterOnWillDismiss(nodeValue);
break;
case ControllerAttributeType::NATIVE_REGISTER_ON_WILL_DISMISS_WITH_USER_DATA:
ret = SetNativeDialogRegisterOnWillDismissWithUserData();
break;
default:
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
return ret;
}
int32_t SetDialogControllerAttribute2(int32_t nodeType, uint32_t nodeValue)
{
if (!g_dialogAPI3 || !globalCustomDialog) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
int32_t ret = 0;
ControllerAttributeType type = static_cast<ControllerAttributeType>(nodeType);
switch (type) {
case ControllerAttributeType::NATIVE_CONTENT_ALIGNMENT:
ret = SetNativeDialogContenAlignment();
break;
case ControllerAttributeType::
NATIVE_RESET_CONTENT_ALIGNMENT:
ret = SetNativeDialogResetContentAlignment();
break;
case ControllerAttributeType::NATIVE_MODAL_MODE:
ret = SetNativeDialogModalMode(nodeValue);
break;
case ControllerAttributeType::NATIVE_AUTO_CANCEL:
ret = SetNativeDialogAutoCancel(nodeValue);
break;
case ControllerAttributeType::NATIVE_MASK:
ret = SetNativeDialogMask();
break;
case ControllerAttributeType::NATIVE_CORNER_RADIUS :
ret = SetNativeDialogCornerRadius();
break;
case ControllerAttributeType::NATIVE_COLUMN_COUNT:
ret = SetNativeDialogGridColumnCount(nodeValue);
break;
case ControllerAttributeType::NATIVE_CUSTOM_STYLE:
ret = SetNativeDialogCustomStyle(nodeValue);
break;
case ControllerAttributeType::NATIVE_CUSTOM_ANIMATION:
ret = SetNativeDialogCustomAnimation(nodeValue);
break;
case ControllerAttributeType::NATIVE_KEYBOARD_AVOID_MODE:
ret = SetNativeDialogKeyboardAvoidMode(nodeValue);
break;
default:
ret = SetDialogControllerAttribute3(nodeType, nodeValue);
break;
}
return ret;
}
static void HandleDialogCloseEvent()
{
if (globalCustomDialog || g_dialogAPI3) {
int32_t ret = g_dialogAPI3->nativeDialogAPI1.removeContent(globalCustomDialog);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"HandleDialogCloseEvent removeContent failed, ret = %{public}d ", ret);
}
ret = g_dialogAPI3->nativeDialogAPI1.close(globalCustomDialog);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest",
"HandleDialogCloseEvent close failed, ret = %{public}d ", ret);
}
globalCustomDialog = nullptr;
g_dialogAPI3 = nullptr;
g_isOpenController = false;
}
}
static void NodeEventReceiver(ArkUI_NodeEvent* event)
{
int32_t eventId = OH_ArkUI_NodeEvent_GetTargetId(event);
if (eventId == ON_CLICK_EVENT_ID4) {
HandleDialogCloseEvent();
return;
}
}
static ArkUI_NodeHandle CreateButtonNode(ArkUI_NativeNodeAPI_1* nodeAPI)
{
auto button = nodeAPI->createNode(ARKUI_NODE_BUTTON);
ArkUI_AttributeItem closeText = {.string = "Close Dialog"};
nodeAPI->setAttribute(button, NODE_BUTTON_LABEL, &closeText);
ArkUI_AttributeItem id_item = {};
id_item.string = "button";
nodeAPI->setAttribute(button, NODE_ID, &id_item);
int32_t ret = nodeAPI->registerNodeEvent(button, NODE_ON_CLICK, ON_CLICK_EVENT_ID4, nullptr);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"CreateButtonNode registerNodeEvent failed, ret = %{public}d ", ret);
}
ret = nodeAPI->addNodeEventReceiver(button, NodeEventReceiver);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "CustomDialogTest",
"CreateButtonNode addNodeEventReceiver failed, ret = %{public}d ", ret);
}
return button;
}
bool CreateDialogController()
{
ArkUI_NativeNodeAPI_1 *nodeAPI = nullptr;
OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI);
g_dialogAPI3 = reinterpret_cast<ArkUI_NativeDialogAPI_3 *>(
OH_ArkUI_QueryModuleInterfaceByName(ARKUI_NATIVE_DIALOG, "ArkUI_NativeDialogAPI_3"));
if (!g_dialogAPI3 || !nodeAPI) {
return false;
}
auto column = nodeAPI->createNode(ARKUI_NODE_COLUMN);
if (!column) {
return false;
}
auto button = CreateButtonNode(nodeAPI);
if (!button) {
return false;
}
nodeAPI->addChild(column, button);
auto customDialog = g_dialogAPI3->nativeDialogAPI1.create();
if (!customDialog) {
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Error", "customDialog is null");
return false;
}
int32_t ret = g_dialogAPI3->nativeDialogAPI1.setContent(customDialog, column);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest", "setContent failed, ret = %{public}d ",
ret);
}
globalCustomDialog = customDialog;
ArkUI_DialogState state = DIALOG_UNINITIALIZED;
auto result = OH_ArkUI_CustomDialog_GetState(globalCustomDialog, &state);
ShowDialogState(state);
SetDialogStyles();
g_isOpenController = true;
return true;
}
int32_t CustomDialogTest::OnEventReceiveTestAPI(int32_t nodeType, uint32_t nodeValue)
{
ArkUI_DialogState state = DIALOG_UNINITIALIZED;
int32_t result = OH_ArkUI_CustomDialog_GetState(globalCustomDialog, &state);
ShowDialogState(state);
if (!g_isOpenController || !g_dialogAPI3) {
bool ret = CreateDialogController();
if (!ret) {
return ARKUI_ERROR_CODE_PARAM_INVALID;
}
}
result = SetDialogControllerAttribute(nodeType, nodeValue);
if (result != -1) {
return result;
}
result = SetDialogControllerAttribute2(nodeType, nodeValue);
return result;
}
napi_value CustomDialogTest::OpenNativeDialog(napi_env env, napi_callback_info info)
{
if (!g_isOpenController || !g_dialogAPI3) {
bool ret = CreateDialogController();
if (!ret) {
return nullptr;
}
}
if (globalCustomDialog && g_dialogAPI3) {
int32_t ret = g_dialogAPI3->nativeDialogAPI1.show(globalCustomDialog, true);
if (ret != ARKUI_ERROR_CODE_NO_ERROR) {
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "ControllerTest", "show failed, ret = %{public}d ",
ret);
}
}
napi_value exports;
if (napi_create_object(env, &exports) != napi_ok) {
return nullptr;
}
return exports;
}
napi_value CustomDialogTest::ResetDialogController(napi_env env, napi_callback_info info)
{
if (globalCustomDialog || g_dialogAPI3) {
g_dialogAPI3->nativeDialogAPI1.removeContent(globalCustomDialog);
g_dialogAPI3->nativeDialogAPI1.close(globalCustomDialog);
globalCustomDialog = nullptr;
g_dialogAPI3 = nullptr;
g_isOpenController = false;
ArkUI_DialogState state = DIALOG_UNINITIALIZED;
int32_t result =
OH_ArkUI_CustomDialog_GetState(globalCustomDialog, &state);
ShowDialogState(state);
}
napi_value exports;
if (napi_create_object(env, &exports) != napi_ok) {
return nullptr;
}
return exports;
}
}