* 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 "CardCreator.h"
#include "node/TypedArkUINode.h"
namespace NativeModule {
namespace {
constexpr double STACK1_PERCENT_HEIGHT = 0.8;
constexpr double STACK1_PERCENT_WIDTH = 0.3;
constexpr uint32_t STACK1_BACKGROUND_COLOR = 0xffeeeeee;
constexpr int32_t STACK1_MARGIN = 8;
constexpr int32_t STACK1_BORDER_RADIUS = 10;
constexpr double IMAGE1_PERCENT_HEIGHT = 1;
constexpr double IMAGE1_PERCENT_WIDTH = 1;
constexpr uint32_t IMAGE1_BACKGROUND_COLOR = 0xffff0000;
constexpr int32_t IMAGE1_BORDER_RADIUS = 10;
constexpr double COLUMN1_PERCENT_HEIGHT = 1;
constexpr double COLUMN1_PERCENT_WIDTH = 1;
constexpr int32_t COLUMN1_BORDER_RADIUS = 10;
constexpr double COLUMN2_PERCENT_HEIGHT = 0.4;
constexpr double COLUMN2_PERCENT_WIDTH = 1;
constexpr uint32_t COLUMN2_BACKGROUND_COLOR = 0xffeeeeee;
constexpr double TEXT1_HEIGHT = 20;
constexpr double TEXT1_WIDTH = 100;
constexpr double TEXT1_FONT_SIZE = 11;
constexpr double ROW1_HEIGHT = 20;
constexpr double ROW1_WIDTH = 60;
constexpr double ROW1_POSITION = 20;
constexpr double STACK2_PERCENT_HEIGHT = 0.8;
constexpr double STACK2_PERCENT_WIDTH = 0.3;
constexpr uint32_t STACK2_BACKGROUND_COLOR = 0xffeeeeee;
constexpr int32_t STACK2_BORDER_RADIUS = 5;
constexpr double TEXT2_HEIGHT = 20;
constexpr double TEXT2_WIDTH = 70;
constexpr double TEXT2_FONT_SIZE = 10;
constexpr double APP_ITEM_COLUMN_PERCENT_HEIGHT = 1;
constexpr double APP_ITEM_COLUMN_PERCENT_WIDTH = 1;
constexpr uint32_t APP_ITEM_COLUMN_BACKGROUND_COLOR = 0xffffffff;
constexpr int32_t APP_ITEM_COLUMN_PADDING = 5;
constexpr double STACK3_PERCENT_HEIGHT = 0.8;
constexpr double STACK3_PERCENT_WIDTH = 0.7;
constexpr uint32_t STACK3_BACKGROUND_COLOR = 0xffeeeeee;
constexpr int32_t STACK3_BORDER_RADIUS = 10;
constexpr double IMAGE2_PERCENT_HEIGHT = 1;
constexpr double IMAGE2_PERCENT_WIDTH = 1;
constexpr int32_t IMAGE2_BORDER_RADIUS = 5;
constexpr double APP_NAME_TEXT_PERCENT_HEIGHT = 0.2;
constexpr double APP_NAME_TEXT_PERCENT_WIDTH = 0.8;
constexpr int32_t APP_NAME_TEXT_FONT_SIZE = 10;
constexpr double COLUMN3_PERCENT_HEIGHT = 0.4;
constexpr double COLUMN3_PERCENT_WIDTH = 0.95;
constexpr uint32_t COLUMN3_BACKGROUND_COLOR = 0xffffffff;
constexpr int32_t COLUMN3_BORDER_RADIUS = 10;
constexpr int32_t COLUMN3_PADDING = 5;
constexpr double TITLE_TEXT_PERCENT_HEIGHT = 0.1;
constexpr double TITLE_TEXT_PERCENT_WIDTH = 0.9;
constexpr int32_t TITLE_TEXT_FONT_SIZE = 16;
constexpr double HOME_GRID_PERCENT_HEIGHT = 0.9;
constexpr double HOME_GRID_PERCENT_WIDTH = 1;
constexpr double HOME_GRID_COLUMN_GAP = 3.0;
constexpr double APP_ITEM_PERCENT_HEIGHT = 0.24;
constexpr double APP_ITEM_PERCENT_WIDTH = 0.2;
constexpr double COLUMN4_PERCENT_HEIGHT = 0.2;
constexpr double COLUMN4_PERCENT_WIDTH = 0.95;
constexpr uint32_t COLUMN4_BACKGROUND_COLOR = 0xffffffff;
constexpr int32_t COLUMN4_BORDER_RADIUS = 10;
constexpr int32_t COLUMN4_PADDING = 5;
constexpr double SCROLL_PERCENT_HEIGHT = 0.9;
constexpr double SCROLL_PERCENT_WIDTH = 1;
}
std::shared_ptr<ArkUINode> CreateServiceItem(ServiceItemInfo& info)
{
auto stackNode = std::make_shared<ArkUIStackNode>();
stackNode->SetPercentHeight(STACK1_PERCENT_HEIGHT);
stackNode->SetPercentWidth(STACK1_PERCENT_WIDTH);
stackNode->SetBackgroundColor(STACK1_BACKGROUND_COLOR);
stackNode->SetClip(true);
stackNode->SetMargin(0, STACK1_MARGIN, STACK1_MARGIN, 0);
stackNode->SetAlignment(ARKUI_ALIGNMENT_BOTTOM);
stackNode->SetBorderRadius(STACK1_BORDER_RADIUS);
auto imageNode = std::make_shared<ArkUIImageNode>();
imageNode->SetPercentHeight(IMAGE1_PERCENT_HEIGHT);
imageNode->SetPercentWidth(IMAGE1_PERCENT_WIDTH);
imageNode->SetSrc(info.backgroundImageSrc.c_str());
imageNode->SetBackgroundColor(IMAGE1_BACKGROUND_COLOR);
imageNode->SetBorderRadius(IMAGE1_BORDER_RADIUS);
stackNode->AddChild(imageNode);
auto colorNode = std::make_shared<ArkUIColumnNode>();
colorNode->SetPercentHeight(COLUMN1_PERCENT_HEIGHT);
colorNode->SetPercentWidth(COLUMN1_PERCENT_WIDTH);
colorNode->SetBackgroundColor(info.iconColor);
colorNode->SetBorderRadius(COLUMN1_BORDER_RADIUS);
stackNode->AddChild(colorNode);
auto columnNode = std::make_shared<ArkUIColumnNode>();
columnNode->SetPercentHeight(COLUMN2_PERCENT_HEIGHT);
columnNode->SetPercentWidth(COLUMN2_PERCENT_WIDTH);
columnNode->SetBackgroundColor(COLUMN2_BACKGROUND_COLOR);
stackNode->AddChild(columnNode);
auto textNode = std::make_shared<ArkUITextNode>();
textNode->SetHeight(TEXT1_HEIGHT);
textNode->SetWidth(TEXT1_WIDTH);
textNode->SetContent(info.describeInfo.c_str());
textNode->SetFontSize(TEXT1_FONT_SIZE);
columnNode->AddChild(textNode);
auto rowNode = std::make_shared<ArkUIRowNode>();
rowNode->SetHeight(ROW1_HEIGHT);
rowNode->SetWidth(ROW1_WIDTH);
rowNode->SetPosition(ROW1_POSITION, ROW1_POSITION);
columnNode->AddChild(rowNode);
auto stackNode2 = std::make_shared<ArkUIStackNode>();
stackNode2->SetPercentHeight(STACK2_PERCENT_HEIGHT);
stackNode2->SetPercentWidth(STACK2_PERCENT_WIDTH);
stackNode2->SetBackgroundColor(STACK2_BACKGROUND_COLOR);
stackNode2->SetClip(true);
stackNode2->SetBorderRadius(STACK2_BORDER_RADIUS);
rowNode->AddChild(stackNode2);
auto image2Node = std::make_shared<ArkUIImageNode>();
image2Node->SetPercentHeight(1);
image2Node->SetPercentWidth(1);
image2Node->SetSrc(info.iconSrc.c_str());
stackNode2->AddChild(image2Node);
auto colorNode2 = std::make_shared<ArkUIColumnNode>();
colorNode2->SetPercentHeight(1);
colorNode2->SetPercentWidth(1);
colorNode2->SetBackgroundColor(info.iconColor);
stackNode2->AddChild(colorNode2);
auto text2Node = std::make_shared<ArkUITextNode>();
text2Node->SetHeight(TEXT2_HEIGHT);
text2Node->SetWidth(TEXT2_WIDTH);
text2Node->SetFontSize(TEXT2_FONT_SIZE);
text2Node->SetContent(info.name.c_str());
rowNode->AddChild(text2Node);
return stackNode;
}
std::shared_ptr<ArkUINode> CreateAppItem(AppItemInfo& info)
{
auto appItemColumnNode = std::make_shared<ArkUIColumnNode>();
appItemColumnNode->SetPercentHeight(APP_ITEM_COLUMN_PERCENT_HEIGHT);
appItemColumnNode->SetPercentWidth(APP_ITEM_COLUMN_PERCENT_WIDTH);
appItemColumnNode->SetPadding(
APP_ITEM_COLUMN_PADDING, APP_ITEM_COLUMN_PADDING, APP_ITEM_COLUMN_PADDING, APP_ITEM_COLUMN_PADDING);
appItemColumnNode->SetBackgroundColor(APP_ITEM_COLUMN_BACKGROUND_COLOR);
auto stackNode = std::make_shared<ArkUIStackNode>();
stackNode->SetPercentHeight(STACK3_PERCENT_HEIGHT);
stackNode->SetPercentWidth(STACK3_PERCENT_WIDTH);
stackNode->SetBackgroundColor(STACK3_BACKGROUND_COLOR);
stackNode->SetClip(true);
stackNode->SetBorderRadius(STACK3_BORDER_RADIUS);
appItemColumnNode->AddChild(stackNode);
auto appIconNode = std::make_shared<ArkUIImageNode>();
appIconNode->SetPercentHeight(IMAGE2_PERCENT_HEIGHT);
appIconNode->SetPercentWidth(IMAGE2_PERCENT_WIDTH);
appIconNode->SetSrc(info.iconSrc.c_str());
appIconNode->SetAutoResize(true);
appIconNode->SetBorderRadius(IMAGE2_BORDER_RADIUS);
stackNode->AddChild(appIconNode);
auto colorNode = std::make_shared<ArkUIColumnNode>();
colorNode->SetPercentHeight(1);
colorNode->SetPercentWidth(1);
colorNode->SetBackgroundColor(info.iconColor);
colorNode->SetBorderRadius(COLUMN1_BORDER_RADIUS);
stackNode->AddChild(colorNode);
auto appNameNode = std::make_shared<ArkUITextNode>();
appNameNode->SetPercentHeight(APP_NAME_TEXT_PERCENT_HEIGHT);
appNameNode->SetPercentWidth(APP_NAME_TEXT_PERCENT_WIDTH);
appNameNode->SetFontSize(APP_NAME_TEXT_FONT_SIZE);
appNameNode->SetContent(info.name.c_str());
appItemColumnNode->AddChild(appNameNode);
return appItemColumnNode;
}
std::shared_ptr<ArkUINode> CreateAppCard(AppCardInfo& info)
{
auto columnNode = std::make_shared<ArkUIColumnNode>();
columnNode->SetPercentHeight(COLUMN3_PERCENT_HEIGHT);
columnNode->SetPercentWidth(COLUMN3_PERCENT_WIDTH);
columnNode->SetBackgroundColor(COLUMN3_BACKGROUND_COLOR);
columnNode->SetBorderRadius(COLUMN3_BORDER_RADIUS);
columnNode->SetPadding(COLUMN3_PADDING, COLUMN3_PADDING, COLUMN3_PADDING, COLUMN3_PADDING);
auto titleTextNode = std::make_shared<ArkUITextNode>();
titleTextNode->SetPercentWidth(TITLE_TEXT_PERCENT_WIDTH);
titleTextNode->SetPercentHeight(TITLE_TEXT_PERCENT_HEIGHT);
titleTextNode->SetFontSize(TITLE_TEXT_FONT_SIZE);
titleTextNode->SetContent(info.name.c_str());
columnNode->AddChild(titleTextNode);
auto homeGridNode = std::make_shared<ArkUIGridNode>();
homeGridNode->SetPercentHeight(HOME_GRID_PERCENT_HEIGHT);
homeGridNode->SetPercentWidth(HOME_GRID_PERCENT_WIDTH);
homeGridNode->SetColumnTemplate("1fr 1fr 1fr 1fr 1fr");
homeGridNode->SetColumnGap(HOME_GRID_COLUMN_GAP);
homeGridNode->SetRowGap(0);
columnNode->AddChild(homeGridNode);
for (int32_t i = 0; i < info.items.size(); i++) {
auto appItemNode = std::make_shared<ArkUIGridItemNode>();
appItemNode->SetPercentHeight(APP_ITEM_PERCENT_HEIGHT);
appItemNode->SetPercentWidth(APP_ITEM_PERCENT_WIDTH);
homeGridNode->AddChild(appItemNode);
appItemNode->AddChild(CreateAppItem(info.items[i]));
}
return columnNode;
}
std::shared_ptr<ArkUINode> CreateServiceCard(ServiceCardInfo& info)
{
auto columnNode = std::make_shared<ArkUIColumnNode>();
columnNode->SetPercentHeight(COLUMN4_PERCENT_HEIGHT);
columnNode->SetPercentWidth(COLUMN4_PERCENT_WIDTH);
columnNode->SetBackgroundColor(COLUMN4_BACKGROUND_COLOR);
columnNode->SetBorderRadius(COLUMN4_BORDER_RADIUS);
columnNode->SetPadding(COLUMN4_PADDING, COLUMN4_PADDING, COLUMN4_PADDING, COLUMN4_PADDING);
auto titleTextNode = std::make_shared<ArkUITextNode>();
titleTextNode->SetPercentWidth(TITLE_TEXT_PERCENT_WIDTH);
titleTextNode->SetPercentHeight(TITLE_TEXT_PERCENT_HEIGHT);
titleTextNode->SetFontSize(TITLE_TEXT_FONT_SIZE);
titleTextNode->SetContent(info.name.c_str());
columnNode->AddChild(titleTextNode);
auto scrollNode = std::make_shared<ArkUIScrollNode>();
scrollNode->SetPercentWidth(SCROLL_PERCENT_WIDTH);
scrollNode->SetPercentHeight(SCROLL_PERCENT_HEIGHT);
scrollNode->SetScrollDirection(ARKUI_AXIS_HORIZONTAL);
scrollNode->SetScrollBarDisplayMode(ARKUI_SCROLL_BAR_DISPLAY_MODE_OFF);
columnNode->AddChild(scrollNode);
auto rowNode = std::make_shared<ArkUIRowNode>();
scrollNode->AddChild(rowNode);
for (int32_t i = 0; i < info.items.size(); i++) {
rowNode->AddChild(CreateServiceItem(info.items[i]));
}
return columnNode;
}
}