From 189d80b65073e8573162f89237bcda61d365b4e6 Mon Sep 17 00:00:00 2001 From: Zhang Jinyu Date: Thu, 14 Nov 2024 14:25:16 +0800 Subject: [PATCH] feat: Row Column Radio Refresh Grid Flex component Capi test Signed-off-by: Zhang Jinyu --- function/ui_compare/capidemo/.gitignore | 13 + .../ui_compare/capidemo/AppScope/app.json5 | 10 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 6790 bytes function/ui_compare/capidemo/README.md | 3 + .../ui_compare/capidemo/build-profile.json5 | 29 + .../ui_compare/capidemo/code-linter.json5 | 34 ++ function/ui_compare/capidemo/entry/.gitignore | 7 + .../capidemo/entry/build-profile.json5 | 20 + .../ui_compare/capidemo/entry/hvigorfile.ts | 2 + .../capidemo/entry/oh-package.json5 | 27 + .../entry/src/main/cpp/CMakeLists.txt | 99 ++++ .../cpp/column/column_align_items_test.cpp | 201 +++++++ .../main/cpp/column/column_align_items_test.h | 34 ++ .../column/column_justify_content_test.cpp | 129 +++++ .../cpp/column/column_justify_content_test.h | 33 ++ .../entry/src/main/cpp/common/common.h | 96 ++++ .../main/cpp/component/button_component.cpp | 24 + .../src/main/cpp/component/button_component.h | 31 + .../src/main/cpp/component/column_component.h | 44 ++ .../src/main/cpp/component/component.cpp | 364 ++++++++++++ .../entry/src/main/cpp/component/component.h | 166 ++++++ .../main/cpp/component/flowitem_component.h | 31 + .../src/main/cpp/component/grid_component.cpp | 58 ++ .../src/main/cpp/component/grid_component.h | 73 +++ .../main/cpp/component/image_component.cpp | 37 ++ .../src/main/cpp/component/image_component.h | 35 ++ .../cpp/component/imageanimator_component.cpp | 63 ++ .../cpp/component/imageanimator_component.h | 35 ++ .../cpp/component/imagespan_component.cpp | 29 + .../main/cpp/component/imagespan_component.h | 34 ++ .../src/main/cpp/component/list_component.cpp | 260 +++++++++ .../src/main/cpp/component/list_component.h | 213 +++++++ .../src/main/cpp/component/node_adapter.h | 308 ++++++++++ .../main/cpp/component/radio_component.cpp | 46 ++ .../src/main/cpp/component/radio_component.h | 36 ++ .../main/cpp/component/refresh_component.cpp | 45 ++ .../main/cpp/component/refresh_component.h | 34 ++ .../component/relativecontainer_component.h | 65 +++ .../src/main/cpp/component/row_component.h | 41 ++ .../main/cpp/component/scroll_component.cpp | 150 +++++ .../src/main/cpp/component/scroll_component.h | 57 ++ .../main/cpp/component/swiper_component.cpp | 175 ++++++ .../src/main/cpp/component/swiper_component.h | 57 ++ .../src/main/cpp/component/text_component.cpp | 42 ++ .../src/main/cpp/component/text_component.h | 34 ++ .../cpp/component/waterflow_component.cpp | 296 ++++++++++ .../main/cpp/component/waterflow_component.h | 151 +++++ .../src/main/cpp/flex/flex_options_test.cpp | 163 ++++++ .../src/main/cpp/flex/flex_options_test.h | 33 ++ .../entry/src/main/cpp/grid/grid_test.cpp | 472 +++++++++++++++ .../entry/src/main/cpp/grid/grid_test.h | 37 ++ .../src/main/cpp/manager/plugin_manager.cpp | 149 +++++ .../src/main/cpp/manager/plugin_manager.h | 46 ++ .../capidemo/entry/src/main/cpp/napi_init.cpp | 99 ++++ .../src/main/cpp/radio/radio_checked_test.cpp | 119 ++++ .../src/main/cpp/radio/radio_checked_test.h | 33 ++ .../cpp/radio/radio_reset_attribute_test.cpp | 113 ++++ .../cpp/radio/radio_reset_attribute_test.h | 33 ++ .../src/main/cpp/radio/radio_style_test.cpp | 140 +++++ .../src/main/cpp/radio/radio_style_test.h | 33 ++ .../main/cpp/radio/radio_value_group_test.cpp | 200 +++++++ .../main/cpp/radio/radio_value_group_test.h | 33 ++ .../src/main/cpp/refresh/refresh_test.cpp | 542 ++++++++++++++++++ .../entry/src/main/cpp/refresh/refresh_test.h | 42 ++ .../src/main/cpp/row/row_align_items_test.cpp | 202 +++++++ .../src/main/cpp/row/row_align_items_test.h | 34 ++ .../main/cpp/row/row_justify_content_test.cpp | 128 +++++ .../main/cpp/row/row_justify_content_test.h | 33 ++ .../main/cpp/types/libnativerender/index.d.ts | 52 ++ .../types/libnativerender/oh-package.json5 | 6 + .../main/ets/entryability/EntryAbility.ets | 55 ++ .../src/main/ets/entryability/EntryAbility.ts | 55 ++ .../entrybackupability/EntryBackupAbility.ets | 26 + .../entry/src/main/ets/pages/Index.ets | 45 ++ .../capidemo/entry/src/main/module.json5 | 45 ++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 16 + .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../resources/base/media/background_blue.png | Bin 0 -> 57364 bytes .../resources/base/media/background_green.png | Bin 0 -> 932 bytes .../resources/base/media/background_red.png | Bin 0 -> 933 bytes .../base/media/background_yellow.png | Bin 0 -> 1073 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../main/resources/base/media/icon_small.png | Bin 0 -> 1385 bytes .../resources/base/media/layered_image.json | 7 + .../src/main/resources/base/media/src.jpg | Bin 0 -> 9329 bytes .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 5 + .../main/resources/en_US/element/string.json | 16 + .../main/resources/zh_CN/element/string.json | 16 + .../ohosTest/ets/Application/AbilityStage.ts | 24 + .../ohosTest/ets/MainAbility/MainAbility.ts | 62 ++ .../ets/MainAbility/componet/CommonView.ets | 40 ++ .../ets/MainAbility/pages/DemoIndex.ets | 45 ++ .../ColumnAlignItemsMoreAttributeTest.ets | 33 ++ .../pages/column/ColumnAlignItemsTest.ets | 33 ++ .../pages/column/ColumnJustifyContentTest.ets | 33 ++ .../pages/flex/FlexOptionsTest.ets | 33 ++ .../pages/grid/GridCachedCountTest.ets | 33 ++ .../pages/grid/GridResetAttributeTest.ets | 34 ++ .../ets/MainAbility/pages/grid/GridTest.ets | 33 ++ .../pages/radio/RadioCheckedTest.ets | 33 ++ .../pages/radio/RadioResetAttributeTest.ets | 33 ++ .../pages/radio/RadioStyleTest.ets | 33 ++ .../pages/radio/RadioValueAndGroupTest.ets | 33 ++ .../RefreshForContentAndRatioAbnormalTest.ets | 33 ++ .../refresh/RefreshForContentAndRatioTest.ets | 33 ++ .../refresh/RefreshForRefreshingTest.ets | 33 ++ .../pages/refresh/RefreshNestedScrollTest.ets | 33 ++ .../RefreshPullToRefreshAbnormalTest.ets | 33 ++ .../refresh/RefreshPullToRefreshFalseTest.ets | 33 ++ .../RefreshPullToRefreshTrueAbnormalTest.ets | 33 ++ .../refresh/RefreshPullToRefreshTrueTest.ets | 33 ++ .../refresh/RefreshResetAttributeTest.ets | 33 ++ .../row/RowAlignItemsMoreAttributeTest.ets | 33 ++ .../pages/row/RowAlignItemsTest.ets | 33 ++ .../pages/row/RowJustifyContentTest.ets | 33 ++ .../entry/src/ohosTest/ets/test/List.test.ets | 34 ++ .../test/column/ColumnAlignItemsTest.test.ets | 39 ++ .../column/ColumnJustifyContentTest.test.ets | 34 ++ .../ohosTest/ets/test/common/Interfaces.d.ts | 19 + .../src/ohosTest/ets/test/common/Settings.ts | 134 +++++ .../src/ohosTest/ets/test/common/Snap.ts | 169 ++++++ .../src/ohosTest/ets/test/common/Utils.ets | 278 +++++++++ .../ets/test/flex/FlexOptinsTest.test.ets | 34 ++ .../ohosTest/ets/test/grid/GridTest.test.ets | 83 +++ .../ets/test/radio/RadioTest.test.ets | 60 ++ .../ets/test/refresh/RefreshTest.test.ets | 148 +++++ .../ets/test/row/RowAlignItemsTest.test.ets | 39 ++ .../test/row/RowJustifyContentTest.test.ets | 34 ++ .../ets/testrunner/OpenHarmonyTestRunner.ts | 78 +++ .../capidemo/entry/src/ohosTest/module.json5 | 47 ++ .../resources/base/element/color.json | 8 + .../resources/base/element/float.json | 24 + .../resources/base/element/string.json | 16 + .../resources/base/media/background.png | Bin 0 -> 312971 bytes .../ohosTest/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../resources/base/media/icon_transparent.png | Bin 0 -> 5305 bytes .../resources/base/media/rectIcon.png | Bin 0 -> 4642 bytes .../src/ohosTest/resources/base/media/src.jpg | Bin 0 -> 9329 bytes .../resources/base/profile/main_pages.json | 28 + .../capidemo/hvigor/hvigor-config.json5 | 5 + function/ui_compare/capidemo/hvigorfile.ts | 6 + function/ui_compare/capidemo/oh-package.json5 | 25 + 147 files changed, 9091 insertions(+) create mode 100755 function/ui_compare/capidemo/.gitignore create mode 100755 function/ui_compare/capidemo/AppScope/app.json5 create mode 100755 function/ui_compare/capidemo/AppScope/resources/base/element/string.json create mode 100755 function/ui_compare/capidemo/AppScope/resources/base/media/app_icon.png create mode 100755 function/ui_compare/capidemo/README.md create mode 100644 function/ui_compare/capidemo/build-profile.json5 create mode 100755 function/ui_compare/capidemo/code-linter.json5 create mode 100755 function/ui_compare/capidemo/entry/.gitignore create mode 100644 function/ui_compare/capidemo/entry/build-profile.json5 create mode 100755 function/ui_compare/capidemo/entry/hvigorfile.ts create mode 100755 function/ui_compare/capidemo/entry/oh-package.json5 create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/CMakeLists.txt create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/column/column_align_items_test.cpp create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/column/column_align_items_test.h create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/column/column_justify_content_test.cpp create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/column/column_justify_content_test.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/common/common.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/button_component.cpp create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/button_component.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/column_component.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/component.cpp create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/component.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/flowitem_component.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/grid_component.cpp create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/grid_component.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/image_component.cpp create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/image_component.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/imageanimator_component.cpp create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/imageanimator_component.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/imagespan_component.cpp create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/imagespan_component.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/list_component.cpp create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/list_component.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/node_adapter.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/radio_component.cpp create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/radio_component.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/refresh_component.cpp create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/refresh_component.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/relativecontainer_component.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/row_component.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/scroll_component.cpp create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/scroll_component.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/swiper_component.cpp create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/swiper_component.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/text_component.cpp create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/text_component.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/waterflow_component.cpp create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/component/waterflow_component.h create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/flex/flex_options_test.cpp create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/flex/flex_options_test.h create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/grid/grid_test.cpp create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/grid/grid_test.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/manager/plugin_manager.cpp create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/manager/plugin_manager.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/napi_init.cpp create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_checked_test.cpp create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_checked_test.h create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_reset_attribute_test.cpp create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_reset_attribute_test.h create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_style_test.cpp create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_style_test.h create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_value_group_test.cpp create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_value_group_test.h create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/refresh/refresh_test.cpp create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/refresh/refresh_test.h create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/row/row_align_items_test.cpp create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/row/row_align_items_test.h create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/row/row_justify_content_test.cpp create mode 100644 function/ui_compare/capidemo/entry/src/main/cpp/row/row_justify_content_test.h create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/types/libnativerender/index.d.ts create mode 100755 function/ui_compare/capidemo/entry/src/main/cpp/types/libnativerender/oh-package.json5 create mode 100755 function/ui_compare/capidemo/entry/src/main/ets/entryability/EntryAbility.ets create mode 100755 function/ui_compare/capidemo/entry/src/main/ets/entryability/EntryAbility.ts create mode 100755 function/ui_compare/capidemo/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100755 function/ui_compare/capidemo/entry/src/main/ets/pages/Index.ets create mode 100755 function/ui_compare/capidemo/entry/src/main/module.json5 create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/base/element/color.json create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/base/element/string.json create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/base/media/background.png create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/base/media/background_blue.png create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/base/media/background_green.png create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/base/media/background_red.png create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/base/media/background_yellow.png create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/base/media/foreground.png create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/base/media/icon.png create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/base/media/icon_small.png create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/base/media/layered_image.json create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/base/media/src.jpg create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/base/media/startIcon.png create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/base/profile/backup_config.json create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/base/profile/main_pages.json create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/en_US/element/string.json create mode 100755 function/ui_compare/capidemo/entry/src/main/resources/zh_CN/element/string.json create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/ets/Application/AbilityStage.ts create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/MainAbility.ts create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/componet/CommonView.ets create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/DemoIndex.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/column/ColumnAlignItemsMoreAttributeTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/column/ColumnAlignItemsTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/column/ColumnJustifyContentTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/flex/FlexOptionsTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/grid/GridCachedCountTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/grid/GridResetAttributeTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/grid/GridTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/radio/RadioCheckedTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/radio/RadioResetAttributeTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/radio/RadioStyleTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/radio/RadioValueAndGroupTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshForContentAndRatioAbnormalTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshForContentAndRatioTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshForRefreshingTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshNestedScrollTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshPullToRefreshAbnormalTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshPullToRefreshFalseTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshPullToRefreshTrueAbnormalTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshPullToRefreshTrueTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshResetAttributeTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/row/RowAlignItemsMoreAttributeTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/row/RowAlignItemsTest.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/row/RowJustifyContentTest.ets create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/test/column/ColumnAlignItemsTest.test.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/test/column/ColumnJustifyContentTest.test.ets create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/ets/test/common/Interfaces.d.ts create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/ets/test/common/Settings.ts create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/ets/test/common/Snap.ts create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/ets/test/common/Utils.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/test/flex/FlexOptinsTest.test.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/test/grid/GridTest.test.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/test/radio/RadioTest.test.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/test/refresh/RefreshTest.test.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/test/row/RowAlignItemsTest.test.ets create mode 100644 function/ui_compare/capidemo/entry/src/ohosTest/ets/test/row/RowJustifyContentTest.test.ets create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ts create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/module.json5 create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/resources/base/element/color.json create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/resources/base/element/float.json create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/resources/base/element/string.json create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/resources/base/media/background.png create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/resources/base/media/icon.png create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/resources/base/media/icon_transparent.png create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/resources/base/media/rectIcon.png create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/resources/base/media/src.jpg create mode 100755 function/ui_compare/capidemo/entry/src/ohosTest/resources/base/profile/main_pages.json create mode 100755 function/ui_compare/capidemo/hvigor/hvigor-config.json5 create mode 100755 function/ui_compare/capidemo/hvigorfile.ts create mode 100755 function/ui_compare/capidemo/oh-package.json5 diff --git a/function/ui_compare/capidemo/.gitignore b/function/ui_compare/capidemo/.gitignore new file mode 100755 index 000000000..59afb970e --- /dev/null +++ b/function/ui_compare/capidemo/.gitignore @@ -0,0 +1,13 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test +build-profile.json5 +oh-package-lock.json5 \ No newline at end of file diff --git a/function/ui_compare/capidemo/AppScope/app.json5 b/function/ui_compare/capidemo/AppScope/app.json5 new file mode 100755 index 000000000..5f0deb752 --- /dev/null +++ b/function/ui_compare/capidemo/AppScope/app.json5 @@ -0,0 +1,10 @@ +{ + "app": { + "bundleName": "com.openharmony.arkui_capi_demo", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/function/ui_compare/capidemo/AppScope/resources/base/element/string.json b/function/ui_compare/capidemo/AppScope/resources/base/element/string.json new file mode 100755 index 000000000..fb020ee11 --- /dev/null +++ b/function/ui_compare/capidemo/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "ArkUI_CAPI_Demo" + } + ] +} diff --git a/function/ui_compare/capidemo/AppScope/resources/base/media/app_icon.png b/function/ui_compare/capidemo/AppScope/resources/base/media/app_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 + +#include "../manager/plugin_manager.h" + +namespace ArkUICApiDemo { + +static auto createChildNode(ArkUI_NativeNodeAPI_1* nodeAPI, uint32_t backgroundColor) +{ + auto nodeHandle = nodeAPI->createNode(ARKUI_NODE_BUTTON); + // set width + ArkUI_NumberValue button_width_value[] = { { .f32 = 20 } }; + ArkUI_AttributeItem button_width_item = { button_width_value, + sizeof(button_width_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_WIDTH, &button_width_item); + // set height + ArkUI_NumberValue button_height_value[] = { { .f32 = 20 } }; + ArkUI_AttributeItem button_height_item = { button_height_value, + sizeof(button_height_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_HEIGHT, &button_height_item); + + // set background color + ArkUI_NumberValue button1_background_color_value[] = { { .u32 = backgroundColor } }; + ArkUI_AttributeItem button1_background_color_item = { button1_background_color_value, + sizeof(button1_background_color_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_BACKGROUND_COLOR, &button1_background_color_item); + return nodeHandle; +} + +static auto createColumnNode(ArkUI_NativeNodeAPI_1* nodeAPI, int32_t horizontalAlign) +{ + auto nodeHandle = nodeAPI->createNode(ARKUI_NODE_COLUMN); + // set background color + ArkUI_NumberValue background_color_value[] = { { .u32 = COLOR_BLACK } }; + ArkUI_AttributeItem background_color_item = { background_color_value, + sizeof(background_color_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_BACKGROUND_COLOR, &background_color_item); + // set width + ArkUI_NumberValue width_value[] = { { .f32 = 80 } }; + ArkUI_AttributeItem width_item = { width_value, sizeof(width_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_WIDTH, &width_item); + // set height + ArkUI_NumberValue height_value[] = { { .f32 = 80 } }; + ArkUI_AttributeItem height_item = { height_value, sizeof(height_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_HEIGHT, &height_item); + // set margin + ArkUI_NumberValue margin_value[] = { { .f32 = 5 } }; + ArkUI_AttributeItem margin_item = { margin_value, sizeof(margin_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_MARGIN, &margin_item); + // set children + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_RED)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_GREEN)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_YELLOW)); + // set AlignItems + ArkUI_NumberValue alignItems_value[] = { { .i32 = horizontalAlign } }; + ArkUI_AttributeItem alignItems_item = { alignItems_value, sizeof(alignItems_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_COLUMN_ALIGN_ITEMS, &alignItems_item); + return nodeHandle; +} + +static auto createColumnNode(ArkUI_NativeNodeAPI_1* nodeAPI, int32_t horizontalAlign, int32_t flexAlign) +{ + auto nodeHandle = nodeAPI->createNode(ARKUI_NODE_COLUMN); + // set background color + ArkUI_NumberValue background_color_value[] = { { .u32 = COLOR_BLACK } }; + ArkUI_AttributeItem background_color_item = { background_color_value, + sizeof(background_color_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_BACKGROUND_COLOR, &background_color_item); + // set width + ArkUI_NumberValue width_value[] = { { .f32 = 80 } }; + ArkUI_AttributeItem width_item = { width_value, sizeof(width_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_WIDTH, &width_item); + // set height + ArkUI_NumberValue height_value[] = { { .f32 = 80 } }; + ArkUI_AttributeItem height_item = { height_value, sizeof(height_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_HEIGHT, &height_item); + // set margin + ArkUI_NumberValue margin_value[] = { { .f32 = 5 } }; + ArkUI_AttributeItem margin_item = { margin_value, sizeof(margin_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_MARGIN, &margin_item); + // set children + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_RED)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_GREEN)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_YELLOW)); + // set AlignItems + ArkUI_NumberValue alignItems_value[] = { { .i32 = horizontalAlign } }; + ArkUI_AttributeItem alignItems_item = { alignItems_value, sizeof(alignItems_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_COLUMN_ALIGN_ITEMS, &alignItems_item); + // set justifyContent + ArkUI_NumberValue justifyContent_value[] = { { .i32 = flexAlign } }; + ArkUI_AttributeItem justifyContent_item = { justifyContent_value, + sizeof(justifyContent_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_COLUMN_JUSTIFY_CONTENT, &justifyContent_item); + return nodeHandle; +} +napi_value ColumnAlignItemsTest::CreateNativeNode(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "ColumnAlignItemsTest", "CreateNativeNode"); + + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "ColumnAlignItemsTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + // set parent node + auto parentColumn = nodeAPI->createNode(ARKUI_NODE_COLUMN); + auto columnStart = createColumnNode(nodeAPI, ARKUI_HORIZONTAL_ALIGNMENT_START); + auto columnCenter = createColumnNode(nodeAPI, ARKUI_HORIZONTAL_ALIGNMENT_CENTER); + auto columnEnd = createColumnNode(nodeAPI, ARKUI_HORIZONTAL_ALIGNMENT_END); + auto columnSpaceError = createColumnNode(nodeAPI, -1); + nodeAPI->addChild(parentColumn, columnStart); + nodeAPI->addChild(parentColumn, columnCenter); + nodeAPI->addChild(parentColumn, columnEnd); + nodeAPI->addChild(parentColumn, columnSpaceError); + std::string id(xComponentID); + if (OH_NativeXComponent_AttachNativeRootNode(PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn) == + INVALID_PARAM) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "ColumnAlignItemsTest", + "OH_NativeXComponent_AttachNativeRootNode failed"); + } + + napi_value exports; + if (napi_create_object(env, &exports) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_create_object failed"); + return nullptr; + } + + return exports; +} + +napi_value ColumnAlignItemsTest::CreateMoreAttributeNativeNode(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "ColumnAlignItemsTest", "CreateNativeNode"); + + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "ColumnAlignItemsTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + // set parent node + auto parentColumn = nodeAPI->createNode(ARKUI_NODE_COLUMN); + auto column1 = createColumnNode(nodeAPI, ARKUI_HORIZONTAL_ALIGNMENT_START, ARKUI_FLEX_ALIGNMENT_END); + auto column2 = createColumnNode(nodeAPI, ARKUI_HORIZONTAL_ALIGNMENT_CENTER, ARKUI_FLEX_ALIGNMENT_SPACE_BETWEEN); + auto column3 = createColumnNode(nodeAPI, ARKUI_HORIZONTAL_ALIGNMENT_END, ARKUI_FLEX_ALIGNMENT_SPACE_EVENLY); + auto column4 = createColumnNode(nodeAPI, ARKUI_HORIZONTAL_ALIGNMENT_CENTER, ARKUI_FLEX_ALIGNMENT_SPACE_AROUND); + nodeAPI->addChild(parentColumn, column1); + nodeAPI->addChild(parentColumn, column2); + nodeAPI->addChild(parentColumn, column3); + nodeAPI->addChild(parentColumn, column4); + std::string id(xComponentID); + if (OH_NativeXComponent_AttachNativeRootNode(PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn) == + INVALID_PARAM) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "ColumnAlignItemsTest", + "OH_NativeXComponent_AttachNativeRootNode failed"); + } + + napi_value exports; + if (napi_create_object(env, &exports) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_create_object failed"); + return nullptr; + } + + return exports; +} +} // namespace ArkUICApiDemo \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/column/column_align_items_test.h b/function/ui_compare/capidemo/entry/src/main/cpp/column/column_align_items_test.h new file mode 100644 index 000000000..569e0ad8e --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/column/column_align_items_test.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_COLUMN_ALIGN_ITEMS_TEST_H +#define ARKUI_CAPI_DEMO_COLUMN_ALIGN_ITEMS_TEST_H + +#include +#include +#include + +#include "../common/common.h" + +namespace ArkUICApiDemo { + +class ColumnAlignItemsTest { +public: + ~ColumnAlignItemsTest(); + static napi_value CreateNativeNode(napi_env env, napi_callback_info info); + static napi_value CreateMoreAttributeNativeNode(napi_env env, napi_callback_info info); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_COLUMN_ALIGN_ITEMS_TEST_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/column/column_justify_content_test.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/column/column_justify_content_test.cpp new file mode 100644 index 000000000..65f1132c7 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/column/column_justify_content_test.cpp @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2024 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 "column_justify_content_test.h" + +#include + +#include "../manager/plugin_manager.h" + +namespace ArkUICApiDemo { + +static auto createChildNode(ArkUI_NativeNodeAPI_1* nodeAPI, uint32_t backgroundColor) +{ + auto nodeHandle = nodeAPI->createNode(ARKUI_NODE_BUTTON); + // set width + ArkUI_NumberValue button_width_value[] = { { .f32 = 20 } }; + ArkUI_AttributeItem button_width_item = { button_width_value, + sizeof(button_width_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_WIDTH, &button_width_item); + // set height + ArkUI_NumberValue button_height_value[] = { { .f32 = 20 } }; + ArkUI_AttributeItem button_height_item = { button_height_value, + sizeof(button_height_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_HEIGHT, &button_height_item); + + // set background color + ArkUI_NumberValue button1_background_color_value[] = { { .u32 = backgroundColor } }; + ArkUI_AttributeItem button1_background_color_item = { button1_background_color_value, + sizeof(button1_background_color_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_BACKGROUND_COLOR, &button1_background_color_item); + return nodeHandle; +} + +static auto createColumnNode(ArkUI_NativeNodeAPI_1* nodeAPI, int32_t flexAlign) +{ + auto nodeHandle = nodeAPI->createNode(ARKUI_NODE_COLUMN); + // set background color + ArkUI_NumberValue background_color_value[] = { { .u32 = COLOR_BLACK } }; + ArkUI_AttributeItem background_color_item = { background_color_value, + sizeof(background_color_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_BACKGROUND_COLOR, &background_color_item); + // set width + ArkUI_NumberValue width_value[] = { { .f32 = 80 } }; + ArkUI_AttributeItem width_item = { width_value, sizeof(width_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_WIDTH, &width_item); + // set height + ArkUI_NumberValue height_value[] = { { .f32 = 80 } }; + ArkUI_AttributeItem height_item = { height_value, sizeof(height_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_HEIGHT, &height_item); + // set margin + ArkUI_NumberValue margin_value[] = { { .f32 = 5 } }; + ArkUI_AttributeItem margin_item = { margin_value, sizeof(margin_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_MARGIN, &margin_item); + // set children + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_RED)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_GREEN)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_YELLOW)); + // set justifyContent + ArkUI_NumberValue justifyContent_value[] = { { .i32 = flexAlign } }; + ArkUI_AttributeItem justifyContent_item = { justifyContent_value, + sizeof(justifyContent_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_COLUMN_JUSTIFY_CONTENT, &justifyContent_item); + return nodeHandle; +} + +napi_value ColumnJustifyContentTest::CreateNativeNode(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "ColumnJustifyContentTest", "CreateNativeNode"); + + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print( + LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "ColumnJustifyContentTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + // set parent node + auto parentColumn = nodeAPI->createNode(ARKUI_NODE_COLUMN); + auto columnStart = createColumnNode(nodeAPI, ARKUI_FLEX_ALIGNMENT_START); + auto columnCenter = createColumnNode(nodeAPI, ARKUI_FLEX_ALIGNMENT_CENTER); + auto columnEnd = createColumnNode(nodeAPI, ARKUI_FLEX_ALIGNMENT_END); + auto columnSpaceBetween = createColumnNode(nodeAPI, ARKUI_FLEX_ALIGNMENT_SPACE_BETWEEN); + auto columnSpaceAround = createColumnNode(nodeAPI, ARKUI_FLEX_ALIGNMENT_SPACE_AROUND); + auto columnSpaceEvenly = createColumnNode(nodeAPI, ARKUI_FLEX_ALIGNMENT_SPACE_EVENLY); + auto columnSpaceError = createColumnNode(nodeAPI, -1); + nodeAPI->addChild(parentColumn, columnStart); + nodeAPI->addChild(parentColumn, columnCenter); + nodeAPI->addChild(parentColumn, columnEnd); + nodeAPI->addChild(parentColumn, columnSpaceBetween); + nodeAPI->addChild(parentColumn, columnSpaceAround); + nodeAPI->addChild(parentColumn, columnSpaceEvenly); + nodeAPI->addChild(parentColumn, columnSpaceError); + std::string id(xComponentID); + if (OH_NativeXComponent_AttachNativeRootNode(PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn) == + INVALID_PARAM) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "ColumnJustifyContentTest", + "OH_NativeXComponent_AttachNativeRootNode failed"); + } + + napi_value exports; + if (napi_create_object(env, &exports) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_create_object failed"); + return nullptr; + } + + return exports; +} +} // namespace ArkUICApiDemo \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/column/column_justify_content_test.h b/function/ui_compare/capidemo/entry/src/main/cpp/column/column_justify_content_test.h new file mode 100644 index 000000000..069fdb320 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/column/column_justify_content_test.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_COLUMN_JUSTIFY_CONTENT_TEST_H +#define ARKUI_CAPI_DEMO_COLUMN_JUSTIFY_CONTENT_TEST_H + +#include +#include +#include + +#include "../common/common.h" + +namespace ArkUICApiDemo { + +class ColumnJustifyContentTest { +public: + ~ColumnJustifyContentTest(); + static napi_value CreateNativeNode(napi_env env, napi_callback_info info); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_COLUMN_JUSTIFY_CONTENT_TEST_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/common/common.h b/function/ui_compare/capidemo/entry/src/main/cpp/common/common.h new file mode 100755 index 000000000..ccf88d1ee --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/common/common.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_COMMON_TEST_H +#define ARKUI_CAPI_DEMO_COMMON_TEST_H + +#include +#include + +namespace ArkUICApiDemo { + +#define PARAM_0 0 +#define PARAM_1 1 +#define PARAM_2 2 +#define PARAM_3 3 +#define PARAM_4 4 +#define PARAM_5 5 +#define PARAM_6 6 +#define PARAM_7 7 +#define PARAM_8 8 +#define PARAM_9 9 +#define PARAM_10 10 +#define PARAM_11 11 +#define PARAM_12 12 +#define PARAM_64 64 +#define DEFAULT_MARGIN 10 +#define SIZE_5 5 +#define SIZE_10 10 +#define SIZE_30 30 +#define SIZE_50 50 +#define SIZE_100 100 +#define SIZE_150 150 +#define SIZE_180 180 +#define SIZE_200 200 +#define SIZE_230 230 +#define SIZE_250 250 +#define SIZE_300 300 +#define SIZE_350 350 +#define SIZE_400 400 +#define SIZE_450 450 +#define SIZE_500 500 +#define SIZE_600 600 +#define DEFAULT_VALUE_TAG 7000 +#define ENUM_ABNORMAL_VALUE 500 +#define INVALID_PARAM 401 +#define COLOR_RED 0xFFFF0000 +#define COLOR_GREEN 0xFF00FF00 +#define COLOR_BLUE 0xFF0000FF +#define COLOR_YELLOW 0xFFFFFF00 +#define COLOR_PURPLE 0xFFFF11FF +#define COLOR_PINK 0xFFFFC0CB +#define COLOR_GRAY 0xFFDDDDDD +#define COLOR_TRANSPARENT 0x00000000 +#define COLOR_BLACK 0xFF000000 +#define COLOR_WHITE 0xFFFFFFFF +#define COLOR_LIGHT_BLUE 0xFF00FFFF +#define ON_CLICK_EVENT_ID 6001 +#define ON_FOCUS_EVENT_ID 6002 +#define ON_TOUCH_EVENT_ID 6003 +#define ON_AREA_CHANGE_EVENT_ID 6004 +#define ON_APPEAR_EVENT_ID 6005 +#define ON_BLUR_EVENT_ID 6006 +#define ON_CHANGE_EVENT_ID 6007 +#define ON_SUBMIT_EVENT_ID 6008 +#define ON_CUT_EVENT_ID 6009 +#define ON_PASTE_EVENT_ID 6010 +#define ON_MEASURE_EVENT_ID 6011 +#define ON_LAYOUT_EVENT_ID 6012 +#define ON_DRAW_EVENT_ID 6013 +#define ON_CUSTOM_EVENT_1_ID 9001 +#define ON_CUSTOM_EVENT_2_ID 9002 +#define ON_CUSTOM_EVENT_3_ID 9003 +#define ON_CUSTOM_EVENT_4_ID 9004 +#define ON_CUSTOM_EVENT_5_ID 9005 +#define ON_CUSTOM_EVENT_6_ID 9006 +#define PARAM_NEGATIVE_1 (-1) +#define PARAM_NEGATIVE_100 (-100) + +/** + * Log print domain. + */ +const unsigned int LOG_PRINT_DOMAIN = 0xFF00; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_COMMON_TEST_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/button_component.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/component/button_component.cpp new file mode 100755 index 000000000..6fd8c36a0 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/button_component.cpp @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2024 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 "button_component.h" + +namespace ArkUICApiDemo { + +void ButtonComponent::SetLable(const std::string& content) +{ + ArkUI_AttributeItem item = { nullptr, 0, content.c_str() }; + _nodeAPI->setAttribute(_component, NODE_BUTTON_LABEL, &item); +} +} // namespace ArkUICApiDemo diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/button_component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/button_component.h new file mode 100755 index 000000000..a0fafb7c8 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/button_component.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_BUTTON_COMPONENT_H +#define ARKUI_CAPI_DEMO_BUTTON_COMPONENT_H + +#include + +#include "component.h" + +namespace ArkUICApiDemo { +class ButtonComponent : public Component { +public: + ButtonComponent() : Component(ARKUI_NODE_BUTTON) {} + explicit ButtonComponent(ArkUI_NodeHandle handle) : Component(handle) {} + void SetLable(const std::string& content); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_BUTTON_COMPONENT_H \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/column_component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/column_component.h new file mode 100755 index 000000000..56c93a34b --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/column_component.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_COLUMN_COMPONENT_H +#define ARKUI_CAPI_DEMO_COLUMN_COMPONENT_H + +#include + +#include "component.h" + +namespace ArkUICApiDemo { +class ColumnComponent : public Component { +public: + ColumnComponent() : Component(ARKUI_NODE_COLUMN) {} + explicit ColumnComponent(ArkUI_NodeHandle handle) : Component(handle) {} + + void SetAlignItems(int32_t verticalAlign) + { + ArkUI_NumberValue value[] = { { .i32 = verticalAlign } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_COLUMN_ALIGN_ITEMS, &item); + } + void SetJustifyContent(int32_t flexAlign) + { + ArkUI_NumberValue value[] = { { .i32 = flexAlign } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_COLUMN_JUSTIFY_CONTENT, &item); + } +}; +} // namespace ArkUICApiDemo + +#endif // ARKUI_CAPI_DEMO_COLUMN_COMPONENT_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/component.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/component/component.cpp new file mode 100755 index 000000000..f8aa44048 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/component.cpp @@ -0,0 +1,364 @@ +/* + * Copyright (c) 2024 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 "component.h" + +#include +#include + +namespace ArkUICApiDemo { + +Component::Component(ArkUI_NodeType type) +{ + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, _nodeAPI); + _component = _nodeAPI->createNode(type); + _nodeAPI->setUserData(_component, this); + _nodeAPI->addNodeEventReceiver(_component, Component::NodeEventReceiver); +} + +Component::Component(ArkUI_NodeHandle handle) +{ + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, _nodeAPI); + _component = handle; + _nodeAPI->setUserData(_component, this); + _nodeAPI->addNodeEventReceiver(_component, Component::NodeEventReceiver); + + int32_t count = _nodeAPI->getTotalChildCount(_component); + for (int32_t i = 0; i < count; i++) { + auto temp = _nodeAPI->getChildAt(_component, i); + children_.emplace_back(std::make_shared(temp)); + } +} + +int32_t Component::setAttribute(ArkUI_NodeAttributeType attribute, const ArkUI_AttributeItem* item) +{ + return _nodeAPI->setAttribute(_component, attribute, item); +} + +const ArkUI_AttributeItem* Component::getAttribute(ArkUI_NodeAttributeType attribute) +{ + return _nodeAPI->getAttribute(_component, attribute); +} + +int32_t Component::resetAttribute(ArkUI_NodeAttributeType attribute) +{ + return _nodeAPI->resetAttribute(_component, attribute); +} + +void Component::SetWidth(float width) +{ + ArkUI_NumberValue value[] = { { .f32 = width } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_WIDTH, &item); +} +void Component::SetPercentWidth(float percent) +{ + ArkUI_NumberValue value[] = { { .f32 = percent } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_WIDTH_PERCENT, &item); +} +void Component::SetHeight(float height) +{ + ArkUI_NumberValue value[] = { { .f32 = height } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_HEIGHT, &item); +} +void Component::SetPercentHeight(float percent) +{ + ArkUI_NumberValue value[] = { { .f32 = percent } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_HEIGHT_PERCENT, &item); +} +void Component::SetBackgroundColor(uint32_t color) +{ + ArkUI_NumberValue value[] = { { .u32 = color } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_BACKGROUND_COLOR, &item); +} +void Component::SetBackgroundImage(const std::string& backgroundImage) +{ + ArkUI_AttributeItem item = { nullptr, 0, backgroundImage.c_str() }; + _nodeAPI->setAttribute(_component, NODE_BACKGROUND_IMAGE, &item); +} +void Component::SetBackgroundImageSizeWithStyle(int32_t imageSize) +{ + ArkUI_NumberValue value[] = { { .i32 = imageSize } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_BACKGROUND_IMAGE_SIZE_WITH_STYLE, &item); +} +void Component::SetBorderRadius(float topLeft, float topRight, float bottomLeft, float bottomRight) +{ + ArkUI_NumberValue value[] = { { .f32 = topLeft }, { .f32 = topRight }, { .f32 = bottomLeft }, + { .f32 = bottomRight } }; + ArkUI_AttributeItem item = { value, 4 }; + _nodeAPI->setAttribute(_component, NODE_BORDER_RADIUS, &item); +} + +void Component::SetPadding(float top, float right, float bottom, float left) +{ + ArkUI_NumberValue value[] = { { .f32 = top }, { .f32 = right }, { .f32 = bottom }, { .f32 = left } }; + ArkUI_AttributeItem item = { value, 4 }; + _nodeAPI->setAttribute(_component, NODE_PADDING, &item); +} + +void Component::SetPaddingPercent(float top, float right, float bottom, float left) +{ + ArkUI_NumberValue value[] = { { .f32 = top }, { .f32 = right }, { .f32 = bottom }, { .f32 = left } }; + ArkUI_AttributeItem item = { value, 4 }; + _nodeAPI->setAttribute(_component, NODE_PADDING_PERCENT, &item); +} + +void Component::SetMargin(float top, float right, float bottom, float left) +{ + ArkUI_NumberValue value[] = { { .f32 = top }, { .f32 = right }, { .f32 = bottom }, { .f32 = left } }; + ArkUI_AttributeItem item = { value, 4 }; + _nodeAPI->setAttribute(_component, NODE_MARGIN, &item); +} +void Component::SetMargin(float margin) +{ + ArkUI_NumberValue value[] = { { .f32 = margin }, { .f32 = margin }, { .f32 = margin }, { .f32 = margin } }; + ArkUI_AttributeItem item = { value, 4 }; + _nodeAPI->setAttribute(_component, NODE_MARGIN, &item); +} + +void Component::SetMarginPercent(float top, float right, float bottom, float left) +{ + ArkUI_NumberValue value[] = { { .f32 = top }, { .f32 = right }, { .f32 = bottom }, { .f32 = left } }; + ArkUI_AttributeItem item = { value, 4 }; + _nodeAPI->setAttribute(_component, NODE_MARGIN_PERCENT, &item); +} + +void Component::SetEnabled(int32_t enable) +{ + ArkUI_NumberValue value[] = { { .i32 = enable } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_ENABLED, &item); +} + +void Component::SetAlign(int32_t align) +{ + ArkUI_NumberValue value[] = { { .i32 = align } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_ALIGNMENT, &item); +} + +void Component::SetAlignRules(ArkUI_AlignmentRuleOption* option) +{ + ArkUI_AttributeItem item = { .object = option }; + _nodeAPI->setAttribute(_component, NODE_ALIGN_RULES, &item); +} + +void Component::SetAlignSelf(int32_t value) +{ + ArkUI_NumberValue val[] = { { .i32 = value } }; + ArkUI_AttributeItem item = { val, 1 }; + _nodeAPI->setAttribute(_component, NODE_ALIGN_SELF, &item); +} + +void Component::SetOpacity(float opacity) +{ + ArkUI_NumberValue value[] = { { .f32 = opacity } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_OPACITY, &item); +} + +void Component::SetBorderWidth(float top, float right, float bottom, float left) +{ + ArkUI_NumberValue value[] = { { .f32 = top }, { .f32 = right }, { .f32 = bottom }, { .f32 = left } }; + ArkUI_AttributeItem item = { value, 4 }; + _nodeAPI->setAttribute(_component, NODE_BORDER_WIDTH, &item); +} + +void Component::SetBorderWidth(float borderWidth) +{ + ArkUI_NumberValue value[] = { { .f32 = borderWidth }, { .f32 = borderWidth }, { .f32 = borderWidth }, + { .f32 = borderWidth } }; + ArkUI_AttributeItem item = { value, 4 }; + _nodeAPI->setAttribute(_component, NODE_BORDER_WIDTH, &item); +} + +void Component::SetBorderColor(uint32_t top, uint32_t right, uint32_t bottom, uint32_t left) +{ + ArkUI_NumberValue value[] = { { .u32 = top }, { .u32 = right }, { .u32 = bottom }, { .u32 = left } }; + ArkUI_AttributeItem item = { value, 4 }; + _nodeAPI->setAttribute(_component, NODE_BORDER_COLOR, &item); +} + +void Component::SetBorderStyle(int32_t top, int32_t right, int32_t bottom, int32_t left) +{ + ArkUI_NumberValue value[] = { { .i32 = top }, { .i32 = right }, { .i32 = bottom }, { .i32 = left } }; + ArkUI_AttributeItem item = { value, 4 }; + _nodeAPI->setAttribute(_component, NODE_BORDER_STYLE, &item); +} + +void Component::SetVisibility(int32_t visibility) +{ + ArkUI_NumberValue value[] = { { .i32 = visibility } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_VISIBILITY, &item); +} +void Component::SetId(const std::string& id) +{ + ArkUI_AttributeItem item = { nullptr, 0, id.c_str() }; + _nodeAPI->setAttribute(_component, NODE_ID, &item); +} +void Component::AddChild(const std::shared_ptr& child) +{ + children_.emplace_back(child); + OnAddChild(child); +} + +void Component::RemoveChild(const std::shared_ptr& child) +{ + children_.remove(child); + OnRemoveChild(child); +} + +void Component::RemoveAll() +{ + children_.clear(); + OnRemoveAll(); +} + +void Component::InsertChild(const std::shared_ptr& child, int32_t index) +{ + if (index >= children_.size()) { + AddChild(child); + } else { + auto iter = children_.begin(); + std::advance(iter, index); + children_.insert(iter, child); + OnInsertChild(child, index); + } +} + +std::shared_ptr Component::GetPreviousSibling() +{ + auto previousSibling = _nodeAPI->getPreviousSibling(_component); + return std::make_shared(previousSibling); +}; + +std::shared_ptr Component::GetNextSibling() +{ + auto nextSibling = _nodeAPI->getNextSibling(_component); + return std::make_shared(nextSibling); +}; + +void Component::NodeEventReceiver(ArkUI_NodeEvent* event) +{ + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + // 获取事件发生的UI组件对象。 + auto nodeHandle = OH_ArkUI_NodeEvent_GetNodeHandle(event); + // 获取保持在UI组件对象中的自定义数据,返回封装类指针。 + auto* node = reinterpret_cast(nodeAPI->getUserData(nodeHandle)); + // 基于封装类实例对象处理事件。 + if (node) { + node->ProcessNodeEvent(event); + } +} +void Component::SetFontSize(float fontSize) +{ + ArkUI_NumberValue value[] = { { .f32 = fontSize } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_FONT_SIZE, &item); +} +void Component::ProcessNodeEvent(ArkUI_NodeEvent* event) +{ + auto eventType = OH_ArkUI_NodeEvent_GetEventType(event); + OH_LOG_Print( + LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "commonEvent", "ProcessNodeEvent eventType=%{public}d", eventType); + switch (eventType) { + case NODE_ON_CLICK: { + if (onClick_) { + onClick_(); + } + break; + } + case NODE_TOUCH_EVENT: { + if (onTouch_) { + onTouch_(event); + } + break; + } + case NODE_EVENT_ON_DISAPPEAR: { + if (onDisappear_) { + onDisappear_(); + } + break; + } + case NODE_EVENT_ON_APPEAR: { + if (onAppear_) { + onAppear_(); + } + break; + } + case NODE_ON_HOVER: { + if (onHover_) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "commonEvent", "NODE_ON_HOVER"); + ArkUI_NodeComponentEvent* result = OH_ArkUI_NodeEvent_GetNodeComponentEvent(event); + int32_t isHover = result->data[0].i32; + onHover_(static_cast(isHover)); + } + break; + } + case NODE_EVENT_ON_VISIBLE_AREA_CHANGE: { + if (onVisibleAreaChange_) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "commonEvent", "NODE_EVENT_ON_VISIBLE_AREA_CHANGE"); + ArkUI_NodeComponentEvent* result = OH_ArkUI_NodeEvent_GetNodeComponentEvent(event); + bool visible = static_cast(result->data[0].i32); + float ratio = result->data[1].f32; + onVisibleAreaChange_(visible, ratio); + } + break; + } + case NODE_ON_MOUSE: { + if (onMouse_) { + onMouse_(event); + } + break; + } + case NODE_ON_TOUCH_INTERCEPT: { + if (onTouchIntercept_) { + onTouchIntercept_(event); + } + break; + } + case NODE_ON_FOCUS: { + if (onFocus_) { + onFocus_(); + } + break; + } + default: { + OnNodeEvent(event); + } + } +} + +void Component::RegisterOnVisibleAreaChange( + const std::function& onVisibleAreaChange, std::vector ratioArray) +{ + ArkUI_NumberValue value[ratioArray.size()]; + + for (size_t i = 0; i < ratioArray.size(); i++) { + value[i].f32 = { ratioArray[i] }; + } + ArkUI_AttributeItem item = { value, static_cast(ratioArray.size()) }; + + onVisibleAreaChange_ = onVisibleAreaChange; + _nodeAPI->registerNodeEvent(_component, NODE_EVENT_ON_VISIBLE_AREA_CHANGE, 0, &item); +} +} // namespace ArkUICApiDemo \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/component.h new file mode 100755 index 000000000..6ed0ab226 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/component.h @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_COMPONENT_H +#define ARKUI_CAPI_DEMO_COMPONENT_H + +#include +#include +#include +#include + +#include "../common/common.h" + +namespace ArkUICApiDemo { + +class Component { +public: + explicit Component(ArkUI_NodeType type); + explicit Component(ArkUI_NodeHandle handle); + virtual ~Component() = default; + + int32_t setAttribute(ArkUI_NodeAttributeType attribute, const ArkUI_AttributeItem* item); + const ArkUI_AttributeItem* getAttribute(ArkUI_NodeAttributeType attribute); + int32_t resetAttribute(ArkUI_NodeAttributeType attribute); + + void SetWidth(float width); + void SetPercentWidth(float percent); + void SetHeight(float height); + void SetPercentHeight(float percent); + void SetBackgroundColor(uint32_t color); + void SetBackgroundImage(const std::string& backgroundImage); + void SetBackgroundImageSizeWithStyle(int32_t imageSize); + void SetBorderRadius(float topLeft, float topRight, float bottomLeft, float bottomRight); + void SetPadding(float top, float right, float bottom, float left); + void SetPaddingPercent(float top, float right, float bottom, float left); + void SetMargin(float top, float right, float bottom, float left); + void SetMargin(float margin); + void SetMarginPercent(float top, float right, float bottom, float left); + void SetEnabled(int32_t enable); + void SetAlign(int32_t align); + void SetAlignRules(ArkUI_AlignmentRuleOption* option); + void SetAlignSelf(int32_t value); + void SetOpacity(float opacity); + void SetBorderWidth(float top, float right, float bottom, float left); + void SetBorderWidth(float borderWidth); + void SetBorderColor(uint32_t top, uint32_t right, uint32_t bottom, uint32_t left); + void SetBorderStyle(int32_t top, int32_t right, int32_t bottom, int32_t left); + void SetVisibility(int32_t visibility); + virtual void SetFontSize(float fontSize); + void SetId(const std::string& id); + void AddChild(const std::shared_ptr& child); + void RemoveChild(const std::shared_ptr& child); + void RemoveAll(); + void InsertChild(const std::shared_ptr& child, int32_t index); + std::list> GetChildren() + { + return children_; + } + std::shared_ptr GetPreviousSibling(); + std::shared_ptr GetNextSibling(); + + ArkUI_NodeHandle GetComponent() + { + return _component; + } + // 处理通用事件。 + void RegisterOnClick(const std::function& onClick) + { + onClick_ = onClick; + _nodeAPI->registerNodeEvent(_component, NODE_ON_CLICK, 0, nullptr); + } + + void RegisterOnTouch(const std::function& onTouch) + { + onTouch_ = onTouch; + _nodeAPI->registerNodeEvent(_component, NODE_TOUCH_EVENT, 0, nullptr); + } + + void RegisterOnDisappear(const std::function& onDisappear) + { + onDisappear_ = onDisappear; + _nodeAPI->registerNodeEvent(_component, NODE_EVENT_ON_DISAPPEAR, 0, nullptr); + } + + void RegisterOnAppear(const std::function& onAppear) + { + onAppear_ = onAppear; + _nodeAPI->registerNodeEvent(_component, NODE_EVENT_ON_APPEAR, 0, nullptr); + } + void RegisterOnHover(const std::function& onHover) + { + onHover_ = onHover; + _nodeAPI->registerNodeEvent(_component, NODE_ON_HOVER, 0, nullptr); + } + void RegisterOnMouse(const std::function& onMouse) + { + onMouse_ = onMouse; + _nodeAPI->registerNodeEvent(_component, NODE_ON_MOUSE, 0, nullptr); + } + void RegisterOnTouchIntercept(const std::function& onTouchIntercept) + { + onTouchIntercept_ = onTouchIntercept; + _nodeAPI->registerNodeEvent(_component, NODE_ON_TOUCH_INTERCEPT, 0, nullptr); + } + void RegisterOnFocus(const std::function& onFocus) + { + onFocus_ = onFocus; + _nodeAPI->registerNodeEvent(_component, NODE_ON_FOCUS, 0, nullptr); + } + void RegisterOnVisibleAreaChange( + const std::function& onVisibleAreaChange, std::vector ratioArray); + + static void NodeEventReceiver(ArkUI_NodeEvent* event); + void ProcessNodeEvent(ArkUI_NodeEvent* event); + virtual void OnNodeEvent(ArkUI_NodeEvent* event) {} + +protected: + // 组件树操作的实现类对接。 + void OnAddChild(const std::shared_ptr& child) + { + _nodeAPI->addChild(_component, child->GetComponent()); + } + void OnRemoveChild(const std::shared_ptr& child) + { + _nodeAPI->removeChild(_component, child->GetComponent()); + } + void OnRemoveAll() + { + _nodeAPI->removeAllChildren(_component); + } + void OnInsertChild(const std::shared_ptr& child, int32_t index) + { + _nodeAPI->insertChildAt(_component, child->GetComponent(), index); + } + +protected: + std::list> children_; + ArkUI_NodeHandle _component { nullptr }; + ArkUI_NativeNodeAPI_1* _nodeAPI { nullptr }; + +private: + std::function onClick_; + std::function onDisappear_; + std::function onAppear_; + std::function onTouch_; + std::function onHover_; + std::function onVisibleAreaChange_; + std::function onMouse_; + std::function onTouchIntercept_; + std::function onFocus_; +}; +} // namespace ArkUICApiDemo + +#endif // ARKUI_CAPI_DEMO_COMPONENT_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/flowitem_component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/flowitem_component.h new file mode 100755 index 000000000..6c9e26da6 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/flowitem_component.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_FLOWITEM_COMPONENT_H +#define ARKUI_CAPI_DEMO_FLOWITEM_COMPONENT_H + +#include + +#include "component.h" + +namespace ArkUICApiDemo { + +class FlowItemComponent : public Component { +public: + FlowItemComponent() : Component(ARKUI_NODE_FLOW_ITEM) {} + explicit FlowItemComponent(ArkUI_NodeHandle handle) : Component(handle) {} +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_FLOWITEM_COMPONENT_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/grid_component.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/component/grid_component.cpp new file mode 100755 index 000000000..4fcbf0b51 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/grid_component.cpp @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2024 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 "grid_component.h" + +namespace ArkUICApiDemo { +void GridComponent::SetGridColumnsTemplate(const std::string& str) +{ + ArkUI_AttributeItem item = { .string = str.c_str() }; + _nodeAPI->setAttribute(_component, NODE_GRID_COLUMN_TEMPLATE, &item); +} +void GridComponent::SetGridRowsTemplate(const std::string& str) +{ + ArkUI_AttributeItem item = { .string = str.c_str() }; + _nodeAPI->setAttribute(_component, NODE_GRID_ROW_TEMPLATE, &item); +} +void GridComponent::SetGridColumnsGap(float val) +{ + ArkUI_NumberValue value[] = { { .f32 = val } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_GRID_COLUMN_GAP, &item); +} +void GridComponent::SetGridRowsGap(float val) +{ + ArkUI_NumberValue value[] = { { .f32 = val } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_GRID_ROW_GAP, &item); +} +void GridComponent::SetGridCachedCount(int32_t cachedCount) +{ + ArkUI_NumberValue value[] = { { .i32 = cachedCount } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_GRID_CACHED_COUNT, &item); +} +void GridComponent::SetScrollTo(float hOffset, float vOffset, const std::vector& optionalParams) +{ + auto value = new ArkUI_NumberValue[2 + static_cast(optionalParams.size())]; + value[0] = { .f32 = hOffset }; + value[1] = { .f32 = vOffset }; + for (int32_t i = 0; i < optionalParams.size(); i++) { + value[2 + i] = { .i32 = optionalParams[i] }; + } + ArkUI_AttributeItem item = { value, 2 + static_cast(optionalParams.size()) }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_OFFSET, &item); +} +} // namespace ArkUICApiDemo \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/grid_component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/grid_component.h new file mode 100755 index 000000000..2fbf1b1d9 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/grid_component.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_GRID_COMPONENT_H +#define ARKUI_CAPI_DEMO_GRID_COMPONENT_H + +#include "component.h" +#include "node_adapter.h" + +namespace ArkUICApiDemo { + +class GridItemComponent : public Component { +public: + GridItemComponent() : Component(ARKUI_NODE_GRID_ITEM) {} + explicit GridItemComponent(ArkUI_NodeHandle handle) : Component(handle) {} +}; + +class GridComponent : public Component { +public: + GridComponent() : Component(ARKUI_NODE_GRID) {} + explicit GridComponent(ArkUI_NodeHandle handle) : Component(handle) {} + + void SetLazyAdapter(const std::shared_ptr>& adapter) + { + ArkUI_AttributeItem item { nullptr, 0, nullptr, adapter->GetAdapter() }; + _nodeAPI->setAttribute(_component, NODE_GRID_NODE_ADAPTER, &item); + _adapter = adapter; + } + void SetGridColumnsTemplate(const std::string& str); + void SetGridRowsTemplate(const std::string& str); + void SetGridColumnsGap(float val); + void SetGridRowsGap(float val); + void SetGridCachedCount(int32_t cachedCount); + /** + * @brief Set the scroll position to the specified offset. + * @param hOffset horizontal scrolling offset + * @param vOffset vertical scrolling offset + * @param optionalParams + * [0] scrolling duration, in milliseconds. + * [1] scrolling curve. The parameter type is ArkUI_AnimationCurve. + * [2] whether to enable the default spring animation. + * [3] sets whether scrolling can cross the boundary. + * [4] canOverScroll. + */ + void SetScrollTo(float hOffset, float vOffset, const std::vector& optionalParams); + + std::shared_ptr> GetAdapter() const + { + return _adapter; + } + void ReleaseAdapter() + { + return _adapter.reset(); + } + +private: + std::shared_ptr> _adapter; +}; + +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_GRID_COMPONENT_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/image_component.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/component/image_component.cpp new file mode 100755 index 000000000..70c16d548 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/image_component.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2024 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 "image_component.h" + +#include + +namespace ArkUICApiDemo { + +int32_t ImageComponent::SetImageSrc(const std::string& content) +{ + ArkUI_AttributeItem item = { nullptr, 0, content.c_str() }; + return _nodeAPI->setAttribute(_component, NODE_IMAGE_SRC, &item); +} +int32_t ImageComponent::SetImageSrc(ArkUI_DrawableDescriptor* descriptors) +{ + ArkUI_AttributeItem item = { .object = descriptors }; + return _nodeAPI->setAttribute(_component, NODE_IMAGE_SRC, &item); +} +int32_t ImageComponent::SetObjectFit(const int32_t objectFit) +{ + ArkUI_NumberValue value[] = { { .i32 = objectFit } }; + ArkUI_AttributeItem item = { value, 1 }; + return _nodeAPI->setAttribute(_component, NODE_IMAGE_OBJECT_FIT, &item); +} +} // namespace ArkUICApiDemo diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/image_component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/image_component.h new file mode 100755 index 000000000..e4803ad1d --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/image_component.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_IMAGE_COMPONENT_H +#define ARKUI_CAPI_DEMO_IMAGE_COMPONENT_H + +#include +#include + +#include "component.h" + +namespace ArkUICApiDemo { +class ImageComponent : public Component { +public: + ImageComponent() : Component(ARKUI_NODE_IMAGE) {} + explicit ImageComponent(ArkUI_NodeHandle handle) : Component(handle) {} + + int32_t SetImageSrc(const std::string& content); + int32_t SetImageSrc(ArkUI_DrawableDescriptor* descriptors); + int32_t SetObjectFit(const int32_t objectFit); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_IMAGE_COMPONENT_H \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/imageanimator_component.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/component/imageanimator_component.cpp new file mode 100755 index 000000000..fe913a2e1 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/imageanimator_component.cpp @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2024 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 "imageanimator_component.h" + +namespace ArkUICApiDemo { +void ImageAnimatorComponent::SetState(int32_t state) +{ + ArkUI_NumberValue value[] = { { .i32 = state } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_IMAGE_ANIMATOR_STATE, &item); +} + +void ImageAnimatorComponent::SetIteration(int32_t iteration) +{ + ArkUI_NumberValue value[] = { { .i32 = iteration } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_IMAGE_ANIMATOR_ITERATION, &item); +} + +void ImageAnimatorComponent::SetImage(ArkUI_AttributeItem& item) +{ + _nodeAPI->setAttribute(_component, NODE_IMAGE_ANIMATOR_IMAGES, &item); +} + +void ImageAnimatorComponent::SetFixedSize(int32_t fixedSize) +{ + ArkUI_NumberValue value[] = { { .i32 = fixedSize } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_IMAGE_ANIMATOR_FIXED_SIZE, &item); +} + +void ImageAnimatorComponent::SetReverse(int32_t reverse) +{ + ArkUI_NumberValue value[] = { { .i32 = reverse } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_IMAGE_ANIMATOR_REVERSE, &item); +} +void ImageAnimatorComponent::SetFillMode(int32_t mode) +{ + ArkUI_NumberValue value[] = { { .i32 = mode } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_IMAGE_ANIMATOR_FILL_MODE, &item); +} + +void ImageAnimatorComponent::SetDuration(int32_t duration) +{ + ArkUI_NumberValue value[] = { { .i32 = duration } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_IMAGE_ANIMATOR_DURATION, &item); +} +} // namespace ArkUICApiDemo diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/imageanimator_component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/imageanimator_component.h new file mode 100755 index 000000000..973825af8 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/imageanimator_component.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_IMAGEANIMATOR_COMPONENT_H +#define ARKUI_CAPI_DEMO_IMAGEANIMATOR_COMPONENT_H + +#include "component.h" + +namespace ArkUICApiDemo { +class ImageAnimatorComponent : public Component { +public: + ImageAnimatorComponent() : Component(ARKUI_NODE_IMAGE_ANIMATOR) {} + explicit ImageAnimatorComponent(ArkUI_NodeHandle handle) : Component(handle) {} + void SetState(int32_t state); + void SetIteration(int32_t iteration); + void SetImage(ArkUI_AttributeItem& item); + void SetFixedSize(int32_t fixedSize); + void SetReverse(int32_t reverse); + void SetFillMode(int32_t mode); + void SetDuration(int32_t duration); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_IMAGEANIMATOR_COMPONENT_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/imagespan_component.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/component/imagespan_component.cpp new file mode 100755 index 000000000..7a74ee781 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/imagespan_component.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2024 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 "imagespan_component.h" + +namespace ArkUICApiDemo { + +int32_t ImageSpanComponent::SetImageSpanSrc(const std::string& content) +{ + ArkUI_AttributeItem item = { nullptr, 0, content.c_str() }; + return _nodeAPI->setAttribute(_component, NODE_IMAGE_SPAN_SRC, &item); +} +int32_t ImageSpanComponent::SetImageSpanSrc(ArkUI_DrawableDescriptor* descriptors) +{ + ArkUI_AttributeItem item = { .object = descriptors }; + return _nodeAPI->setAttribute(_component, NODE_IMAGE_SPAN_SRC, &item); +} +} // namespace ArkUICApiDemo diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/imagespan_component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/imagespan_component.h new file mode 100755 index 000000000..4305f550e --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/imagespan_component.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_IMAGESPAN_COMPONENT_H +#define ARKUI_CAPI_DEMO_IMAGESPAN_COMPONENT_H + +#include +#include + +#include "component.h" + +namespace ArkUICApiDemo { +class ImageSpanComponent : public Component { +public: + ImageSpanComponent() : Component(ARKUI_NODE_IMAGE_SPAN) {} + explicit ImageSpanComponent(ArkUI_NodeHandle handle) : Component(handle) {} + + int32_t SetImageSpanSrc(const std::string& content); + int32_t SetImageSpanSrc(ArkUI_DrawableDescriptor* descriptors); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_IMAGESPAN_COMPONENT_H \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/list_component.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/component/list_component.cpp new file mode 100755 index 000000000..4fd01b55a --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/list_component.cpp @@ -0,0 +1,260 @@ +/* + * Copyright (c) 2024 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 "list_component.h" + +namespace ArkUICApiDemo { + +void ListItemSwipeActionOption::SetStart(ArkUI_ListItemSwipeActionItem* item) +{ + OH_ArkUI_ListItemSwipeActionOption_SetStart(_option, item); +} + +void ListItemSwipeActionOption::SetEnd(ArkUI_ListItemSwipeActionItem* item) +{ + OH_ArkUI_ListItemSwipeActionOption_SetEnd(_option, item); +} + +void ListItemSwipeActionOption::SetEdgeEffect(ArkUI_ListItemSwipeEdgeEffect edgeEffect) +{ + OH_ArkUI_ListItemSwipeActionOption_SetEdgeEffect(_option, edgeEffect); +} + +int32_t ListItemSwipeActionOption::GetEdgeEffect() +{ + return OH_ArkUI_ListItemSwipeActionOption_GetEdgeEffect(_option); +} + +void ListItemSwipeActionOption::SetOnOffsetChange(OnOffsetChangeCallback callback) +{ + OH_ArkUI_ListItemSwipeActionOption_SetOnOffsetChange(_option, callback); +} + +void ListItemSwipeActionOption::SetOnOffsetChangWithUserData( + OnOffsetChangeWithUserDataCallback callback, void* userData) +{ + OH_ArkUI_ListItemSwipeActionOption_SetOnOffsetChangeWithUserData(_option, userData, callback); +} + +int32_t ListChildrenMainSizeOption::SetDefaultMainSize(float defaultMainSize) +{ + return OH_ArkUI_ListChildrenMainSizeOption_SetDefaultMainSize(_option, defaultMainSize); +} + +float ListChildrenMainSizeOption::GetDefaultMainSize() +{ + return OH_ArkUI_ListChildrenMainSizeOption_GetDefaultMainSize(_option); +} + +void ListChildrenMainSizeOption::Resize(int32_t totalSize) +{ + OH_ArkUI_ListChildrenMainSizeOption_Resize(_option, totalSize); +} + +int32_t ListChildrenMainSizeOption::Splice(int32_t index, int32_t deleteCount, int32_t addCount) +{ + return OH_ArkUI_ListChildrenMainSizeOption_Splice(_option, index, deleteCount, addCount); +} + +int32_t ListChildrenMainSizeOption::UpdateSize(int32_t index, float mainSize) +{ + return OH_ArkUI_ListChildrenMainSizeOption_UpdateSize(_option, index, mainSize); +} + +float ListChildrenMainSizeOption::GetMainSize(int32_t index) +{ + return OH_ArkUI_ListChildrenMainSizeOption_GetMainSize(_option, index); +} + +void ListItemComponent::SetListItemSwiperAction(ListItemSwipeActionOption* option) +{ + ArkUI_AttributeItem item = { nullptr, 0, nullptr, option->GetOption() }; + _nodeAPI->setAttribute(_component, NODE_LIST_ITEM_SWIPE_ACTION, &item); +} + +void ListComponent::SetListDirection(int32_t direction) +{ + ArkUI_NumberValue value[] = { { .i32 = direction } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_LIST_DIRECTION, &item); +} + +void ListComponent::SetListSticky(int32_t stickyStyle) +{ + ArkUI_NumberValue value[] = { { .i32 = stickyStyle } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_LIST_STICKY, &item); +} + +void ListComponent::SetListSpace(float space) +{ + ArkUI_NumberValue value[] = { { .f32 = space } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_LIST_SPACE, &item); +} + +void ListComponent::SetListCachedCount(int32_t count) +{ + ArkUI_NumberValue value[] = { { .i32 = count } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_LIST_CACHED_COUNT, &item); +} + +void ListComponent::SetListScrollToIndex(const std::vector& data) +{ + ArkUI_AttributeItem item = { data.data(), static_cast(data.size()) }; + _nodeAPI->setAttribute(_component, NODE_LIST_SCROLL_TO_INDEX, &item); +} + +void ListComponent::SetListAlignListItem(int32_t align) +{ + ArkUI_NumberValue value[] = { { .i32 = align } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_LIST_ALIGN_LIST_ITEM, &item); +} + +void ListComponent::SetListChildrenMainSize(ListChildrenMainSizeOption* mainSize) +{ + ArkUI_AttributeItem item = { .object = mainSize->GetOption() }; + _nodeAPI->setAttribute(_component, NODE_LIST_CHILDREN_MAIN_SIZE, &item); + _childrenMainSize.reset(mainSize); +} + +void ListComponent::SetListInitialIndex(int32_t index) +{ + ArkUI_NumberValue value[] = { { .i32 = index } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_LIST_INITIAL_INDEX, &item); +} + +void ListComponent::SetListDivider(uint32_t color, float width, float distanceStart, float distanceEnd) +{ + ArkUI_NumberValue value[] = { { .u32 = color }, { .f32 = width }, { .f32 = distanceStart }, + { .f32 = distanceEnd } }; + ArkUI_AttributeItem item = { value, 4 }; + _nodeAPI->setAttribute(_component, NODE_LIST_DIVIDER, &item); +} + +void ListItemGroupComponent::SetListItemGroupHeader(Component* node) +{ + ArkUI_AttributeItem item = { nullptr, 0, nullptr, node->GetComponent() }; + _nodeAPI->setAttribute(_component, NODE_LIST_ITEM_GROUP_SET_HEADER, &item); +} + +void ListItemGroupComponent::SetListItemGroupFooter(Component* node) +{ + ArkUI_AttributeItem item = { nullptr, 0, nullptr, node->GetComponent() }; + _nodeAPI->setAttribute(_component, NODE_LIST_ITEM_GROUP_SET_FOOTER, &item); +} + +void ListItemGroupComponent::SetListItemGroupDivider( + uint32_t color, float width, float distanceStart, float distanceEnd) +{ + ArkUI_NumberValue value[] = { { .u32 = color }, { .f32 = width }, { .f32 = distanceStart }, + { .f32 = distanceEnd } }; + ArkUI_AttributeItem item = { value, 4 }; + _nodeAPI->setAttribute(_component, NODE_LIST_ITEM_GROUP_SET_DIVIDER, &item); +} + +void ListItemGroupComponent::SetListItemGroupChildrenMainSize(ListChildrenMainSizeOption* mainSize) +{ + ArkUI_AttributeItem item = { .object = mainSize->GetOption() }; + _nodeAPI->setAttribute(_component, NODE_LIST_ITEM_GROUP_CHILDREN_MAIN_SIZE, &item); + _childrenMainSize.reset(mainSize); +} + +void ListItemGroupAdapter::OnNewItemAttached(ArkUI_NodeAdapterEvent* event) +{ + auto index = OH_ArkUI_NodeAdapterEvent_GetItemIndex(event); + ArkUI_NodeHandle handle = nullptr; + int32_t start = index > 0 ? _groupList[index - 1] : 0, end = _groupList[index]; + if (end - start != 1) { + handle = UpdateNewItemByGroup(start, end); + } else { + handle = UpdateNewItem(start, end); + } + // 设置需要展示的元素。 + OH_ArkUI_NodeAdapterEvent_SetItem(event, handle); +} + +void ListItemGroupAdapter::OnItemDetached(ArkUI_NodeAdapterEvent* event) +{ + auto item = OH_ArkUI_NodeAdapterEvent_GetRemovedNode(event); + if (_removedNodeCallback) { + _removedNodeCallback(std::make_shared(item)); + } + // 放置到缓存池中进行回收复用。 + if (Component(item).GetChildren().size() == 1) { + _cachedListItems.emplace(_listItems[item]); + } else { + _cachedItems.emplace(_items[item]); + } +} + +ArkUI_NodeHandle ListItemGroupAdapter::UpdateNewItemByGroup(int32_t start, int32_t end) +{ + ArkUI_NodeHandle handle = nullptr; + if (!_cachedItems.empty()) { + // 使用并更新回收复用的缓存。 + auto recycledItem = _cachedItems.top(); + recycledItem->RemoveAll(); + for (int32_t i = start; i < end; i++) { + recycledItem->AddChild(_data[i]); + } + handle = recycledItem->GetComponent(); + // 释放缓存池的引用。 + _cachedItems.pop(); + } else { + // 创建新的元素。 + auto groupItem = std::make_shared(); + groupItem->RemoveAll(); + for (int32_t i = start; i < end; i++) { + groupItem->AddChild(_data[i]); + } + groupItem->SetBorderWidth(1); + handle = groupItem->GetComponent(); + // 保持文本列表项的引用。 + _items.emplace(handle, groupItem); + } + return handle; +} + +ArkUI_NodeHandle ListItemGroupAdapter::UpdateNewItem(int32_t start, int32_t end) +{ + ArkUI_NodeHandle handle = nullptr; + if (!_cachedListItems.empty()) { + // 使用并更新回收复用的缓存。 + auto recycledItem = _cachedListItems.top(); + recycledItem->RemoveAll(); + for (int32_t i = start; i < end; i++) { + recycledItem->AddChild(_data[i]); + } + handle = recycledItem->GetComponent(); + // 释放缓存池的引用。 + _cachedListItems.pop(); + } else { + // 创建新的元素。 + auto listItem = std::make_shared(); + listItem->RemoveAll(); + for (int32_t i = start; i < end; i++) { + listItem->AddChild(_data[i]); + } + handle = listItem->GetComponent(); + // 保持文本列表项的引用。 + _listItems.emplace(handle, listItem); + } + return handle; +} +} // namespace ArkUICApiDemo \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/list_component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/list_component.h new file mode 100755 index 000000000..badca14d1 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/list_component.h @@ -0,0 +1,213 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef CAPIDEMO_LIST_COMPONENT_H +#define CAPIDEMO_LIST_COMPONENT_H +#include + +#include "component.h" +#include "node_adapter.h" + +namespace ArkUICApiDemo { + +typedef void (*OnOffsetChangeCallback)(float offset); +typedef void (*OnOffsetChangeWithUserDataCallback)(float offset, void* userData); +typedef void (*OnFinish)(void* userData); + +class ListItemSwipeActionOption { +public: + ListItemSwipeActionOption() : _option(OH_ArkUI_ListItemSwipeActionOption_Create()) {} + ~ListItemSwipeActionOption() + { + OH_ArkUI_ListItemSwipeActionOption_Dispose(_option); + } + + void SetStart(ArkUI_ListItemSwipeActionItem* item); + void SetEnd(ArkUI_ListItemSwipeActionItem* item); + void SetEdgeEffect(ArkUI_ListItemSwipeEdgeEffect edgeEffect); + int32_t GetEdgeEffect(); + void SetOnOffsetChange(OnOffsetChangeCallback callback); + void SetOnOffsetChangWithUserData(OnOffsetChangeWithUserDataCallback callback, void* userData); + + ArkUI_ListItemSwipeActionOption* GetOption() + { + return _option; + } + +private: + ArkUI_ListItemSwipeActionOption* _option; +}; + +class ListItemComponent : public Component { +public: + ListItemComponent() : Component(ARKUI_NODE_LIST_ITEM) {} + explicit ListItemComponent(ArkUI_NodeHandle handle) : Component(handle) {} + + void SetListItemSwiperAction(ListItemSwipeActionOption* option); + std::shared_ptr GetSwipeActionOption() const + { + return _swipeActionOption; + } + void ReleaseSwipeActionOption() + { + _swipeActionOption.reset(); + } + +private: + std::shared_ptr _swipeActionOption; +}; + +class ListChildrenMainSizeOption { +public: + ListChildrenMainSizeOption() : _option(OH_ArkUI_ListChildrenMainSizeOption_Create()) {} + ~ListChildrenMainSizeOption() + { + OH_ArkUI_ListChildrenMainSizeOption_Dispose(_option); + } + int32_t SetDefaultMainSize(float defaultMainSize); + float GetDefaultMainSize(); + void Resize(int32_t totalSize); + int32_t Splice(int32_t index, int32_t deleteCount, int32_t addCount); + int32_t UpdateSize(int32_t index, float mainSize); + float GetMainSize(int32_t index); + + ArkUI_ListChildrenMainSize* GetOption() + { + return _option; + } + +private: + ArkUI_ListChildrenMainSize* _option; +}; + +class ListItemGroupComponent : public Component { +public: + ListItemGroupComponent() : Component(ARKUI_NODE_LIST_ITEM_GROUP) {} + explicit ListItemGroupComponent(ArkUI_NodeHandle handle) : Component(handle) {} + + void SetListItemGroupHeader(Component* node); + void SetListItemGroupFooter(Component* node); + void SetListItemGroupDivider(uint32_t color, float width, float distanceStart, float distanceEnd); + void SetListItemGroupChildrenMainSize(ListChildrenMainSizeOption* mainSize); + + std::shared_ptr GetSizeOption() const + { + return _childrenMainSize; + } + void ReleaseSizeOption() + { + _childrenMainSize.reset(); + } + +private: + std::shared_ptr _childrenMainSize; +}; + +class ListItemGroupAdapter : public ItemAdapter { +public: + explicit ListItemGroupAdapter(std::vector>& dataSource, + const std::vector& groupList) + : ItemAdapter(dataSource) + { + OH_ArkUI_NodeAdapter_SetTotalNodeCount(_adapter, groupList.size()); + int32_t sum = 0; + for (auto& item : groupList) { + sum += item; + _groupList.push_back(sum); + } + } + virtual ~ListItemGroupAdapter() {} + +protected: + void OnNewItemAttached(ArkUI_NodeAdapterEvent* event) override; + void OnItemDetached(ArkUI_NodeAdapterEvent* event) override; + ArkUI_NodeHandle UpdateNewItemByGroup(int32_t start, int32_t end); + ArkUI_NodeHandle UpdateNewItem(int32_t start, int32_t end); + +private: + std::vector _groupList; + // 缓存listItemComponent + std::stack> _cachedListItems; + // 存储list嵌套的单个listItem + std::unordered_map> _listItems; +}; + +class ListComponent : public Component { +public: + ListComponent() : Component(ARKUI_NODE_LIST) {} + explicit ListComponent(ArkUI_NodeHandle handle) : Component(handle) {} + + // 引入懒加载模块。 + void SetLazyAdapter(const std::shared_ptr>& adapter) + { + ArkUI_AttributeItem item { nullptr, 0, nullptr, adapter->GetAdapter() }; + _nodeAPI->setAttribute(_component, NODE_LIST_NODE_ADAPTER, &item); + _adapter = adapter; + } + void SetLazyAdapterByGroup(const std::shared_ptr& adapter) + { + ArkUI_AttributeItem item { nullptr, 0, nullptr, adapter->GetAdapter() }; + _nodeAPI->setAttribute(_component, NODE_LIST_NODE_ADAPTER, &item); + _groupAdapter = adapter; + } + /** + * @param direction ArkUI_Axis + */ + void SetListDirection(int32_t direction); + /** + * @param stickyStyle ArkUI_StickyStyle + */ + void SetListSticky(int32_t stickyStyle); + void SetListSpace(float space); + void SetListCachedCount(int32_t count); + /** + * data[0].i32:The index value of the target element to be slid to in the current container.\n + * data[1]?.i32:Set whether there is an action when sliding to the index value of a list item in the list, where + * 1 indicates an action and 0 indicates no action. Default value: 0。\n + * data[2]?.i32:ArkUI_ScrollAlignment + */ + void SetListScrollToIndex(const std::vector& data); + /** + * @param align ArkUI_ListItemAlignment + */ + void SetListAlignListItem(int32_t align); + void SetListChildrenMainSize(ListChildrenMainSizeOption* mainSize); + void SetListInitialIndex(int32_t index); + void SetListDivider(uint32_t color, float width, float distanceStart, float distanceEnd); + + std::shared_ptr> GetAdapter() const + { + return _adapter; + } + std::shared_ptr GetGroupAdapter() const + { + return _groupAdapter; + } + std::shared_ptr GetSizeOption() const + { + return _childrenMainSize; + } + void ReleaseSizeOption() + { + _childrenMainSize.reset(); + } + +private: + std::shared_ptr> _adapter; + std::shared_ptr _groupAdapter; + std::shared_ptr _childrenMainSize; +}; +} // namespace ArkUICApiDemo +#endif // CAPIDEMO_LIST_COMPONENT_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/node_adapter.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/node_adapter.h new file mode 100755 index 000000000..7cb050553 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/node_adapter.h @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_NODE_ADAPTER_H +#define ARKUI_CAPI_DEMO_NODE_ADAPTER_H + +#include +#include +#include +#include +#include +#include + +#include "column_component.h" +namespace ArkUICApiDemo { +using AllItemCallBack = std::function, uint32_t)>; + +template +class ItemAdapter { +public: + explicit ItemAdapter(std::vector>& dataSource); + virtual ~ItemAdapter(); + ArkUI_NodeAdapterHandle GetAdapter() const + { + return _adapter; + } + void RemoveItem(int32_t index); + void RemoveItems(int32_t startPosition, int32_t itemCount); + void InsertItem(int32_t index, const std::shared_ptr& value); + void InsertItems(int32_t index, std::vector>& dataSource); + void MoveItem(int32_t oldIndex, int32_t newIndex); + void ReloadItem(int32_t index, const std::shared_ptr& value); + void ReloadItems(int32_t startPosition, std::vector>& dataSource); + void ReloadAllItem(); + void SetAllItem(AllItemCallBack callback); + void UnregisterEventReceiver(); + void SetNodeAdapterEvent(const std::function& callback); + void RegisterRemovedNodeCallback(std::function)> callback) + { + _removedNodeCallback = callback; + } + void SetTotalNodeCount(uint32_t count) + { + OH_ArkUI_NodeAdapter_SetTotalNodeCount(_adapter, count); + } + uint32_t GetTotalNodeCount() + { + return OH_ArkUI_NodeAdapter_GetTotalNodeCount(_adapter); + } + +protected: + static void OnStaticAdapterEvent(ArkUI_NodeAdapterEvent* event); + virtual void OnAdapterEvent(ArkUI_NodeAdapterEvent* event); + // 分配ID给需要显示的Item,用于ReloadAllItems场景的元素diff。 + virtual void OnNewItemIdCreated(ArkUI_NodeAdapterEvent* event); + // 需要新的Item显示在可见区域。 + virtual void OnNewItemAttached(ArkUI_NodeAdapterEvent* event); + // Item从可见区域移除。 + virtual void OnItemDetached(ArkUI_NodeAdapterEvent* event); + + std::vector> _data; + ArkUI_NativeNodeAPI_1* _nodeAPI = nullptr; + ArkUI_NodeAdapterHandle _adapter = nullptr; + // 管理NodeAdapter生成的元素。 + std::unordered_map> _items; + // 管理回收复用组件池。 + std::stack> _cachedItems; + std::function _eventCallBack; + std::function)> _removedNodeCallback; +}; + +template +ItemAdapter::ItemAdapter(std::vector>& dataSource) + : _adapter(OH_ArkUI_NodeAdapter_Create()) +{ + // 使用NodeAdapter创建函数。 + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, _nodeAPI); + std::swap(_data, dataSource); + // 设置懒加载数据。 + OH_ArkUI_NodeAdapter_SetTotalNodeCount(_adapter, _data.size()); + // 设置懒加载回调事件。 + OH_ArkUI_NodeAdapter_RegisterEventReceiver(_adapter, this, OnStaticAdapterEvent); +} + +template +ItemAdapter::~ItemAdapter() +{ + // 释放创建的组件。 + while (!_cachedItems.empty()) { + _cachedItems.pop(); + } + _items.clear(); + // 释放Adapter相关资源。 + OH_ArkUI_NodeAdapter_UnregisterEventReceiver(_adapter); + OH_ArkUI_NodeAdapter_Dispose(_adapter); +} + +template +void ItemAdapter::RemoveItem(int32_t index) +{ + // 删除第index个数据。 + _data.erase(_data.begin() + index); + // 如果index会导致可视区域元素发生可见性变化,则会回调NODE_ADAPTER_EVENT_ON_REMOVE_NODE_FROM_ADAPTER事件删除元素, + // 根据是否有新增元素回调NODE_ADAPTER_EVENT_ON_GET_NODE_ID和NODE_ADAPTER_EVENT_ON_ADD_NODE_TO_ADAPTER事件。 + OH_ArkUI_NodeAdapter_RemoveItem(_adapter, index, 1); + // 更新新的数量。 + OH_ArkUI_NodeAdapter_SetTotalNodeCount(_adapter, _data.size()); +} + +template +void ItemAdapter::RemoveItems(int32_t startPosition, int32_t itemCount) +{ + auto end = _data.begin() + startPosition + itemCount; + if (startPosition + itemCount > _data.size()) { + end = _data.end(); + } + _data.erase(_data.begin() + startPosition, end); + OH_ArkUI_NodeAdapter_RemoveItem(_adapter, startPosition, itemCount); + // 更新新的数量。 + OH_ArkUI_NodeAdapter_SetTotalNodeCount(_adapter, _data.size()); +} + +template +void ItemAdapter::InsertItem(int32_t index, const std::shared_ptr& value) +{ + _data.insert(_data.begin() + index, value); + // 如果index会导致可视区域元素发生可见性变化,则会回调NODE_ADAPTER_EVENT_ON_GET_NODE_ID和NODE_ADAPTER_EVENT_ON_ADD_NODE_TO_ADAPTER事件, + // 根据是否有删除元素回调NODE_ADAPTER_EVENT_ON_REMOVE_NODE_FROM_ADAPTER事件。 + OH_ArkUI_NodeAdapter_InsertItem(_adapter, index, 1); + // 更新新的数量。 + OH_ArkUI_NodeAdapter_SetTotalNodeCount(_adapter, _data.size()); +} + +template +void ItemAdapter::InsertItems(int32_t index, std::vector>& dataSource) +{ + _data.insert(_data.begin() + index, dataSource.begin(), dataSource.end()); + OH_ArkUI_NodeAdapter_InsertItem(_adapter, index, dataSource.size()); + OH_ArkUI_NodeAdapter_SetTotalNodeCount(_adapter, _data.size()); +} + +template +void ItemAdapter::MoveItem(int32_t oldIndex, int32_t newIndex) +{ + auto temp = _data[oldIndex]; + _data.insert(_data.begin() + newIndex, temp); + _data.erase(_data.begin() + oldIndex); + // 移到位置如果未发生可视区域内元素的可见性变化,则不回调事件,反之根据新增和删除场景回调对应的事件。 + OH_ArkUI_NodeAdapter_MoveItem(_adapter, oldIndex, newIndex); +} + +template +void ItemAdapter::ReloadItem(int32_t index, const std::shared_ptr& value) +{ + _data[index] = value; + // 如果index位于可视区域内,先回调NODE_ADAPTER_EVENT_ON_REMOVE_NODE_FROM_ADAPTER删除老元素, + // 再回调NODE_ADAPTER_EVENT_ON_GET_NODE_ID和NODE_ADAPTER_EVENT_ON_ADD_NODE_TO_ADAPTER事件。 + OH_ArkUI_NodeAdapter_ReloadItem(_adapter, index, 1); +} + +template +void ItemAdapter::ReloadItems(int32_t startPosition, std::vector>& dataSource) +{ + if (startPosition + dataSource.size() > _data.size()) { + // 防止nodeAdapter崩溃 + return; + } + for (int32_t i = 0; i < dataSource.size(); i++) { + _data[startPosition + i] = dataSource[i]; + } + // 如果index位于可视区域内,先回调NODE_ADAPTER_EVENT_ON_REMOVE_NODE_FROM_ADAPTER删除老元素, + // 再回调NODE_ADAPTER_EVENT_ON_GET_NODE_ID和NODE_ADAPTER_EVENT_ON_ADD_NODE_TO_ADAPTER事件。 + OH_ArkUI_NodeAdapter_ReloadItem(_adapter, startPosition, dataSource.size()); +} + +template +void ItemAdapter::SetAllItem(AllItemCallBack callback) +{ + ArkUI_NodeHandle* items = nullptr; + uint32_t size = 0; + OH_ArkUI_NodeAdapter_GetAllItems(_adapter, &items, &size); + for (uint32_t i = 0; i < size; i++) { + if (!items[i]) + continue; + auto temp = std::make_shared(items[i]); + if (callback) { + callback(temp, i); + } + } +} + +template +void ItemAdapter::UnregisterEventReceiver() +{ + OH_ArkUI_NodeAdapter_UnregisterEventReceiver(_adapter); +} + +template +void ItemAdapter::SetNodeAdapterEvent(const std::function& callback) +{ + _eventCallBack = callback; +} + +template +void ItemAdapter::ReloadAllItem() +{ + std::reverse(_data.begin(), _data.end()); + // 全部重新加载场景下,会回调NODE_ADAPTER_EVENT_ON_GET_NODE_ID接口获取新的组件ID, + // 根据新的组件ID进行对比,ID不发生变化的进行复用, + // 针对新增ID的元素,调用NODE_ADAPTER_EVENT_ON_ADD_NODE_TO_ADAPTER事件创建新的组件, + // 然后判断老数据中遗留的未使用ID,调用NODE_ADAPTER_EVENT_ON_REMOVE_NODE_FROM_ADAPTER删除老元素。 + OH_ArkUI_NodeAdapter_ReloadAllItems(_adapter); +} + +template +void ItemAdapter::OnStaticAdapterEvent(ArkUI_NodeAdapterEvent* event) +{ + // 获取实例对象,回调实例事件。 + auto itemAdapter = reinterpret_cast(OH_ArkUI_NodeAdapterEvent_GetUserData(event)); + itemAdapter->OnAdapterEvent(event); +} + +template +void ItemAdapter::OnAdapterEvent(ArkUI_NodeAdapterEvent* event) +{ + auto type = OH_ArkUI_NodeAdapterEvent_GetType(event); + switch (type) { + case NODE_ADAPTER_EVENT_WILL_ATTACH_TO_NODE: + break; + case NODE_ADAPTER_EVENT_WILL_DETACH_FROM_NODE: + break; + case NODE_ADAPTER_EVENT_ON_GET_NODE_ID: + OnNewItemIdCreated(event); + break; + case NODE_ADAPTER_EVENT_ON_ADD_NODE_TO_ADAPTER: + OnNewItemAttached(event); + break; + case NODE_ADAPTER_EVENT_ON_REMOVE_NODE_FROM_ADAPTER: + OnItemDetached(event); + break; + default: + break; + } + if (_eventCallBack) + _eventCallBack(event); +} +template +void ItemAdapter::OnNewItemIdCreated(ArkUI_NodeAdapterEvent* event) +{ + auto index = OH_ArkUI_NodeAdapterEvent_GetItemIndex(event); + static std::hash hashId = std::hash(); + auto id = hashId(std::to_string(index)); + OH_ArkUI_NodeAdapterEvent_SetNodeId(event, id); +} + +// 需要新的Item显示在可见区域。 +template +void ItemAdapter::OnNewItemAttached(ArkUI_NodeAdapterEvent* event) +{ + auto index = OH_ArkUI_NodeAdapterEvent_GetItemIndex(event); + ArkUI_NodeHandle handle = nullptr; + auto showNode = _data[index]; + if (!_cachedItems.empty()) { + // 使用并更新回收复用的缓存。 + auto recycledItem = _cachedItems.top(); + recycledItem->RemoveAll(); + recycledItem->AddChild(showNode); + handle = recycledItem->GetComponent(); + // 释放缓存池的引用。 + _cachedItems.pop(); + } else { + // 创建新的元素。 + auto flowItem = std::make_shared(); + flowItem->RemoveAll(); + flowItem->AddChild(showNode); + handle = flowItem->GetComponent(); + // 保持文本列表项的引用。 + _items.emplace(handle, flowItem); + } + // 设置需要展示的元素。 + OH_ArkUI_NodeAdapterEvent_SetItem(event, handle); +} + +// Item从可见区域移除。 +template +void ItemAdapter::OnItemDetached(ArkUI_NodeAdapterEvent* event) +{ + auto item = OH_ArkUI_NodeAdapterEvent_GetRemovedNode(event); + if (_removedNodeCallback) { + _removedNodeCallback(std::make_shared(item)); + } + // 放置到缓存池中进行回收复用。 + _cachedItems.emplace(_items[item]); +} +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_NODE_ADAPTER_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/radio_component.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/component/radio_component.cpp new file mode 100755 index 000000000..02c85ad2b --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/radio_component.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2024 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 "radio_component.h" + +#include + +namespace ArkUICApiDemo { +constexpr size_t ALLOW_SIZE_3 = 3; +void RadioComponent::SetChecked(const bool& isChecked) +{ + ArkUI_NumberValue value[] = { { .i32 = static_cast(isChecked) } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_RADIO_CHECKED, &item); +} +void RadioComponent::SetGroup(const std::string& group) +{ + ArkUI_AttributeItem item = { .string = group.c_str() }; + _nodeAPI->setAttribute(_component, NODE_RADIO_GROUP, &item); +} +void RadioComponent::SetStyled(const uint32_t* colorArray, size_t size) +{ + if (size == ALLOW_SIZE_3) { + ArkUI_NumberValue radioStyle_value[] = { { .u32 = colorArray[0] }, { .u32 = colorArray[1] }, + { .u32 = colorArray[2] } }; + ArkUI_AttributeItem radioStyle_value_item = { radioStyle_value, ALLOW_SIZE_3 }; + _nodeAPI->setAttribute(_component, NODE_RADIO_STYLE, &radioStyle_value_item); + } +} +void RadioComponent::SetValue(const std::string& value) +{ + ArkUI_AttributeItem item = { .string = value.c_str() }; + _nodeAPI->setAttribute(_component, NODE_RADIO_VALUE, &item); +} +} // namespace ArkUICApiDemo diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/radio_component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/radio_component.h new file mode 100755 index 000000000..244feba45 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/radio_component.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_RADIO_COMPONENT_H +#define ARKUI_CAPI_DEMO_RADIO_COMPONENT_H + +#include +#include + +#include "component.h" + +namespace ArkUICApiDemo { +class RadioComponent : public Component { +public: + RadioComponent() : Component(ARKUI_NODE_RADIO) {} + explicit RadioComponent(ArkUI_NodeHandle handle) : Component(handle) {} + + void SetChecked(const bool& isChecked); + void SetGroup(const std::string& group); + void SetStyled(const uint32_t* colorArray, size_t size); + void SetValue(const std::string& value); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_RADIO_COMPONENT_H \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/refresh_component.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/component/refresh_component.cpp new file mode 100755 index 000000000..8b4e85c17 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/refresh_component.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024 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 "refresh_component.h" + +#include + +namespace ArkUICApiDemo { + +void RefreshComponent::SetPullToRefresh(int32_t pullToRefresh) +{ + ArkUI_NumberValue value[] = { { .i32 = pullToRefresh } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_REFRESH_PULL_TO_REFRESH, &item); +} +void RefreshComponent::SetPullDownRatio(float pullDownRatio) +{ + ArkUI_NumberValue value[] = { { .f32 = pullDownRatio } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_REFRESH_PULL_DOWN_RATIO, &item); +} +void RefreshComponent::SetRefreshOffset(float refreshOffset) +{ + ArkUI_NumberValue value[] = { { .f32 = refreshOffset } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_REFRESH_OFFSET, &item); +} +void RefreshComponent::SetRefreshing(bool refreshing) +{ + ArkUI_NumberValue value[] = { { .i32 = refreshing } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_REFRESH_REFRESHING, &item); +} +} // namespace ArkUICApiDemo diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/refresh_component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/refresh_component.h new file mode 100755 index 000000000..cee764567 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/refresh_component.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_REFRESH_COMPONENT_H +#define ARKUI_CAPI_DEMO_REFRESH_COMPONENT_H + +#include + +#include "component.h" + +namespace ArkUICApiDemo { +class RefreshComponent : public Component { +public: + RefreshComponent() : Component(ARKUI_NODE_REFRESH) {} + explicit RefreshComponent(ArkUI_NodeHandle handle) : Component(handle) {} + void SetPullToRefresh(int32_t pullToRefresh); + void SetPullDownRatio(float pullDownRatio); + void SetRefreshOffset(float refreshOffset); + void SetRefreshing(bool refreshing); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_REFRESH_COMPONENT_H \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/relativecontainer_component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/relativecontainer_component.h new file mode 100755 index 000000000..1c1589619 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/relativecontainer_component.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_RELATIVECONTAINER_COMPONENT_H +#define ARKUI_CAPI_DEMO_RELATIVECONTAINER_COMPONENT_H + +#include +#include + +#include "./relativeContainer/ruleOption.h" +#include "component.h" +namespace ArkUICApiDemo { +class RelativeContainerComponent : public Component { +public: + RelativeContainerComponent() : Component(ARKUI_NODE_RELATIVE_CONTAINER) {} + RelativeContainerComponent(ArkUI_NodeHandle handle) : Component(handle) {} + ~RelativeContainerComponent() = default; + + void SetRelativeContainerGuideLine(const std::shared_ptr guidelineOption) + { + ArkUI_AttributeItem item = { .object = guidelineOption->GetOption() }; + _nodeAPI->setAttribute(_component, NODE_RELATIVE_CONTAINER_GUIDE_LINE, &item); + guidelineOption_ = guidelineOption; + } + + void SetRelativeContainerBarrier(const std::shared_ptr barrierOption) + { + ArkUI_AttributeItem item = { .object = barrierOption->GetOption() }; + _nodeAPI->setAttribute(_component, NODE_RELATIVE_CONTAINER_BARRIER, &item); + barrierOption_ = barrierOption; + } + + std::shared_ptr GetRuleOption() const + { + return ruleOption_; + } + std::shared_ptr GetGuideLineOption() const + { + return guidelineOption_; + } + std::shared_ptr GetBarrierOption() const + { + return barrierOption_; + } + +private: + std::shared_ptr ruleOption_ = nullptr; + std::shared_ptr guidelineOption_ = nullptr; + std::shared_ptr barrierOption_ = nullptr; +}; +; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_RELATIVECONTAINER_COMPONENT_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/row_component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/row_component.h new file mode 100755 index 000000000..397e6c682 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/row_component.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_ROW_COMPONENT_H +#define ARKUI_CAPI_DEMO_ROW_COMPONENT_H + +#include "component.h" +namespace ArkUICApiDemo { +class RowComponent : public Component { +public: + RowComponent() : Component(ARKUI_NODE_ROW) {} + RowComponent(ArkUI_NodeHandle handle) : Component(handle) {} + + void SetAlignItems(int32_t verticalAlign) + { + ArkUI_NumberValue value[] = { { .i32 = verticalAlign } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_ROW_ALIGN_ITEMS, &item); + } + void SetJustifyContent(int32_t flexAlign) + { + ArkUI_NumberValue value[] = { { .i32 = flexAlign } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_ROW_JUSTIFY_CONTENT, &item); + } +}; +} // namespace ArkUICApiDemo + +#endif // ARKUI_CAPI_DEMO_ROW_COMPONENT_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/scroll_component.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/component/scroll_component.cpp new file mode 100755 index 000000000..b717da4b2 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/scroll_component.cpp @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2024 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 "scroll_component.h" +namespace ArkUICApiDemo { + +void ScrollComponent::SetScrollScrollBar(int32_t barState) +{ + ArkUI_NumberValue value[] = { { .i32 = barState } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_BAR_DISPLAY_MODE, &item); +} +void ScrollComponent::SetScrollScrollBarWidth(float width) +{ + ArkUI_NumberValue value[] = { { .f32 = width } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_BAR_WIDTH, &item); +} +void ScrollComponent::SetScrollScrollBarColor(uint32_t color) +{ + ArkUI_NumberValue value[] = { { .u32 = color } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_BAR_COLOR, &item); +} +void ScrollComponent::SetScrollScrollable(int32_t scrollable) +{ + ArkUI_NumberValue value[] = { { .i32 = scrollable } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_SCROLL_DIRECTION, &item); +} +void ScrollComponent::SetScrollEdgeEffect(int32_t edgeEffect, bool alwaysEnabled) +{ + ArkUI_NumberValue value[] = { { .i32 = edgeEffect }, { .i32 = alwaysEnabled } }; + ArkUI_AttributeItem item = { value, 2 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_EDGE_EFFECT, &item); +} +void ScrollComponent::SetScrollEnableScrollInteraction(bool enableScrollInteraction) +{ + ArkUI_NumberValue value[] = { { .i32 = enableScrollInteraction } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_ENABLE_SCROLL_INTERACTION, &item); +} +void ScrollComponent::SetScrollFriction(float friction) +{ + ArkUI_NumberValue value[] = { { .f32 = friction } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_FRICTION, &item); +} +void ScrollComponent::SetScrollScrollSnap( + int32_t snapAlign, int32_t enableSnapToStart, int32_t enableSnapToEnd, const std::vector& pagination) +{ + auto value = new ArkUI_NumberValue[3 + static_cast(pagination.size())]; + value[0] = { .i32 = snapAlign }; + value[1] = { .i32 = enableSnapToStart }; + value[2] = { .i32 = enableSnapToEnd }; + for (int32_t i = 0; i < pagination.size(); i++) { + value[3 + i] = { .f32 = pagination[i] }; + } + ArkUI_AttributeItem item = { value, 3 + static_cast(pagination.size()) }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_SNAP, &item); +} +void ScrollComponent::SetScrollNestedScroll(int32_t forward, int32_t backward) +{ + ArkUI_NumberValue value[] = { { .i32 = forward }, { .i32 = backward } }; + ArkUI_AttributeItem item = { value, 2 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_NESTED_SCROLL, &item); +} +void ScrollComponent::SetScrollTo(float hOffset, float vOffset, const std::vector& optionalParams) +{ + auto value = new ArkUI_NumberValue[2 + static_cast(optionalParams.size())]; + value[0] = { .f32 = hOffset }; + value[1] = { .f32 = vOffset }; + for (int32_t i = 0; i < optionalParams.size(); i++) { + value[2 + i] = { .i32 = optionalParams[i] }; + } + ArkUI_AttributeItem item = { value, 2 + static_cast(optionalParams.size()) }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_OFFSET, &item); +} +void ScrollComponent::SetScrollEdge(int32_t type) +{ + ArkUI_NumberValue value[] = { { .i32 = type } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_EDGE, &item); +} +void ScrollComponent::SetScrollEnablePaging(int32_t enablePaging) +{ + ArkUI_NumberValue value[] = { { .i32 = enablePaging } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_ENABLE_PAGING, &item); +} +void ScrollComponent::SetScrollPage(int32_t next) +{ + ArkUI_NumberValue value[] = { { .i32 = next } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_PAGE, &item); +} +void ScrollComponent::SetScrollPage(int32_t next, int32_t animation) +{ + ArkUI_NumberValue value[] = { { .i32 = next }, { .i32 = animation } }; + ArkUI_AttributeItem item = { value, 2 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_PAGE, &item); +} +void ScrollComponent::SetScrollBy(float hDistance, float vDistance) +{ + ArkUI_NumberValue value[] = { { .f32 = hDistance }, { .f32 = vDistance } }; + ArkUI_AttributeItem item = { value, 2 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_BY, &item); +} +void ScrollComponent::SetScrollScrollDirection(int32_t direction) +{ + ArkUI_NumberValue value[] = { { .i32 = direction } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_SCROLL_DIRECTION, &item); +} +void ScrollComponent::AddChildWithNumber(int32_t number, ArkUI_NodeType type) +{ + SetBorderWidth(2); + auto node = std::make_shared(type); + if (type == ARKUI_NODE_LIST) { + ArkUI_NumberValue value[] = { { .i32 = ARKUI_AXIS_HORIZONTAL } }; + ArkUI_AttributeItem item = { value, 1 }; + node->setAttribute(NODE_LIST_DIRECTION, &item); + node->SetMargin(DEFAULT_MARGIN); + } + for (int32_t i = 0; i < number; ++i) { + auto column = std::make_shared(ARKUI_NODE_COLUMN); + column->SetWidth(SIZE_50); + column->SetHeight(SIZE_50); + column->SetMargin(DEFAULT_MARGIN); + if (number == 0) { + number = 1; + } + column->SetBackgroundColor((i * 0xFFFFFF / number) | 0xFF000000); + node->AddChild(column); + } + AddChild(node); +} +} // namespace ArkUICApiDemo \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/scroll_component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/scroll_component.h new file mode 100755 index 000000000..1e221aed7 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/scroll_component.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef CAPIDEMO_SCROLL_COMPONENT_H +#define CAPIDEMO_SCROLL_COMPONENT_H + +#include "component.h" + +namespace ArkUICApiDemo { +class ScrollComponent : public Component { +public: + ScrollComponent() : Component(ARKUI_NODE_SCROLL) {} + explicit ScrollComponent(ArkUI_NodeHandle handle) : Component(handle) {} + + void SetScrollScrollBar(int32_t barState); + void SetScrollScrollBarWidth(float width); + void SetScrollScrollBarColor(uint32_t color); + void SetScrollScrollable(int32_t scrollable); + void SetScrollEdgeEffect(int32_t edgeEffect, bool alwaysEnabled); + void SetScrollEnableScrollInteraction(bool enableScrollInteraction); + void SetScrollFriction(float friction); + void SetScrollScrollSnap( + int32_t snapAlign, int32_t enableSnapToStart, int32_t enableSnapToEnd, const std::vector& pagination); + void SetScrollNestedScroll(int32_t forward, int32_t backward); + /** + * @brief Set the scroll position to the specified offset. + * @param hOffset horizontal scrolling offset + * @param vOffset vertical scrolling offset + * @param optionalParams + * [0] scrolling duration, in milliseconds. + * [1] scrolling curve. The parameter type is ArkUI_AnimationCurve. + * [2] whether to enable the default spring animation. + * [3] sets whether scrolling can cross the boundary. + */ + void SetScrollTo(float hOffset, float vOffset, const std::vector& optionalParams); + void SetScrollEdge(int32_t type); + void SetScrollEnablePaging(int32_t enablePaging); + void SetScrollPage(int32_t next); + void SetScrollPage(int32_t next, int32_t animation); + void SetScrollBy(float hDistance, float vDistance); + void SetScrollScrollDirection(int32_t direction); + void AddChildWithNumber(int32_t number, ArkUI_NodeType type); +}; +} // namespace ArkUICApiDemo +#endif // CAPIDEMO_SCROLL_COMPONENT_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/swiper_component.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/component/swiper_component.cpp new file mode 100755 index 000000000..65b384998 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/swiper_component.cpp @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2024 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 "swiper_component.h" + +namespace ArkUICApiDemo { + +void SwiperComponent::SetSwiperLoop(int32_t loop) +{ + ArkUI_NumberValue value[] = { { .i32 = loop } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SWIPER_LOOP, &item); +} + +void SwiperComponent::SetSwiperAutoPlay(int32_t playValue) +{ + ArkUI_NumberValue value[] = { { .i32 = playValue } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SWIPER_AUTO_PLAY, &item); +} + +void SwiperComponent::SetSwiperPrevMigration(float migration, int32_t ignoreBlank) +{ + ArkUI_NumberValue value[] = { { .f32 = migration }, { .i32 = ignoreBlank } }; + ArkUI_AttributeItem item = { value, sizeof(value) / sizeof(ArkUI_NumberValue) }; + _nodeAPI->setAttribute(_component, NODE_SWIPER_PREV_MARGIN, &item); +} + +void SwiperComponent::SetSwiperNextMigration(float migration, int32_t ignoreBlank) +{ + ArkUI_NumberValue value[] = { { .f32 = migration }, { .i32 = ignoreBlank } }; + ArkUI_AttributeItem item = { value, sizeof(value) / sizeof(ArkUI_NumberValue) }; + _nodeAPI->setAttribute(_component, NODE_SWIPER_NEXT_MARGIN, &item); +} + +void SwiperComponent::SetSwiperDisplayCount(int32_t count) +{ + ArkUI_NumberValue value[] = { { .i32 = count } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SWIPER_DISPLAY_COUNT, &item); +} + +void SwiperComponent::SetSwiperIndex(int32_t index) +{ + ArkUI_NumberValue value[] = { { .i32 = index } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SWIPER_INDEX, &item); +} + +void SwiperComponent::SetSwiperVertical(int32_t index) +{ + ArkUI_NumberValue value[] = { { .i32 = index } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SWIPER_VERTICAL, &item); +} + +void SwiperComponent::SetSwiperEffectMode(int32_t effect) +{ + ArkUI_NumberValue value[] = { { .i32 = effect } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SWIPER_EDGE_EFFECT_MODE, &item); +} + +void SwiperComponent::SetSwiperNestedScroll(int32_t nestedScroll) +{ + ArkUI_NumberValue value[] = { { .i32 = nestedScroll } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SWIPER_NESTED_SCROLL, &item); +} + +void SwiperComponent::SetSwiperInterval(float interval) +{ + ArkUI_NumberValue value[] = { { .f32 = interval } }; + ArkUI_AttributeItem item = { value, sizeof(value) / sizeof(ArkUI_NumberValue) }; + _nodeAPI->setAttribute(_component, NODE_SWIPER_INTERVAL, &item); +} + +void SwiperComponent::SetSwiperDirection(int32_t direction) +{ + ArkUI_NumberValue value[] = { { .i32 = direction } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_DIRECTION, &item); +} + +void SwiperComponent::SetSwiperIndicator(ArkUI_SwiperIndicator* indicator) +{ + ArkUI_NumberValue indicator_value[] = { { .i32 = ARKUI_SWIPER_INDICATOR_TYPE_DOT } }; + ArkUI_AttributeItem indicator_item = { indicator_value, sizeof(indicator_value) / sizeof(ArkUI_NumberValue), "", + indicator }; + _nodeAPI->setAttribute(_component, NODE_SWIPER_INDICATOR, &indicator_item); +} + +void SwiperComponent::SetSwiperToIndex(int32_t index, int32_t useAnimation) +{ + ArkUI_NumberValue value[] = { { .i32 = index }, { .i32 = useAnimation } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SWIPER_SWIPE_TO_INDEX, &item); +} + +void SwiperComponent::RegisterOnGesture(const std::function& onGesture) +{ + onGesture_ = onGesture; + _nodeAPI->registerNodeEvent(_component, NODE_SWIPER_EVENT_ON_GESTURE_SWIPE, 0, nullptr); +} + +void SwiperComponent::RegisterOnChange(const std::function& onChange) +{ + onChange_ = onChange; + _nodeAPI->registerNodeEvent(_component, NODE_SWIPER_EVENT_ON_CHANGE, 0, nullptr); +} + +void SwiperComponent::RegisterOnDidScrollContext(const std::function& onDid) +{ + onDid_ = onDid; + _nodeAPI->registerNodeEvent(_component, NODE_SWIPER_EVENT_ON_CONTENT_DID_SCROLL, 0, nullptr); +} + +void SwiperComponent::RegisterOnAnimationStart(const std::function& onStart) +{ + onStart_ = onStart; + _nodeAPI->registerNodeEvent(_component, NODE_SWIPER_EVENT_ON_ANIMATION_START, 0, nullptr); +} + +void SwiperComponent::RegisterOnAnimationEnd(const std::function& onEnd) +{ + onEnd_ = onEnd; + _nodeAPI->registerNodeEvent(_component, NODE_SWIPER_EVENT_ON_ANIMATION_END, 0, nullptr); +} + +void SwiperComponent::OnNodeEvent(ArkUI_NodeEvent* event) +{ + auto eventType = OH_ArkUI_NodeEvent_GetEventType(event); + switch (eventType) { + case NODE_SWIPER_EVENT_ON_GESTURE_SWIPE: + if (onGesture_) { + onGesture_(event); + } + break; + case NODE_SWIPER_EVENT_ON_CHANGE: + if (onChange_) { + onChange_(event); + } + break; + case NODE_SWIPER_EVENT_ON_CONTENT_DID_SCROLL: + if (onDid_) { + onDid_(event); + } + break; + case NODE_SWIPER_EVENT_ON_ANIMATION_START: + if (onStart_) { + onStart_(event); + } + break; + case NODE_SWIPER_EVENT_ON_ANIMATION_END: + if (onEnd_) { + onEnd_(event); + } + break; + default: + break; + } +} +} // namespace ArkUICApiDemo \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/swiper_component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/swiper_component.h new file mode 100755 index 000000000..e4d1349cb --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/swiper_component.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef CAPIDEMO_SWIPER_COMPONENT_H +#define CAPIDEMO_SWIPER_COMPONENT_H + +#include + +#include "component.h" +#include "node_adapter.h" + +namespace ArkUICApiDemo { +class SwiperComponent : public Component { +public: + SwiperComponent() : Component(ARKUI_NODE_SWIPER) {} + explicit SwiperComponent(ArkUI_NodeHandle handle) : Component(handle) {} + + void SetSwiperLoop(int32_t loop); + void SetSwiperAutoPlay(int32_t playValue); + void SetSwiperPrevMigration(float migration, int32_t ignoreBlank = false); + void SetSwiperNextMigration(float migration, int32_t ignoreBlank = false); + void SetSwiperDisplayCount(int32_t count); + void SetSwiperIndex(int32_t index); + void SetSwiperVertical(int32_t index); + void SetSwiperNestedScroll(int32_t nestedScroll); + void SetSwiperEffectMode(int32_t effect); + void SetSwiperInterval(float interval); + void SetSwiperDirection(int32_t direction); + void SetSwiperIndicator(ArkUI_SwiperIndicator* indicator); + void SetSwiperToIndex(int32_t index, int32_t useAnimation = false); + void RegisterOnGesture(const std::function& onGesture); + void RegisterOnChange(const std::function& onChange); + void RegisterOnDidScrollContext(const std::function& onDid); + void RegisterOnAnimationStart(const std::function& onStart); + void RegisterOnAnimationEnd(const std::function& onEnd); + void OnNodeEvent(ArkUI_NodeEvent* event) override; + + std::function onGesture_; + std::function onDid_; + std::function onChange_; + std::function onStart_; + std::function onEnd_; +}; +} // namespace ArkUICApiDemo +#endif // CAPIDEMO_SWIPER_COMPONENT_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/text_component.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/component/text_component.cpp new file mode 100755 index 000000000..d1d1f8826 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/text_component.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2024 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 "text_component.h" + +namespace ArkUICApiDemo { + +void TextComponent::SetFontSize(float fontSize) +{ + ArkUI_NumberValue value[] = { { .f32 = fontSize } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_FONT_SIZE, &item); +} +void TextComponent::SetFontColor(uint32_t color) +{ + ArkUI_NumberValue value[] = { { .u32 = color } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_FONT_COLOR, &item); +} +void TextComponent::SetTextContent(const std::string& content) +{ + ArkUI_AttributeItem item = { nullptr, 0, content.c_str() }; + _nodeAPI->setAttribute(_component, NODE_TEXT_CONTENT, &item); +} +void TextComponent::SetTextAlign(ArkUI_TextAlignment align) +{ + ArkUI_NumberValue value[] = { { .i32 = align } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_TEXT_ALIGN, &item); +} +} // namespace ArkUICApiDemo diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/text_component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/text_component.h new file mode 100755 index 000000000..c5f2e4f1f --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/text_component.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_TEXT_COMPONENT_H +#define ARKUI_CAPI_DEMO_TEXT_COMPONENT_H + +#include + +#include "component.h" + +namespace ArkUICApiDemo { +class TextComponent : public Component { +public: + TextComponent() : Component(ARKUI_NODE_TEXT) {} + explicit TextComponent(ArkUI_NodeHandle handle) : Component(handle) {} + void SetFontSize(float fontSize) override; + void SetFontColor(uint32_t color); + void SetTextContent(const std::string& content); + void SetTextAlign(ArkUI_TextAlignment align); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_TEXT_COMPONENT_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/waterflow_component.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/component/waterflow_component.cpp new file mode 100755 index 000000000..f1540cb2f --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/waterflow_component.cpp @@ -0,0 +1,296 @@ +/* + * Copyright (c) 2024 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 "waterflow_component.h" + +namespace ArkUICApiDemo { + +void WaterFlowSectionOption::SetSection(int32_t index, WaterFlowSection section) +{ + OH_ArkUI_WaterFlowSectionOption_SetItemCount(_option, index, section.itemsCount); + OH_ArkUI_WaterFlowSectionOption_SetCrossCount(_option, index, section.crossCount); + OH_ArkUI_WaterFlowSectionOption_SetColumnGap(_option, index, section.columnsGap); + OH_ArkUI_WaterFlowSectionOption_SetRowGap(_option, index, section.rowsGap); + OH_ArkUI_WaterFlowSectionOption_SetMargin( + _option, index, section.margin.top, section.margin.right, section.margin.bottom, section.margin.left); + OH_ArkUI_WaterFlowSectionOption_RegisterGetItemMainSizeCallbackByIndex( + _option, index, section.onGetItemMainSizeByIndex); +} +WaterFlowSection WaterFlowSectionOption::GetSection(int32_t index) +{ + return { OH_ArkUI_WaterFlowSectionOption_GetItemCount(_option, index), + OH_ArkUI_WaterFlowSectionOption_GetCrossCount(_option, index), + OH_ArkUI_WaterFlowSectionOption_GetColumnGap(_option, index), + OH_ArkUI_WaterFlowSectionOption_GetRowGap(_option, index), + OH_ArkUI_WaterFlowSectionOption_GetMargin(_option, index) }; +} + +void WaterFlowSectionOption::SetSize(int32_t size) +{ + OH_ArkUI_WaterFlowSectionOption_SetSize(_option, size); +} +int32_t WaterFlowSectionOption::GetSize() +{ + return OH_ArkUI_WaterFlowSectionOption_GetSize(_option); +} + +void WaterFlowComponent::SetLayoutDirection(int32_t layoutDirection) +{ + ArkUI_NumberValue value[] = { { .i32 = layoutDirection } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_WATER_FLOW_LAYOUT_DIRECTION, &item); +} + +void WaterFlowComponent::SetColumnsTemplate(const std::string& str) +{ + ArkUI_AttributeItem item = { .string = str.c_str() }; + _nodeAPI->setAttribute(_component, NODE_WATER_FLOW_COLUMN_TEMPLATE, &item); +} + +void WaterFlowComponent::SetRowsTemplate(const std::string& str) +{ + ArkUI_AttributeItem item = { .string = str.c_str() }; + _nodeAPI->setAttribute(_component, NODE_WATER_FLOW_ROW_TEMPLATE, &item); +} + +void WaterFlowComponent::SetWaterFlowColumnsGap(float val) +{ + ArkUI_NumberValue value[] = { { .f32 = val } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_WATER_FLOW_COLUMN_GAP, &item); +} + +void WaterFlowComponent::SetWaterFlowRowsGap(float val) +{ + ArkUI_NumberValue value[] = { { .f32 = val } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_WATER_FLOW_ROW_GAP, &item); +} + +void WaterFlowComponent::SetWaterFlowSectionOption(int32_t start, const std::shared_ptr& option) +{ + ArkUI_NumberValue value[] = { { .i32 = start } }; + ArkUI_AttributeItem item = { value, 1, nullptr, option->GetOption() }; + _nodeAPI->setAttribute(_component, NODE_WATER_FLOW_SECTION_OPTION, &item); + _sectionsOption = option; +} + +void WaterFlowComponent::SetWaterFlowCachedCount(int32_t cachedCount) +{ + ArkUI_NumberValue value[] = { { .i32 = cachedCount } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_WATER_FLOW_CACHED_COUNT, &item); +} + +void WaterFlowComponent::SetWaterFlowFooter(ArkUI_NodeHandle node) +{ + ArkUI_AttributeItem item = { .object = node }; + _nodeAPI->setAttribute(_component, NODE_WATER_FLOW_FOOTER, &item); +} + +void WaterFlowComponent::SetWaterFlowScrollToIndex(int32_t index) +{ + ArkUI_NumberValue value[] = { { .i32 = index } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_WATER_FLOW_SCROLL_TO_INDEX, &item); +} + +void WaterFlowComponent::SetWaterFlowScrollToIndex(int32_t index, int32_t animation) +{ + ArkUI_NumberValue value[] = { { .i32 = index }, { .i32 = animation } }; + ArkUI_AttributeItem item = { value, 2 }; + _nodeAPI->setAttribute(_component, NODE_WATER_FLOW_SCROLL_TO_INDEX, &item); +} + +void WaterFlowComponent::SetWaterFlowScrollToIndex(int32_t index, int32_t animation, int32_t alignment) +{ + ArkUI_NumberValue value[] = { { .i32 = index }, { .i32 = animation }, { .i32 = alignment } }; + ArkUI_AttributeItem item = { value, 3 }; + _nodeAPI->setAttribute(_component, NODE_WATER_FLOW_SCROLL_TO_INDEX, &item); +} + +void WaterFlowComponent::SetItemConstraintSize(float minWidth, float maxWidth, float minHeight, float maxHeight) +{ + ArkUI_NumberValue value[] = { { .f32 = minWidth }, { .f32 = maxWidth }, { .f32 = minHeight }, + { .f32 = maxHeight } }; + ArkUI_AttributeItem item = { value, 4 }; + _nodeAPI->setAttribute(_component, NODE_WATER_FLOW_ITEM_CONSTRAINT_SIZE, &item); +} +void WaterFlowComponent::SetWaterFlowNestedScroll(int32_t forward, int32_t backward) +{ + ArkUI_NumberValue value[] = { { .i32 = forward }, { .i32 = backward } }; + ArkUI_AttributeItem item = { value, 2 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_NESTED_SCROLL, &item); +} +void WaterFlowComponent::SetWaterFlowScrollBar(int32_t barState) +{ + ArkUI_NumberValue value[] = { { .i32 = barState } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_BAR_DISPLAY_MODE, &item); +} +void WaterFlowComponent::SetWaterFlowScrollBarWidth(float width) +{ + ArkUI_NumberValue value[] = { { .f32 = width } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_BAR_WIDTH, &item); +} +void WaterFlowComponent::SetWaterFlowScrollBarColor(uint32_t color) +{ + ArkUI_NumberValue value[] = { { .u32 = color } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_BAR_COLOR, &item); +} +void WaterFlowComponent::SetWaterFlowEnableScrollInteraction(bool enableScrollInteraction) +{ + ArkUI_NumberValue value[] = { { .i32 = enableScrollInteraction } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_ENABLE_SCROLL_INTERACTION, &item); +} +void WaterFlowComponent::SetWaterFlowFriction(float friction) +{ + ArkUI_NumberValue value[] = { { .f32 = friction } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_FRICTION, &item); +} +void WaterFlowComponent::SetWaterFlowEdgeEffect(int32_t edgeEffect, bool alwaysEnabled) +{ + ArkUI_NumberValue value[] = { { .i32 = edgeEffect }, { .i32 = alwaysEnabled } }; + ArkUI_AttributeItem item = { value, 2 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_EDGE_EFFECT, &item); +} +void WaterFlowComponent::SetScrollTo(float hOffset, float vOffset, const std::vector& optionalParams) +{ + auto value = new ArkUI_NumberValue[2 + static_cast(optionalParams.size())]; + value[0] = { .f32 = hOffset }; + value[1] = { .f32 = vOffset }; + for (int32_t i = 0; i < optionalParams.size(); i++) { + value[2 + i] = { .i32 = optionalParams[i] }; + } + ArkUI_AttributeItem item = { value, 2 + static_cast(optionalParams.size()) }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_OFFSET, &item); +} +void WaterFlowComponent::SetScrollEdge(int32_t type) +{ + ArkUI_NumberValue value[] = { { .i32 = type } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_EDGE, &item); +} +void WaterFlowComponent::SetScrollPage(bool next) +{ + ArkUI_NumberValue value[] = { { .i32 = next } }; + ArkUI_AttributeItem item = { value, 1 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_PAGE, &item); +} +void WaterFlowComponent::SetScrollPage(bool next, bool animation) +{ + ArkUI_NumberValue value[] = { { .i32 = next }, { .i32 = animation } }; + ArkUI_AttributeItem item = { value, 2 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_PAGE, &item); +} +void WaterFlowComponent::SetScrollBy(float hDistance, float vDistance) +{ + ArkUI_NumberValue value[] = { { .f32 = hDistance }, { .f32 = vDistance } }; + ArkUI_AttributeItem item = { value, 2 }; + _nodeAPI->setAttribute(_component, NODE_SCROLL_BY, &item); +} +void WaterFlowComponent::OnNodeEvent(ArkUI_NodeEvent* event) +{ + auto eventType = OH_ArkUI_NodeEvent_GetEventType(event); + ArkUI_NodeComponentEvent* result = OH_ArkUI_NodeEvent_GetNodeComponentEvent(event); + switch (eventType) { + case NODE_ON_WILL_SCROLL: { + float offset = result->data[0].f32; + int32_t state = result->data[1].i32; + int32_t source = result->data[2].i32; + if (_onWillScroll) { + _onWillScroll(offset, state, source); + } + break; + } + case NODE_SCROLL_EVENT_ON_REACH_START: + if (_onReachStart) { + _onReachStart(); + } + break; + case NODE_SCROLL_EVENT_ON_REACH_END: + if (_onReachEnd) { + _onReachEnd(); + } + break; + case NODE_SCROLL_EVENT_ON_SCROLL_STOP: + if (_onScrollStop) { + _onScrollStop(); + } + break; + case NODE_WATER_FLOW_ON_DID_SCROLL: + if (_onDidScroll) { + float offset = result->data[0].f32; + int32_t state = result->data[1].i32; + _onDidScroll(offset, state); + } + break; + case NODE_SCROLL_EVENT_ON_SCROLL_FRAME_BEGIN: + if (_onScrollFrameBegin) { + float offset = result->data[0].f32; + int32_t state = result->data[1].i32; + _onScrollFrameBegin(offset, state); + } + break; + case NODE_WATER_FLOW_ON_SCROLL_INDEX: + if (_onScrollIndex) { + int32_t first = result->data[0].i32; + int32_t last = result->data[1].i32; + _onScrollIndex(first, last); + } + break; + default: + break; + } +} +void WaterFlowComponent::SetOnWillScroll(OnWillScroll onWillScroll) +{ + _onWillScroll = onWillScroll; + _nodeAPI->registerNodeEvent(_component, NODE_ON_WILL_SCROLL, 0, nullptr); +} +void WaterFlowComponent::SetOnReachStart(OnReachStart onReachStart) +{ + _onReachStart = onReachStart; + _nodeAPI->registerNodeEvent(_component, NODE_SCROLL_EVENT_ON_REACH_START, 0, nullptr); +} +void WaterFlowComponent::SetOnReachEnd(OnReachEnd onReachEnd) +{ + _onReachEnd = onReachEnd; + _nodeAPI->registerNodeEvent(_component, NODE_SCROLL_EVENT_ON_REACH_END, 0, nullptr); +} +void WaterFlowComponent::SetOnScrollStop(OnScrollStop onScrollStop) +{ + _onScrollStop = onScrollStop; + _nodeAPI->registerNodeEvent(_component, NODE_SCROLL_EVENT_ON_SCROLL_STOP, 0, nullptr); +} +void WaterFlowComponent::SetOnDidScroll(OnDidScroll onDidScroll) +{ + _onDidScroll = onDidScroll; + _nodeAPI->registerNodeEvent(_component, NODE_WATER_FLOW_ON_DID_SCROLL, 0, nullptr); +} +void WaterFlowComponent::SetOnScrollFrameBegin(OnScrollFrameBegin onScrollFrameBegin) +{ + _onScrollFrameBegin = onScrollFrameBegin; + _nodeAPI->registerNodeEvent(_component, NODE_SCROLL_EVENT_ON_SCROLL_FRAME_BEGIN, 0, nullptr); +} +void WaterFlowComponent::SetOnScrollIndex(OnScrollIndex onScrollIndex) +{ + _onScrollIndex = onScrollIndex; + _nodeAPI->registerNodeEvent(_component, NODE_WATER_FLOW_ON_SCROLL_INDEX, 0, nullptr); +} +} // namespace ArkUICApiDemo diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/component/waterflow_component.h b/function/ui_compare/capidemo/entry/src/main/cpp/component/waterflow_component.h new file mode 100755 index 000000000..0f6fce904 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/component/waterflow_component.h @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_WATERFLOW_COMPONENT_H +#define ARKUI_CAPI_DEMO_WATERFLOW_COMPONENT_H + +#include +#include + +#include "component.h" +#include "flowitem_component.h" +#include "node_adapter.h" + +namespace ArkUICApiDemo { +using OnWillScroll = std::function; +using OnReachStart = std::function; +using OnReachEnd = std::function; +using OnScrollStop = std::function; +using OnDidScroll = std::function; +using OnScrollFrameBegin = std::function; +using OnScrollIndex = std::function; + +struct WaterFlowSection { + int32_t itemsCount = 0; + int32_t crossCount; + float columnsGap; + float rowsGap; + // top right bottom left + ArkUI_Margin margin { 0, 0, 0, 0 }; + float (*onGetItemMainSizeByIndex)(int32_t itemIndex); + void* userData; +}; + +class WaterFlowSectionOption { +public: + WaterFlowSectionOption() : _option(OH_ArkUI_WaterFlowSectionOption_Create()) {} + ~WaterFlowSectionOption() + { + OH_ArkUI_WaterFlowSectionOption_Dispose(_option); + } + void SetSection(int32_t index, WaterFlowSection section); + WaterFlowSection GetSection(int32_t index); + + void SetSize(int32_t size); + int32_t GetSize(); + ArkUI_WaterFlowSectionOption* GetOption() + { + return _option; + } + +private: + ArkUI_WaterFlowSectionOption* _option; +}; + +class WaterFlowComponent : public Component { +public: + WaterFlowComponent() : Component(ARKUI_NODE_WATER_FLOW) {} + explicit WaterFlowComponent(ArkUI_NodeHandle handle) : Component(handle) {} + + // 引入懒加载模块。 + void SetLazyAdapter(const std::shared_ptr>& adapter) + { + ArkUI_AttributeItem item { nullptr, 0, nullptr, adapter->GetAdapter() }; + _nodeAPI->setAttribute(_component, NODE_WATER_FLOW_NODE_ADAPTER, &item); + _adapter = adapter; + } + void SetLayoutDirection(int32_t layoutDirection); + void SetColumnsTemplate(const std::string& str); + void SetRowsTemplate(const std::string& str); + void SetWaterFlowColumnsGap(float val); + void SetWaterFlowRowsGap(float val); + void SetWaterFlowSectionOption(int32_t start, const std::shared_ptr& option); + void SetWaterFlowCachedCount(int32_t cachedCount); + void SetWaterFlowFooter(ArkUI_NodeHandle node); + void SetWaterFlowScrollToIndex(int32_t index); + void SetWaterFlowScrollToIndex(int32_t index, int32_t animation); + void SetWaterFlowScrollToIndex(int32_t index, int32_t animation, int32_t alignment); + void SetItemConstraintSize(float minWidth, float maxWidth, float minHeight, float maxHeight); + void SetWaterFlowNestedScroll(int32_t forward, int32_t backward); + void SetWaterFlowScrollBar(int32_t barState); + void SetWaterFlowScrollBarWidth(float width); + void SetWaterFlowScrollBarColor(uint32_t color); + void SetWaterFlowEnableScrollInteraction(bool enableScrollInteraction); + void SetWaterFlowFriction(float friction); + void SetWaterFlowEdgeEffect(int32_t edgeEffect, bool alwaysEnabled); + /** + * @brief Set the scroll position to the specified offset. + * @param hOffset horizontal scrolling offset + * @param vOffset vertical scrolling offset + * @param optionalParams + * [0] scrolling duration, in milliseconds. + * [1] scrolling curve. The parameter type is ArkUI_AnimationCurve. + * [2] whether to enable the default spring animation. + * [3] sets whether scrolling can cross the boundary. + * [4] canOverScroll. + */ + void SetScrollTo(float hOffset, float vOffset, const std::vector& optionalParams); + void SetScrollEdge(int32_t type); + void SetScrollPage(bool next); + void SetScrollPage(bool next, bool animation); + void SetScrollBy(float hDistance, float vDistance); + + void OnNodeEvent(ArkUI_NodeEvent* event) override; + void SetOnWillScroll(OnWillScroll onWillScroll); + void SetOnReachStart(OnReachStart onReachStart); + void SetOnReachEnd(OnReachEnd onReachEnd); + void SetOnScrollStop(OnScrollStop onScrollStop); + void SetOnDidScroll(OnDidScroll onDidScroll); + void SetOnScrollFrameBegin(OnScrollFrameBegin onScrollFrameBegin); + void SetOnScrollIndex(OnScrollIndex onScrollIndex); + + std::shared_ptr> GetAdapter() const + { + return _adapter; + } + std::shared_ptr GetSectionOption() const + { + return _sectionsOption; + } + void ReleaseSectionOption() + { + _sectionsOption.reset(); + } + +private: + std::shared_ptr _sectionsOption; + std::shared_ptr> _adapter; + + OnWillScroll _onWillScroll; + OnReachStart _onReachStart; + OnReachEnd _onReachEnd; + OnScrollStop _onScrollStop; + OnDidScroll _onDidScroll; + OnScrollFrameBegin _onScrollFrameBegin; + OnScrollIndex _onScrollIndex; +}; +} // namespace ArkUICApiDemo + +#endif // ARKUI_CAPI_DEMO_WATERFLOW_COMPONENT_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/flex/flex_options_test.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/flex/flex_options_test.cpp new file mode 100644 index 000000000..eb6d2c1f4 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/flex/flex_options_test.cpp @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2024 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 "flex_options_test.h" + +#include + +#include "../manager/plugin_manager.h" + +namespace ArkUICApiDemo { + +static auto createChildNode(ArkUI_NativeNodeAPI_1* nodeAPI, uint32_t backgroundColor) +{ + auto nodeHandle = nodeAPI->createNode(ARKUI_NODE_BUTTON); + // set width + ArkUI_NumberValue button_width_value[] = { { .f32 = 10 } }; + ArkUI_AttributeItem button_width_item = { button_width_value, + sizeof(button_width_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_WIDTH, &button_width_item); + // set height + ArkUI_NumberValue button_height_value[] = { { .f32 = 20 } }; + ArkUI_AttributeItem button_height_item = { button_height_value, + sizeof(button_height_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_HEIGHT, &button_height_item); + + // set background color + ArkUI_NumberValue button1_background_color_value[] = { { .u32 = backgroundColor } }; + ArkUI_AttributeItem button1_background_color_item = { button1_background_color_value, + sizeof(button1_background_color_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_BACKGROUND_COLOR, &button1_background_color_item); + return nodeHandle; +} + +static auto createFlexNode(ArkUI_NativeNodeAPI_1* nodeAPI, int32_t* options) +{ + auto nodeHandle = nodeAPI->createNode(ARKUI_NODE_FLEX); + // set background color + ArkUI_NumberValue background_color_value[] = { { .u32 = COLOR_BLACK } }; + ArkUI_AttributeItem background_color_item = { background_color_value, + sizeof(background_color_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_BACKGROUND_COLOR, &background_color_item); + // set width + ArkUI_NumberValue width_value[] = { { .f32 = 200 } }; + ArkUI_AttributeItem width_item = { width_value, sizeof(width_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_WIDTH, &width_item); + // set height + ArkUI_NumberValue height_value[] = { { .f32 = 70 } }; + ArkUI_AttributeItem height_item = { height_value, sizeof(height_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_HEIGHT, &height_item); + // set margin + ArkUI_NumberValue margin_value[] = { { .f32 = 1 } }; + ArkUI_AttributeItem margin_item = { margin_value, sizeof(margin_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_MARGIN, &margin_item); + // set children + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_RED)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_GREEN)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_YELLOW)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_BLUE)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, 0xFFC100FF)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_WHITE)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_PURPLE)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_LIGHT_BLUE)); + // set options + ArkUI_NumberValue options_value[] = { { .i32 = options[0] }, { .i32 = options[1] }, { .i32 = options[2] }, + { .i32 = options[3] }, { .i32 = options[4] } }; + ArkUI_AttributeItem options_item = { options_value, sizeof(options_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_FLEX_OPTION, &options_item); + return nodeHandle; +} + +static auto addFlexNodes(ArkUI_NativeNodeAPI_1 *nodeAPI, ArkUI_NodeHandle parentColumn) +{ + int32_t options1[] = {ARKUI_FLEX_DIRECTION_ROW, ARKUI_FLEX_WRAP_NO_WRAP, ARKUI_FLEX_ALIGNMENT_START, + ARKUI_ITEM_ALIGNMENT_AUTO, ARKUI_FLEX_ALIGNMENT_START}; + int32_t options2[] = {ARKUI_FLEX_DIRECTION_COLUMN, ARKUI_FLEX_WRAP_WRAP, ARKUI_FLEX_ALIGNMENT_CENTER, + ARKUI_ITEM_ALIGNMENT_START, ARKUI_FLEX_ALIGNMENT_CENTER}; + int32_t options3[] = {ARKUI_FLEX_DIRECTION_ROW_REVERSE, ARKUI_FLEX_WRAP_WRAP_REVERSE, ARKUI_FLEX_ALIGNMENT_END, + ARKUI_ITEM_ALIGNMENT_CENTER, ARKUI_FLEX_ALIGNMENT_END}; + int32_t options4[] = {ARKUI_FLEX_DIRECTION_COLUMN_REVERSE, ARKUI_FLEX_WRAP_WRAP, ARKUI_FLEX_ALIGNMENT_SPACE_BETWEEN, + ARKUI_ITEM_ALIGNMENT_END, ARKUI_FLEX_ALIGNMENT_SPACE_BETWEEN}; + int32_t options5[] = {ARKUI_FLEX_DIRECTION_COLUMN, ARKUI_FLEX_WRAP_WRAP, ARKUI_FLEX_ALIGNMENT_SPACE_AROUND, + ARKUI_ITEM_ALIGNMENT_STRETCH, ARKUI_FLEX_ALIGNMENT_SPACE_AROUND}; + int32_t options6[] = {ARKUI_FLEX_DIRECTION_COLUMN, ARKUI_FLEX_WRAP_NO_WRAP, ARKUI_FLEX_ALIGNMENT_SPACE_EVENLY, + ARKUI_ITEM_ALIGNMENT_BASELINE, ARKUI_FLEX_ALIGNMENT_SPACE_EVENLY}; + int32_t options7[] = {ARKUI_FLEX_DIRECTION_COLUMN, ARKUI_FLEX_WRAP_NO_WRAP, ARKUI_FLEX_ALIGNMENT_SPACE_EVENLY, + ARKUI_ITEM_ALIGNMENT_BASELINE, ARKUI_FLEX_ALIGNMENT_SPACE_EVENLY}; + int32_t options8[] = {ARKUI_FLEX_DIRECTION_COLUMN, ARKUI_FLEX_WRAP_NO_WRAP, ARKUI_FLEX_ALIGNMENT_SPACE_EVENLY, + ARKUI_ITEM_ALIGNMENT_BASELINE, ARKUI_FLEX_ALIGNMENT_SPACE_EVENLY}; + int32_t options9[] = {ARKUI_FLEX_DIRECTION_COLUMN, ARKUI_FLEX_WRAP_NO_WRAP, ARKUI_FLEX_ALIGNMENT_SPACE_EVENLY, + ARKUI_ITEM_ALIGNMENT_BASELINE, ARKUI_FLEX_ALIGNMENT_SPACE_EVENLY}; + int32_t options10[] = {-1, -1, -1, -1, -1}; + auto flex1 = createFlexNode(nodeAPI, options1); + auto flex2 = createFlexNode(nodeAPI, options2); + auto flex3 = createFlexNode(nodeAPI, options3); + auto flex4 = createFlexNode(nodeAPI, options4); + auto flex5 = createFlexNode(nodeAPI, options5); + auto flex6 = createFlexNode(nodeAPI, options6); + auto flex7 = createFlexNode(nodeAPI, options7); + auto flex8 = createFlexNode(nodeAPI, options8); + auto flex9 = createFlexNode(nodeAPI, options9); + auto flex10 = createFlexNode(nodeAPI, options10); + nodeAPI->addChild(parentColumn, flex1); + nodeAPI->addChild(parentColumn, flex2); + nodeAPI->addChild(parentColumn, flex3); + nodeAPI->addChild(parentColumn, flex4); + nodeAPI->addChild(parentColumn, flex5); + nodeAPI->addChild(parentColumn, flex6); + nodeAPI->addChild(parentColumn, flex7); + nodeAPI->addChild(parentColumn, flex8); + nodeAPI->addChild(parentColumn, flex9); + nodeAPI->addChild(parentColumn, flex10); +} + +napi_value FlexOptionsTest::CreateNativeNode(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "FlexOptionsTest", "CreateNativeNode"); + + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "FlexOptionsTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + // set parent node + auto parentColumn = nodeAPI->createNode(ARKUI_NODE_COLUMN); + addFlexNodes(nodeAPI, parentColumn); + std::string id(xComponentID); + if (OH_NativeXComponent_AttachNativeRootNode(PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn) == + INVALID_PARAM) { + OH_LOG_Print( + LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "FlexOptionsTest", "OH_NativeXComponent_AttachNativeRootNode failed"); + } + + napi_value exports; + if (napi_create_object(env, &exports) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_create_object failed"); + return nullptr; + } + + return exports; +} +} // namespace ArkUICApiDemo \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/flex/flex_options_test.h b/function/ui_compare/capidemo/entry/src/main/cpp/flex/flex_options_test.h new file mode 100644 index 000000000..4e6c3e381 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/flex/flex_options_test.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_FLEX_OPTIONS_TEST_H +#define ARKUI_CAPI_DEMO_FLEX_OPTIONS_TEST_H + +#include +#include +#include + +#include "../common/common.h" + +namespace ArkUICApiDemo { + +class FlexOptionsTest { +public: + ~FlexOptionsTest(); + static napi_value CreateNativeNode(napi_env env, napi_callback_info info); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_FLEX_OPTIONS_TEST_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/grid/grid_test.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/grid/grid_test.cpp new file mode 100644 index 000000000..96667b6b6 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/grid/grid_test.cpp @@ -0,0 +1,472 @@ +/* + * Copyright (c) 2024 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 "grid_test.h" + +#include + +#include "../manager/plugin_manager.h" +#include "button_component.h" +#include "column_component.h" +#include "component.h" +#include "flowitem_component.h" +#include "grid_component.h" +#include "text_component.h" + +namespace ArkUICApiDemo { +constexpr int32_t GRID_ITEM_COUNT = 24; +constexpr int32_t GRID_ITEM_COUNT_80 = 80; +static void OnAdapterEventReceive(ArkUI_NodeAdapterEvent* event) +{ + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + + int type = OH_ArkUI_NodeAdapterEvent_GetType(event); + if (type == NODE_ADAPTER_EVENT_ON_ADD_NODE_TO_ADAPTER) { + int32_t index = OH_ArkUI_NodeAdapterEvent_GetItemIndex(event); + auto gridItem = new Component(ARKUI_NODE_GRID_ITEM); + auto text = new TextComponent(); + if (index == GRID_ITEM_COUNT_80 - 1) { + gridItem->SetBackgroundColor(COLOR_RED); + } else { + gridItem->SetBackgroundColor(COLOR_YELLOW); + } + gridItem->SetBorderWidth(SIZE_5); + gridItem->SetBorderColor(COLOR_GRAY, COLOR_GRAY, COLOR_GRAY, COLOR_GRAY); + gridItem->SetWidth(SIZE_50); + gridItem->SetHeight(SIZE_50); + nodeAPI->addChild(gridItem->GetComponent(), text->GetComponent()); + OH_ArkUI_NodeAdapterEvent_SetItem(event, gridItem->GetComponent()); + } +} +void CreateGridItem(const std::shared_ptr>& adapter, bool isShowText = false) +{ + for (int i = 0; i < GRID_ITEM_COUNT; i++) { + auto item = std::make_shared(); + item->SetWidth(100); + item->SetHeight(100); + item->SetBackgroundColor(COLOR_YELLOW); + item->SetBorderWidth(1); + item->SetMargin(10); + auto text = std::make_shared(); + if (isShowText) { + text->SetTextContent(std::to_string(i)); + } + item->AddChild(text); + adapter->InsertItem(i, item); + } +} + +ArkUI_NodeHandle CreateGridExample1() +{ + // 创建grid组件懒加载回调 + auto adapter = OH_ArkUI_NodeAdapter_Create(); + OH_ArkUI_NodeAdapter_RegisterEventReceiver(adapter, nullptr, &OnAdapterEventReceive); + OH_ArkUI_NodeAdapter_SetTotalNodeCount(adapter, GRID_ITEM_COUNT_80); + ArkUI_AttributeItem adapterItem { .object = adapter }; + + // 创建grid组件,同时设置NODE_GRID_COLUMN_TEMPLATE,NODE_GRID_ROW_TEMPLATE,NODE_GRID_COLUMN_GAP,NODE_GRID_ROW_GAP + auto grid = new GridComponent(); + grid->SetWidth(SIZE_450); + grid->SetHeight(SIZE_180); + // 设置columnsTemplate:NODE_GRID_COLUMN_TEMPLATE + grid->SetGridColumnsTemplate("1fr 1fr 1fr 1fr 1fr"); + // 设置columnsTemplate:NODE_GRID_ROW_TEMPLATE + grid->SetGridRowsTemplate("1fr 1fr 1fr 1fr"); + // 设置columnsGap:NODE_GRID_COLUMN_GAP + grid->SetGridColumnsGap(SIZE_10); + // 设置rowGap:NODE_GRID_ROW_GAP + grid->SetGridRowsGap(SIZE_5); + grid->SetBorderWidth(SIZE_5); + grid->SetMargin(SIZE_5); + grid->setAttribute(NODE_GRID_NODE_ADAPTER, &adapterItem); + return grid->GetComponent(); +} + +ArkUI_NodeHandle CreategridColumnExample1() +{ + auto adapter = OH_ArkUI_NodeAdapter_Create(); + OH_ArkUI_NodeAdapter_RegisterEventReceiver(adapter, nullptr, &OnAdapterEventReceive); + OH_ArkUI_NodeAdapter_SetTotalNodeCount(adapter, GRID_ITEM_COUNT_80); + ArkUI_AttributeItem adapterItem { .object = adapter }; + + // 创建grid组件,只设置NODE_GRID_COLUMN_TEMPLATE,NODE_GRID_COLUMN_GAP,NODE_GRID_ROW_GAP,,NODE_GRID_CACHED_COUNT异常值 + auto grid1Column = new ColumnComponent(); + grid1Column->SetId("grid1"); + auto grid = new GridComponent(); + grid->SetWidth(SIZE_450); + grid->SetHeight(SIZE_180); + // 设置columnsTemplate:NODE_GRID_COLUMN_TEMPLATE + grid->SetGridColumnsTemplate("1fr 1fr 1fr 1fr 1fr"); + // 设置columnsGap:NODE_GRID_COLUMN_GAP + grid->SetGridColumnsGap(SIZE_10); + // 设置rowGap:NODE_GRID_ROW_GAP + grid->SetGridRowsGap(SIZE_5); + grid->SetBorderWidth(SIZE_5); + grid->SetMargin(SIZE_5); + grid->setAttribute(NODE_GRID_NODE_ADAPTER, &adapterItem); + grid1Column->AddChild(std::shared_ptr(grid)); + return grid1Column->GetComponent(); +} +ArkUI_NodeHandle CreategridColumnExample2() +{ + auto adapter2 = OH_ArkUI_NodeAdapter_Create(); + OH_ArkUI_NodeAdapter_RegisterEventReceiver(adapter2, nullptr, &OnAdapterEventReceive); + OH_ArkUI_NodeAdapter_SetTotalNodeCount(adapter2, GRID_ITEM_COUNT_80); + ArkUI_AttributeItem adapterItem2 { .object = adapter2 }; + + // 创建grid组件,只设置NODE_GRID_ROW_TEMPLATE,NODE_GRID_COLUMN_GAP,NODE_GRID_ROW_GAP,NODE_GRID_CACHED_COUNT正常值 + auto grid2Column = new ColumnComponent(); + grid2Column->SetId("grid2"); + auto grid = new GridComponent(); + grid->SetWidth(SIZE_450); + grid->SetHeight(SIZE_180); + // 设置columnsTemplate:NODE_GRID_ROW_TEMPLATE + grid->SetGridRowsTemplate("1fr 1fr 1fr 1fr"); + // 设置columnsGap:NODE_GRID_COLUMN_GAP + grid->SetGridColumnsGap(SIZE_10); + // 设置rowGap:NODE_GRID_ROW_GAP + grid->SetGridRowsGap(SIZE_5); + + grid->SetGridRowsGap(SIZE_5); + grid->SetBorderWidth(SIZE_5); + grid->SetMargin(SIZE_5); + grid->setAttribute(NODE_GRID_NODE_ADAPTER, &adapterItem2); + grid2Column->AddChild(std::shared_ptr(grid)); + return grid2Column->GetComponent(); +} +ArkUI_NodeHandle CreategridExample3() +{ + auto adapter3 = OH_ArkUI_NodeAdapter_Create(); + OH_ArkUI_NodeAdapter_RegisterEventReceiver(adapter3, nullptr, &OnAdapterEventReceive); + OH_ArkUI_NodeAdapter_SetTotalNodeCount(adapter3, GRID_ITEM_COUNT_80); + ArkUI_AttributeItem adapterItem3 { .object = adapter3 }; + + // 创建grid组件,设置异常值:NODE_GRID_COLUMN_GAP,NODE_GRID_ROW_TEMPLATE + auto grid = new GridComponent(); + grid->SetWidth(SIZE_230); + grid->SetHeight(SIZE_180); + // 设置columnsTemplate异常值,NODE_GRID_COLUMN_TEMPLATE + grid->SetGridColumnsTemplate("abc"); + // 设置rowTemplate异常值,NODE_GRID_ROW_TEMPLATE + grid->SetGridRowsTemplate("ddd,ccc"); + grid->setAttribute(NODE_GRID_NODE_ADAPTER, &adapterItem3); + grid->SetBorderWidth(SIZE_5); + grid->SetMargin(SIZE_5); + return grid->GetComponent(); +} +ArkUI_NodeHandle CreategridExample4() +{ + auto adapter4 = OH_ArkUI_NodeAdapter_Create(); + OH_ArkUI_NodeAdapter_RegisterEventReceiver(adapter4, nullptr, &OnAdapterEventReceive); + OH_ArkUI_NodeAdapter_SetTotalNodeCount(adapter4, GRID_ITEM_COUNT_80); + ArkUI_AttributeItem adapterItem4 { .object = adapter4 }; + + // 创建grid组件,设置异常值:NODE_GRID_COLUMN_GAP,NODE_GRID_ROW_GAP + auto grid = new GridComponent(); + grid->SetWidth(SIZE_230); + grid->SetHeight(SIZE_180); + // 设置columnsGap异常值,NODE_GRID_COLUMN_GAP + grid->SetGridColumnsGap(PARAM_NEGATIVE_1); + // 设置rowGap异常值,NODE_GRID_ROW_GAP + grid->SetGridRowsGap(PARAM_NEGATIVE_1); + + grid->setAttribute(NODE_GRID_NODE_ADAPTER, &adapterItem4); + grid->SetBorderWidth(SIZE_5); + grid->SetMargin(SIZE_5); + return grid->GetComponent(); +} + +napi_value GridTest::CreateNativeNode(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "GridTest", "CreateNativeNode"); + + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "GridTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + + // 创建grid组件,同时设置NODE_GRID_COLUMN_TEMPLATE,NODE_GRID_ROW_TEMPLATE,NODE_GRID_COLUMN_GAP,NODE_GRID_ROW_GAP + auto grid = CreateGridExample1(); + // 创建grid组件,只设置NODE_GRID_COLUMN_TEMPLATE,NODE_GRID_COLUMN_GAP,NODE_GRID_ROW_GAP,,NODE_GRID_CACHED_COUNT异常值 + auto grid1Column = CreategridColumnExample1(); + // 创建grid组件,只设置NODE_GRID_ROW_TEMPLATE,NODE_GRID_COLUMN_GAP,NODE_GRID_ROW_GAP,NODE_GRID_CACHED_COUNT正常值 + auto grid2Column = CreategridColumnExample2(); + // 创建grid组件,设置异常值:NODE_GRID_COLUMN_GAP,NODE_GRID_ROW_TEMPLATE + auto grid3 = CreategridExample3(); + // 创建grid组件,设置异常值:NODE_GRID_COLUMN_GAP,NODE_GRID_ROW_GAP + auto grid4 = CreategridExample4(); + + // parent node + auto parentColumn = nodeAPI->createNode(ARKUI_NODE_COLUMN); + auto row = nodeAPI->createNode(ARKUI_NODE_ROW); + nodeAPI->addChild(parentColumn, grid); + nodeAPI->addChild(parentColumn, grid1Column); + nodeAPI->addChild(parentColumn, grid2Column); + nodeAPI->addChild(parentColumn, row); + nodeAPI->addChild(row, grid3); + nodeAPI->addChild(row, grid4); + + std::string id(xComponentID); + if (OH_NativeXComponent_AttachNativeRootNode(PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn) == + INVALID_PARAM) { + OH_LOG_Print( + LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "GridTest", "OH_NativeXComponent_AttachNativeRootNode failed"); + } + + napi_value exports; + if (napi_create_object(env, &exports) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_create_object failed"); + return nullptr; + } + + return exports; +} +napi_value GridTest::CreateNativeNodeForCachedCount(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "GridTest", "CreateNativeNodeForCachedCount"); + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "GridTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + + auto parentColumn = new ColumnComponent(); + auto grid1Column = new ColumnComponent(); + grid1Column->SetId("gridCachedCount1"); + auto grid1 = new GridComponent(); + grid1->SetWidth(450); + grid1->SetHeight(200); + grid1->SetGridRowsTemplate("1fr 1fr 1fr 1fr"); + grid1->SetBorderWidth(5); + + std::vector> input1; + auto adapter1 = std::make_shared>(input1); + grid1->SetLazyAdapter(adapter1); + // 设置cacheCount异常值:-1 + grid1->SetGridCachedCount(-1); + CreateGridItem(adapter1); + + auto grid2 = new GridComponent(); + auto grid2Column = new ColumnComponent(); + grid2Column->SetId("gridCachedCount2"); + grid2->SetWidth(450); + grid2->SetHeight(200); + grid2->SetGridColumnsTemplate("1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr"); + grid2->SetBorderWidth(5); + std::vector> input2; + auto adapter2 = std::make_shared>(input2); + grid2->SetLazyAdapter(adapter2); + // 设置cacheCount异常值:0 + grid2->SetGridCachedCount(0); + CreateGridItem(adapter2); + + auto grid3 = new GridComponent(); + auto grid3Column = new ColumnComponent(); + grid3Column->SetId("gridCachedCount3"); + grid3->SetWidth(450); + grid3->SetHeight(200); + grid3->SetBorderWidth(5); + grid3->SetGridRowsTemplate("1fr 1fr 1fr"); + std::vector> input3; + auto adapter3 = std::make_shared>(input3); + grid3->SetLazyAdapter(adapter3); + // 设置cacheCount正常值2 + grid3->SetGridCachedCount(2); + CreateGridItem(adapter3); + + auto button = new ButtonComponent(); + button->SetWidth(100); + button->SetHeight(50); + button->SetMargin(10); + button->SetId("gridClick"); + button->RegisterOnClick([adapter1, adapter2, adapter3]() { + adapter1->SetAllItem([](std::shared_ptr item, uint32_t index) { + auto children = item->GetChildren(); + if (!children.empty()) { + children.front()->SetBackgroundColor(COLOR_GREEN); + } + }); + adapter2->SetAllItem([](std::shared_ptr item, uint32_t index) { + auto children = item->GetChildren(); + if (!children.empty()) { + children.front()->SetBackgroundColor(COLOR_GREEN); + } + }); + adapter3->SetAllItem([](std::shared_ptr item, uint32_t index) { + auto children = item->GetChildren(); + if (!children.empty()) { + children.front()->SetBackgroundColor(COLOR_GREEN); + } + }); + }); + + parentColumn->AddChild(std::shared_ptr(grid1Column)); + grid1Column->AddChild(std::shared_ptr(grid1)); + + parentColumn->AddChild(std::shared_ptr(grid2Column)); + grid2Column->AddChild(std::shared_ptr(grid2)); + + parentColumn->AddChild(std::shared_ptr(grid3Column)); + grid3Column->AddChild(std::shared_ptr(grid3)); + + parentColumn->AddChild(std::shared_ptr(button)); + + std::string id(xComponentID); + if (OH_NativeXComponent_AttachNativeRootNode( + PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn->GetComponent()) == INVALID_PARAM) { + OH_LOG_Print( + LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "GridTest", "OH_NativeXComponent_AttachNativeRootNode failed"); + } + + napi_value exports; + if (napi_create_object(env, &exports) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_create_object failed"); + return nullptr; + } + return exports; +} + +napi_value GridTest::CreateNativeNodeForResetAttribute(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "GridTest", "CreateNativeNodeForResetAttribute"); + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "GridTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + + auto parentColumn = new ColumnComponent(); + auto grid1Column = new ColumnComponent(); + auto grid1 = new GridComponent(); + grid1->SetWidth(400); + grid1->SetHeight(180); + grid1->SetGridRowsTemplate("1fr 1fr 1fr 1fr"); + grid1->SetBorderWidth(5); + + std::vector> input1; + auto adapter1 = std::make_shared>(input1); + grid1->SetLazyAdapter(adapter1); + CreateGridItem(adapter1, false); + + auto grid2 = new GridComponent(); + auto grid2Column = new ColumnComponent(); + grid2->SetWidth(400); + grid2->SetHeight(180); + grid2->SetGridColumnsTemplate("1fr 1fr 1fr 1fr 1fr"); + grid2->SetBorderWidth(5); + std::vector> input2; + auto adapter2 = std::make_shared>(input2); + grid2->SetLazyAdapter(adapter2); + CreateGridItem(adapter2, false); + + auto grid3 = new GridComponent(); + auto grid3Column = new ColumnComponent(); + grid3->SetWidth(400); + grid3->SetHeight(180); + grid3->SetBorderWidth(5); + grid3->SetGridColumnsTemplate("1fr 1fr 1fr 1fr 1fr"); + grid3->SetGridRowsGap(10); + grid3->SetGridColumnsGap(10); + std::vector> input3; + auto adapter3 = std::make_shared>(input3); + grid3->SetLazyAdapter(adapter3); + CreateGridItem(adapter3, false); + + auto grid4 = new GridComponent(); + auto grid4Column = new ColumnComponent(); + grid4->SetWidth(400); + grid4->SetHeight(180); + grid4->SetBorderWidth(5); + grid4->SetGridRowsGap(10); + grid4->SetGridRowsTemplate("1fr 1fr 1fr 1fr"); + std::vector> input4; + auto adapter4 = std::make_shared>(input4); + grid4->SetLazyAdapter(adapter4); + CreateGridItem(adapter4, false); + + auto button = new ButtonComponent(); + button->SetWidth(100); + button->SetHeight(50); + button->SetMargin(10); + button->SetId("GridReset"); + button->RegisterOnClick([grid1, grid2, grid3, grid4]() { + grid1->resetAttribute(NODE_GRID_ROW_TEMPLATE); // 默认值:"1r" + grid2->resetAttribute(NODE_GRID_COLUMN_TEMPLATE); // 默认值:"1r" + grid3->resetAttribute(NODE_GRID_COLUMN_GAP); // 默认值:0 + grid4->resetAttribute(NODE_GRID_ROW_GAP); // 默认值:0 + }); + + parentColumn->AddChild(std::shared_ptr(grid1Column)); + grid1Column->AddChild(std::shared_ptr(grid1)); + + parentColumn->AddChild(std::shared_ptr(grid2Column)); + grid2Column->AddChild(std::shared_ptr(grid2)); + + parentColumn->AddChild(std::shared_ptr(grid3Column)); + grid3Column->AddChild(std::shared_ptr(grid3)); + + parentColumn->AddChild(std::shared_ptr(grid4Column)); + grid3Column->AddChild(std::shared_ptr(grid4)); + + parentColumn->AddChild(std::shared_ptr(button)); + + std::string id(xComponentID); + if (OH_NativeXComponent_AttachNativeRootNode( + PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn->GetComponent()) == INVALID_PARAM) { + OH_LOG_Print( + LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "GridTest", "OH_NativeXComponent_AttachNativeRootNode failed"); + } + + napi_value exports; + if (napi_create_object(env, &exports) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_create_object failed"); + return nullptr; + } + return exports; +} + +} // namespace ArkUICApiDemo diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/grid/grid_test.h b/function/ui_compare/capidemo/entry/src/main/cpp/grid/grid_test.h new file mode 100644 index 000000000..e06b1256f --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/grid/grid_test.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_GRID_TEST_H +#define ARKUI_CAPI_DEMO_GRID_TEST_H +#include +#include +#include + +#include "../common/common.h" + +namespace ArkUICApiDemo { + +class GridTest { +public: + ~GridTest(); + // GridTest:testGrid001 + static napi_value CreateNativeNode(napi_env env, napi_callback_info info); + // Testcase:testGrid002 + static napi_value CreateNativeNodeForCachedCount(napi_env env, napi_callback_info info); + // Testcase:testGrid003 + static napi_value CreateNativeNodeForResetAttribute(napi_env env, napi_callback_info info); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_GRID_TEST_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/manager/plugin_manager.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/manager/plugin_manager.cpp new file mode 100755 index 000000000..1a052cd14 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/manager/plugin_manager.cpp @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2024 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 "plugin_manager.h" + +#include +#include +#include + +#include "./common/common.h" + +namespace ArkUICApiDemo { +PluginManager PluginManager::pluginManager_; + +PluginManager::~PluginManager() +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Callback", "~PluginManager"); + for (auto iter = nativeXComponentMap_.begin(); iter != nativeXComponentMap_.end(); ++iter) { + if (iter->second != nullptr) { + delete iter->second; + iter->second = nullptr; + } + } + nativeXComponentMap_.clear(); +} + +napi_value PluginManager::GetContext(napi_env env, napi_callback_info info) +{ + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "PluginManager", "GetContext env or info is null"); + return nullptr; + } + + size_t argCnt = 1; + napi_value args[1] = { nullptr }; + if (napi_get_cb_info(env, info, &argCnt, args, nullptr, nullptr) != napi_ok) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "PluginManager", "GetContext napi_get_cb_info failed"); + } + + if (argCnt != 1) { + napi_throw_type_error(env, NULL, "Wrong number of arguments"); + return nullptr; + } + + napi_valuetype valuetype; + if (napi_typeof(env, args[0], &valuetype) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_typeof failed"); + return nullptr; + } + + if (valuetype != napi_number) { + napi_throw_type_error(env, NULL, "Wrong type of arguments"); + return nullptr; + } + + int64_t value; + if (napi_get_value_int64(env, args[0], &value) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_get_value_int64 failed"); + return nullptr; + } + + napi_value exports; + if (napi_create_object(env, &exports) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_create_object failed"); + return nullptr; + } + + return exports; +} + +void PluginManager::Export(napi_env env, napi_value exports) +{ + if ((env == nullptr) || (exports == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "PluginManager", "Export: env or exports is null"); + return; + } + + napi_value exportInstance = nullptr; + if (napi_get_named_property(env, exports, OH_NATIVE_XCOMPONENT_OBJ, &exportInstance) != napi_ok) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "PluginManager", "Export: napi_get_named_property fail"); + return; + } + + OH_NativeXComponent* nativeXComponent = nullptr; + if (napi_unwrap(env, exportInstance, reinterpret_cast(&nativeXComponent)) != napi_ok) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "PluginManager", "Export: napi_unwrap fail"); + return; + } else { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "PluginManager", "Export: napi_unwrap success"); + } + + char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = { '\0' }; + uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1; + if (OH_NativeXComponent_GetXComponentId(nativeXComponent, idStr, &idSize) != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) { + OH_LOG_Print( + LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "PluginManager", "Export: OH_NativeXComponent_GetXComponentId fail"); + return; + } + + std::string id(idStr); + auto context = PluginManager::GetInstance(); + if ((context != nullptr) && (nativeXComponent != nullptr)) { + context->SetNativeXComponent(id, nativeXComponent); + } +} + +void PluginManager::SetNativeXComponent(std::string& id, OH_NativeXComponent* nativeXComponent) +{ + if (nativeXComponent == nullptr) { + return; + } + + if (nativeXComponentMap_.find(id) == nativeXComponentMap_.end()) { + nativeXComponentMap_[id] = nativeXComponent; + return; + } + + if (nativeXComponentMap_[id] != nativeXComponent) { + OH_NativeXComponent* tmp = nativeXComponentMap_[id]; + delete tmp; + tmp = nullptr; + nativeXComponentMap_[id] = nativeXComponent; + } +} + +OH_NativeXComponent* PluginManager::GetNativeXComponent(std::string& id) +{ + if (nativeXComponentMap_.find(id) == nativeXComponentMap_.end()) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "PluginManager", "GetNativeXComponent.%{public}s == nullptr", + id.c_str()); + return nullptr; + } + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "PluginManager", + "nativeXComponentMap_[%{public}s] == %{public}p", id.c_str(), nativeXComponentMap_[id]); + return nativeXComponentMap_[id]; +} +} // namespace ArkUICApiDemo diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/manager/plugin_manager.h b/function/ui_compare/capidemo/entry/src/main/cpp/manager/plugin_manager.h new file mode 100755 index 000000000..6ee79d601 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/manager/plugin_manager.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2024 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. + */ +#ifndef NATIVE_XCOMPONENT_PLUGIN_MANAGER_H +#define NATIVE_XCOMPONENT_PLUGIN_MANAGER_H + +#include +#include +#include +#include +#include + +namespace ArkUICApiDemo { +class PluginManager { +public: + ~PluginManager(); + + static PluginManager* GetInstance() + { + return &PluginManager::pluginManager_; + } + + static napi_value GetContext(napi_env env, napi_callback_info info); + + void SetNativeXComponent(std::string& id, OH_NativeXComponent* nativeXComponent); + OH_NativeXComponent* GetNativeXComponent(std::string& id); + void Export(napi_env env, napi_value exports); + +private: + static PluginManager pluginManager_; + + std::unordered_map nativeXComponentMap_; +}; +} // namespace ArkUICApiDemo +#endif // NATIVE_XCOMPONENT_PLUGIN_MANAGER_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/napi_init.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/napi_init.cpp new file mode 100755 index 000000000..605e45ff6 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2024 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 "column/column_align_items_test.h" +#include "column/column_justify_content_test.h" +#include "flex/flex_options_test.h" +#include "grid/grid_test.h" +#include "manager/plugin_manager.h" +#include "radio/radio_checked_test.h" +#include "radio/radio_reset_attribute_test.h" +#include "radio/radio_style_test.h" +#include "radio/radio_value_group_test.h" +#include "refresh/refresh_test.h" +#include "row/row_align_items_test.h" +#include "row/row_justify_content_test.h" + +using namespace ArkUICApiDemo; + +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + OH_LOG_Print(LOG_APP, LOG_INFO, ArkUICApiDemo::LOG_PRINT_DOMAIN, "Init", "Init begins"); + if ((env == nullptr) || (exports == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, ArkUICApiDemo::LOG_PRINT_DOMAIN, "Init", "env or exports is null"); + return nullptr; + } + + napi_property_descriptor desc[] = { + { "columnJustifyContentTest", nullptr, ColumnJustifyContentTest::CreateNativeNode, nullptr, nullptr, nullptr, + napi_default, nullptr }, + { "columnAlignItemsTest", nullptr, ColumnAlignItemsTest::CreateNativeNode, nullptr, nullptr, nullptr, + napi_default, nullptr }, + { "columnAlignItemsMoreAttributeTest", nullptr, ColumnAlignItemsTest::CreateMoreAttributeNativeNode, nullptr, + nullptr, nullptr, napi_default, nullptr }, + { "rowJustifyContentTest", nullptr, RowJustifyContentTest::CreateNativeNode, nullptr, nullptr, nullptr, + napi_default, nullptr }, + { "rowAlignItemsTest", nullptr, RowAlignItemsTest::CreateNativeNode, nullptr, nullptr, nullptr, napi_default, + nullptr }, + { "rowAlignItemsMoreAttributeTest", nullptr, RowAlignItemsTest::CreateMoreAttributeNativeNode, nullptr, nullptr, + nullptr, napi_default, nullptr }, + { "flexOptionsTest", nullptr, FlexOptionsTest::CreateNativeNode, nullptr, nullptr, nullptr, napi_default, + nullptr }, + { "radioCheckedTest", nullptr, RadioCheckedTest::CreateNativeNode, nullptr, nullptr, nullptr, napi_default, + nullptr }, + { "radioStyleTest", nullptr, RadioStyleTest::CreateNativeNode, nullptr, nullptr, nullptr, napi_default, + nullptr }, + { "radioValueAndGroupTest", nullptr, RadioValueAndGroupTest::CreateNativeNode, nullptr, nullptr, nullptr, + napi_default, nullptr }, + { "radioResetAttributeTest", nullptr, RadioResetAttributeTest::CreateNativeNode, nullptr, nullptr, nullptr, + napi_default, nullptr }, + { "gridTest", nullptr, GridTest::CreateNativeNode, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "gridCachedCountTest", nullptr, GridTest::CreateNativeNodeForCachedCount, nullptr, nullptr, nullptr, + napi_default, nullptr }, + { "gridResetAttributeTest", nullptr, GridTest::CreateNativeNodeForResetAttribute, nullptr, nullptr, nullptr, + napi_default, nullptr }, + { "refreshForContentAndRatioTest", nullptr, RefreshTest::CreateNativeNodeForRefreshContentAndRatio, nullptr, + nullptr, nullptr, napi_default, nullptr }, + { "refreshForRefreshingTest", nullptr, RefreshTest::CreateNativeNodeForRefreshing, nullptr, nullptr, nullptr, + napi_default, nullptr }, + { "refreshTest", nullptr, RefreshTest::CreateNativeNode, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "refreshNestedScrollTest", nullptr, RefreshTest::CreateNativeNodeNestedScroll, nullptr, nullptr, nullptr, + napi_default, nullptr }, + { "refreshResetAttributeTest", nullptr, RefreshTest::CreateNativeNodeForResetAttribute, nullptr, nullptr, + nullptr, napi_default, nullptr }, + }; + if (napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc) != napi_ok) { + OH_LOG_Print(LOG_APP, LOG_ERROR, ArkUICApiDemo::LOG_PRINT_DOMAIN, "Init", "napi_define_properties failed"); + return nullptr; + } + + ArkUICApiDemo::PluginManager::GetInstance()->Export(env, exports); + return exports; +} +EXTERN_C_END + +static napi_module nativerenderModule = { .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "nativerender", + .nm_priv = ((void*)0), + .reserved = { 0 } }; + +extern "C" __attribute__((constructor)) void RegisterModule(void) +{ + napi_module_register(&nativerenderModule); +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_checked_test.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_checked_test.cpp new file mode 100644 index 000000000..3032c03f1 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_checked_test.cpp @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2024 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 "radio_checked_test.h" + +#include + +#include "../manager/plugin_manager.h" +namespace ArkUICApiDemo { +napi_value RadioCheckedTest::CreateNativeNode(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RadioCheckedTest", "CreateNativeNode"); + + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RadioCheckedTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + + // 设置Radio组件的Checked属性 + ArkUI_NumberValue true_checked_value[] = { { .i32 = 1 } }; + ArkUI_AttributeItem true_checked_item = { true_checked_value, + sizeof(true_checked_value) / sizeof(ArkUI_NumberValue) }; + + // 设置Radio组件的Checked属性 + ArkUI_NumberValue false_checked_value[] = { { .i32 = 0 } }; + ArkUI_AttributeItem false_checked_item = { false_checked_value, + sizeof(false_checked_value) / sizeof(ArkUI_NumberValue) }; + // 设置Radio组件的Checked属性 + ArkUI_NumberValue outlier_checked_value[] = { { .i32 = -1 } }; + ArkUI_AttributeItem outlier_checked_item = { outlier_checked_value, + sizeof(outlier_checked_value) / sizeof(ArkUI_NumberValue) }; + + // 设置Radio组件宽度 + ArkUI_NumberValue default_width_value[] = { { .f32 = 100 } }; + ArkUI_AttributeItem default_width_item = { default_width_value, + sizeof(default_width_value) / sizeof(ArkUI_NumberValue) }; + + // 设置Radio组件高度 + ArkUI_NumberValue default_height_value[] = { { .f32 = 100 } }; + ArkUI_AttributeItem default_height_item = { default_height_value, + sizeof(default_height_value) / sizeof(ArkUI_NumberValue) }; + + // 设置Radio组件margin + ArkUI_NumberValue margin_value[] = { { .f32 = 20 } }; + ArkUI_AttributeItem margin_item = { margin_value, sizeof(margin_value) / sizeof(ArkUI_NumberValue) }; + + // first radio, checked 属性为1,应该为选中状态 + auto radio = nodeAPI->createNode(ARKUI_NODE_RADIO); + nodeAPI->setAttribute(radio, NODE_WIDTH, &default_width_item); + nodeAPI->setAttribute(radio, NODE_HEIGHT, &default_height_item); + nodeAPI->setAttribute(radio, NODE_MARGIN, &margin_item); + nodeAPI->setAttribute(radio, NODE_RADIO_CHECKED, &true_checked_item); + + // second radio, checked 属性为0,应该为未选中状态 + auto radio_second = nodeAPI->createNode(ARKUI_NODE_RADIO); + nodeAPI->setAttribute(radio_second, NODE_WIDTH, &default_width_item); + nodeAPI->setAttribute(radio_second, NODE_HEIGHT, &default_height_item); + nodeAPI->setAttribute(radio_second, NODE_MARGIN, &margin_item); + nodeAPI->setAttribute(radio_second, NODE_RADIO_CHECKED, &false_checked_item); + + // third radio, 设置异常值-1, 返回错误,应该为未选中状态 + auto radio_third = nodeAPI->createNode(ARKUI_NODE_RADIO); + nodeAPI->setAttribute(radio_third, NODE_WIDTH, &default_width_item); + nodeAPI->setAttribute(radio_third, NODE_HEIGHT, &default_height_item); + nodeAPI->setAttribute(radio_third, NODE_MARGIN, &margin_item); + nodeAPI->setAttribute(radio_second, NODE_RADIO_CHECKED, &outlier_checked_item); + + // parent node + auto parentColumn = nodeAPI->createNode(ARKUI_NODE_COLUMN); + auto row1 = nodeAPI->createNode(ARKUI_NODE_ROW); + auto row2 = nodeAPI->createNode(ARKUI_NODE_ROW); + auto row3 = nodeAPI->createNode(ARKUI_NODE_ROW); + + nodeAPI->addChild(parentColumn, row1); + nodeAPI->addChild(parentColumn, row2); + nodeAPI->addChild(parentColumn, row3); + nodeAPI->addChild(row1, radio); + nodeAPI->addChild(row2, radio_second); + nodeAPI->addChild(row3, radio_third); + + std::string id(xComponentID); + if (OH_NativeXComponent_AttachNativeRootNode(PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn) == + INVALID_PARAM) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RadioCheckedTest", + "OH_NativeXComponent_AttachNativeRootNode failed"); + } + + napi_value exports; + if (napi_create_object(env, &exports) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_create_object failed"); + return nullptr; + } + + return exports; +} +} // namespace ArkUICApiDemo diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_checked_test.h b/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_checked_test.h new file mode 100644 index 000000000..276585ae7 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_checked_test.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_RADIO_CHECKED_TEST_H +#define ARKUI_CAPI_DEMO_RADIO_CHECKED_TEST_H +#include +#include +#include + +#include "../common/common.h" + +namespace ArkUICApiDemo { + +class RadioCheckedTest { +public: + ~RadioCheckedTest(); + // RadioTest:testRadio001 + static napi_value CreateNativeNode(napi_env env, napi_callback_info info); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_RADIO_CHECKED_TEST_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_reset_attribute_test.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_reset_attribute_test.cpp new file mode 100644 index 000000000..8a32b5218 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_reset_attribute_test.cpp @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2024 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 "radio_reset_attribute_test.h" + +#include +#include + +#include "../manager/plugin_manager.h" +#include "button_component.h" +#include "column_component.h" +#include "radio_component.h" +namespace ArkUICApiDemo { +napi_value RadioResetAttributeTest::CreateNativeNode(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RadioResetAttributeTest", "CreateNativeNode"); + + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RadioResetAttributeTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + + auto parentColumn = new ColumnComponent(); + auto radio1 = new RadioComponent(); + radio1->SetWidth(100); + radio1->SetHeight(100); + radio1->SetChecked(true); + // 设置Radio组件的RadioStyle属性,checkedBackgroundColor:绿色;uncheckedBorderColor:紫色,indicatorColor:红色 + radio1->SetStyled((uint32_t[]) { COLOR_GREEN, COLOR_PURPLE, COLOR_RED }, 3); + radio1->SetGroup("group1"); + radio1->SetValue("radio1"); + radio1->SetMargin(10); + + auto radio2 = new RadioComponent(); + radio2->SetWidth(100); + radio2->SetHeight(100); + radio2->SetChecked(true); + // 设置Radio组件的RadioStyle属性,checkedBackgroundColor:绿色;uncheckedBorderColor:紫色,indicatorColor:红色 + radio2->SetStyled((uint32_t[]) { COLOR_GREEN, COLOR_PURPLE, COLOR_RED }, 3); + radio2->SetGroup("group2"); + radio2->SetValue("radio2"); + radio2->SetMargin(10); + + auto radio3 = new RadioComponent(); + radio3->SetWidth(100); + radio3->SetHeight(100); + // 设置Radio组件的RadioStyle属性,checkedBackgroundColor:绿色;uncheckedBorderColor:紫色,indicatorColor:红色 + // radio 非选中状态下,border颜色为紫色 + radio3->SetStyled((uint32_t[]) { COLOR_GREEN, COLOR_PURPLE, COLOR_RED }, 3); + radio3->SetMargin(10); + + auto button = new ButtonComponent(); + button->SetWidth(200); + button->SetHeight(100); + button->RegisterOnClick([radio1, radio2, radio3]() { + // Reset radio1 NODE_RADIO_CHECKED,NODE_RADIO_GROUP,NODE_RADIO_STYLE,NODE_RADIO_VALUE + radio1->resetAttribute(NODE_RADIO_CHECKED); // 默认值:false + radio1->resetAttribute(NODE_RADIO_GROUP); // 默认值:无 + radio1->resetAttribute(NODE_RADIO_STYLE); // 默认值:theme主题 + radio1->resetAttribute(NODE_RADIO_VALUE); // 默认值:无 + // Reset radio3 NODE_RADIO_STYLE + radio3->resetAttribute(NODE_RADIO_STYLE); + auto groupItem1 = radio1->getAttribute(NODE_RADIO_GROUP); + auto valueItem1 = radio1->getAttribute(NODE_RADIO_VALUE); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RadioResetAttributeTest", + "group1=%{public}s,valueItem1=%{public}s", groupItem1->string, valueItem1->string); + }); + button->SetId("ResetRadio"); + button->SetLable("ResetRadio"); + parentColumn->AddChild(std::shared_ptr(radio1)); + parentColumn->AddChild(std::shared_ptr(radio2)); + parentColumn->AddChild(std::shared_ptr(radio3)); + parentColumn->AddChild(std::shared_ptr(button)); + + std::string id(xComponentID); + if (OH_NativeXComponent_AttachNativeRootNode( + PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn->GetComponent()) == INVALID_PARAM) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RadioResetAttributeTest", + "OH_NativeXComponent_AttachNativeRootNode failed"); + } + + napi_value exports; + if (napi_create_object(env, &exports) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_create_object failed"); + return nullptr; + } + + return exports; +} +} // namespace ArkUICApiDemo diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_reset_attribute_test.h b/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_reset_attribute_test.h new file mode 100644 index 000000000..50d9da3bd --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_reset_attribute_test.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_RADIO_RESETATTRIBUTE_TEST_H +#define ARKUI_CAPI_DEMO_RADIO_RESETATTRIBUTE_TEST_H +#include +#include +#include + +#include "../common/common.h" + +namespace ArkUICApiDemo { + +class RadioResetAttributeTest { +public: + ~RadioResetAttributeTest(); + // RadioTest:testRadio005 + static napi_value CreateNativeNode(napi_env env, napi_callback_info info); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_RADIO_RESETATTRIBUTE_TEST_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_style_test.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_style_test.cpp new file mode 100644 index 000000000..cdeac8810 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_style_test.cpp @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2024 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 "radio_style_test.h" + +#include + +#include "../manager/plugin_manager.h" +namespace ArkUICApiDemo { +napi_value RadioStyleTest::CreateNativeNode(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RadioStyleTest", "CreateNativeNode"); + + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RadioStyleTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + + // 设置Radio组件的RadioStyle属性,checkedBackgroundColor:绿色;uncheckedBorderColor:黄色,indicatorColor:红色 + ArkUI_NumberValue radioStyle_value[] = { { .u32 = COLOR_GREEN }, { .u32 = COLOR_YELLOW }, { .u32 = COLOR_RED } }; + ArkUI_AttributeItem radioStyle_value_item = { radioStyle_value, + sizeof(radioStyle_value) / sizeof(ArkUI_NumberValue) }; + + // 设置Radio组件宽度 + ArkUI_NumberValue default_width_value[] = { { .f32 = 50 } }; + ArkUI_AttributeItem default_width_item = { default_width_value, + sizeof(default_width_value) / sizeof(ArkUI_NumberValue) }; + + // 设置Radio组件高度 + ArkUI_NumberValue default_height_value[] = { { .f32 = 50 } }; + ArkUI_AttributeItem default_height_item = { default_height_value, + sizeof(default_height_value) / sizeof(ArkUI_NumberValue) }; + + // 设置Radio组件margin + ArkUI_NumberValue margin_value[] = { { .f32 = 20 } }; + ArkUI_AttributeItem margin_item = { margin_value, sizeof(margin_value) / sizeof(ArkUI_NumberValue) }; + + // 设置Radio组件选中 + ArkUI_NumberValue true_checked_value[] = { { .i32 = 1 } }; + ArkUI_AttributeItem true_checked_item = { true_checked_value, + sizeof(true_checked_value) / sizeof(ArkUI_NumberValue) }; + + // first radio, 设置Radio Style 并且是uncheck状态 + auto radio = nodeAPI->createNode(ARKUI_NODE_RADIO); + nodeAPI->setAttribute(radio, NODE_WIDTH, &default_width_item); + nodeAPI->setAttribute(radio, NODE_HEIGHT, &default_height_item); + nodeAPI->setAttribute(radio, NODE_MARGIN, &margin_item); + nodeAPI->setAttribute(radio, NODE_RADIO_STYLE, &radioStyle_value_item); + + // second radio, 不设置置Radio Style,显示默认状态 + auto radio_second = nodeAPI->createNode(ARKUI_NODE_RADIO); + nodeAPI->setAttribute(radio_second, NODE_WIDTH, &default_width_item); + nodeAPI->setAttribute(radio_second, NODE_HEIGHT, &default_height_item); + nodeAPI->setAttribute(radio_second, NODE_MARGIN, &margin_item); + + // third radio, 设置Radio Style 并且check状态 + auto radio_third = nodeAPI->createNode(ARKUI_NODE_RADIO); + nodeAPI->setAttribute(radio_third, NODE_WIDTH, &default_width_item); + nodeAPI->setAttribute(radio_third, NODE_HEIGHT, &default_height_item); + nodeAPI->setAttribute(radio_third, NODE_MARGIN, &margin_item); + nodeAPI->setAttribute(radio_third, NODE_RADIO_CHECKED, &true_checked_item); + nodeAPI->setAttribute(radio_third, NODE_RADIO_STYLE, &radioStyle_value_item); + + auto text = nodeAPI->createNode(ARKUI_NODE_TEXT); + ArkUI_AttributeItem LABEL_Item = { .string = "Radio_unchecked" }; + ArkUI_NumberValue fontSize[] = { 20 }; + ArkUI_AttributeItem Font_Item = { fontSize, 1 }; + ArkUI_NumberValue marginValue[] = { 20 }; + ArkUI_AttributeItem marginItem = { marginValue, 1 }; + nodeAPI->setAttribute(text, NODE_TEXT_CONTENT, &LABEL_Item); + nodeAPI->setAttribute(text, NODE_TEXT_FONT, &Font_Item); + nodeAPI->setAttribute(text, NODE_MARGIN, &marginItem); + + auto text2 = nodeAPI->createNode(ARKUI_NODE_TEXT); + ArkUI_AttributeItem LABEL_Item2 = { .string = "Radio_defalut" }; + nodeAPI->setAttribute(text2, NODE_TEXT_CONTENT, &LABEL_Item2); + nodeAPI->setAttribute(text2, NODE_TEXT_FONT, &Font_Item); + nodeAPI->setAttribute(text2, NODE_MARGIN, &marginItem); + + auto text3 = nodeAPI->createNode(ARKUI_NODE_TEXT); + ArkUI_AttributeItem LABEL_Item3 = { .string = "Radio_checked" }; + nodeAPI->setAttribute(text3, NODE_TEXT_CONTENT, &LABEL_Item3); + nodeAPI->setAttribute(text3, NODE_TEXT_FONT, &Font_Item); + nodeAPI->setAttribute(text3, NODE_MARGIN, &marginItem); + + // parent node + auto parentColumn = nodeAPI->createNode(ARKUI_NODE_COLUMN); + auto row1 = nodeAPI->createNode(ARKUI_NODE_ROW); + auto row2 = nodeAPI->createNode(ARKUI_NODE_ROW); + auto row3 = nodeAPI->createNode(ARKUI_NODE_ROW); + + nodeAPI->addChild(parentColumn, row1); + nodeAPI->addChild(parentColumn, row2); + nodeAPI->addChild(parentColumn, row3); + nodeAPI->addChild(row1, text); + nodeAPI->addChild(row1, radio); + nodeAPI->addChild(row2, text2); + nodeAPI->addChild(row2, radio_second); + nodeAPI->addChild(row3, text3); + nodeAPI->addChild(row3, radio_third); + + std::string id(xComponentID); + if (OH_NativeXComponent_AttachNativeRootNode(PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn) == + INVALID_PARAM) { + OH_LOG_Print( + LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RadioStyleTest", "OH_NativeXComponent_AttachNativeRootNode failed"); + } + + napi_value exports; + if (napi_create_object(env, &exports) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_create_object failed"); + return nullptr; + } + + return exports; +} +} // namespace ArkUICApiDemo diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_style_test.h b/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_style_test.h new file mode 100644 index 000000000..1ced03262 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_style_test.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_RADIO_STYLE_TEST_H +#define ARKUI_CAPI_DEMO_RADIO_STYLE_TEST_H +#include +#include +#include + +#include "../common/common.h" + +namespace ArkUICApiDemo { + +class RadioStyleTest { +public: + ~RadioStyleTest(); + // RadioTest:testRadio002 + static napi_value CreateNativeNode(napi_env env, napi_callback_info info); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_RADIO_STYLE_TEST_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_value_group_test.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_value_group_test.cpp new file mode 100644 index 000000000..1b9b052fe --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_value_group_test.cpp @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2024 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 "./radio_value_group_test.h" + +#include + +#include "../manager/plugin_manager.h" +#include "row_component.h" +#define COLOR_RED 0xFFFF0000 +#define INVALID_PARAM 401 +#define ON_RADIO_EVENT_ID 1414 + +namespace ArkUICApiDemo { +static void OnEventReceive(ArkUI_NodeEvent* event) +{ + int32_t eventId = OH_ArkUI_NodeEvent_GetTargetId(event); + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + auto nodeHandler = OH_ArkUI_NodeEvent_GetNodeHandle(event); + + // 当触发Change事件,修改背景色 + if (ON_RADIO_EVENT_ID == eventId) { + ArkUI_NumberValue background_color_value[] = { { .u32 = COLOR_YELLOW } }; + ArkUI_AttributeItem background_color_item = { background_color_value, + sizeof(background_color_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandler, NODE_BACKGROUND_COLOR, &background_color_item); + auto text = static_cast(OH_ArkUI_NodeEvent_GetUserData(event)); + auto lable_Item = nodeAPI->getAttribute(nodeHandler, NODE_RADIO_VALUE); + nodeAPI->setAttribute(text, NODE_TEXT_CONTENT, lable_Item); + } +} + +napi_value RadioValueAndGroupTest::CreateNativeNode(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RadioValueAndGroupTest", "CreateNativeNode"); + + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RadioValueAndGroupTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + + // 设置Radio组件的Checked属性 + ArkUI_NumberValue true_checked_value[] = { { .i32 = 1 } }; + ArkUI_AttributeItem true_checked_item = { true_checked_value, + sizeof(true_checked_value) / sizeof(ArkUI_NumberValue) }; + + // 设置Radio组件宽度 + ArkUI_NumberValue default_width_value[] = { { .f32 = 50 } }; + ArkUI_AttributeItem default_width_item = { default_width_value, + sizeof(default_width_value) / sizeof(ArkUI_NumberValue) }; + + // 设置Radio组件高度 + ArkUI_NumberValue default_height_value[] = { { .f32 = 50 } }; + ArkUI_AttributeItem default_height_item = { default_height_value, + sizeof(default_height_value) / sizeof(ArkUI_NumberValue) }; + + // 设置Radio组件margin + ArkUI_NumberValue margin_value[] = { { .f32 = 20 } }; + ArkUI_AttributeItem margin_item = { margin_value, sizeof(margin_value) / sizeof(ArkUI_NumberValue) }; + + //---------------------------------------------------------------------------------------------------- + // 设置Radio value + ArkUI_AttributeItem radio_value1_Item = { .string = "radio" }; + ArkUI_AttributeItem radio_value2_Item = { .string = "radio_value1.2" }; + ArkUI_AttributeItem radio_value3_Item = { .string = "radio_value2.1" }; + ArkUI_AttributeItem radio_value4_Item = { .string = "radio_value2.2" }; + // 设置Radio group + ArkUI_AttributeItem radio_group1_Item = { .string = "group1" }; + ArkUI_AttributeItem radio_group2_Item = { .string = "group2" }; + + // first radio, 设置Radio value,设置group属于group1,同一个group1有一个可以是选中状态 + auto radio = nodeAPI->createNode(ARKUI_NODE_RADIO); + nodeAPI->setAttribute(radio, NODE_WIDTH, &default_width_item); + nodeAPI->setAttribute(radio, NODE_HEIGHT, &default_height_item); + nodeAPI->setAttribute(radio, NODE_MARGIN, &margin_item); + nodeAPI->setAttribute(radio, NODE_RADIO_CHECKED, &true_checked_item); + nodeAPI->setAttribute(radio, NODE_RADIO_VALUE, &radio_value1_Item); + nodeAPI->setAttribute(radio, NODE_RADIO_GROUP, &radio_group1_Item); + + // second radio, 设置Radio value,设置group属于group1 + auto radio_second = nodeAPI->createNode(ARKUI_NODE_RADIO); + nodeAPI->setAttribute(radio_second, NODE_WIDTH, &default_width_item); + nodeAPI->setAttribute(radio_second, NODE_HEIGHT, &default_height_item); + nodeAPI->setAttribute(radio_second, NODE_RADIO_VALUE, &radio_value2_Item); + nodeAPI->setAttribute(radio_second, NODE_RADIO_GROUP, &radio_group1_Item); + + // third radio, 设置Radio value,设置group属于group2 + auto radio_third = nodeAPI->createNode(ARKUI_NODE_RADIO); + nodeAPI->setAttribute(radio_third, NODE_WIDTH, &default_width_item); + nodeAPI->setAttribute(radio_third, NODE_HEIGHT, &default_height_item); + nodeAPI->setAttribute(radio_third, NODE_MARGIN, &margin_item); + nodeAPI->setAttribute(radio_third, NODE_RADIO_CHECKED, &true_checked_item); + nodeAPI->setAttribute(radio_third, NODE_RADIO_VALUE, &radio_value3_Item); + nodeAPI->setAttribute(radio_third, NODE_RADIO_GROUP, &radio_group2_Item); + + // third radio,, 设置Radio value,设置group属于group2 + auto radio_forth = nodeAPI->createNode(ARKUI_NODE_RADIO); + nodeAPI->setAttribute(radio_forth, NODE_WIDTH, &default_width_item); + nodeAPI->setAttribute(radio_forth, NODE_HEIGHT, &default_height_item); + nodeAPI->setAttribute(radio_forth, NODE_MARGIN, &margin_item); + nodeAPI->setAttribute(radio_forth, NODE_RADIO_VALUE, &radio_value4_Item); + nodeAPI->setAttribute(radio_forth, NODE_RADIO_GROUP, &radio_group2_Item); + + auto text = nodeAPI->createNode(ARKUI_NODE_TEXT); + ArkUI_AttributeItem LABEL_Item = { .string = "radio_value1.1" }; + ArkUI_NumberValue fontSize[] = { 20 }; + ArkUI_AttributeItem Font_Item = { fontSize, 1 }; + + ArkUI_NumberValue marginValue[] = { 20 }; + ArkUI_AttributeItem marginItem = { marginValue, 1 }; + nodeAPI->setAttribute(text, NODE_TEXT_CONTENT, &LABEL_Item); + nodeAPI->setAttribute(text, NODE_TEXT_FONT, &Font_Item); + nodeAPI->setAttribute(text, NODE_MARGIN, &marginItem); + + auto text2 = nodeAPI->createNode(ARKUI_NODE_TEXT); + ArkUI_AttributeItem LABEL_Item2 = { .string = "radio_value1.2" }; + nodeAPI->setAttribute(text2, NODE_TEXT_CONTENT, &LABEL_Item2); + nodeAPI->setAttribute(text2, NODE_TEXT_FONT, &Font_Item); + nodeAPI->setAttribute(text2, NODE_MARGIN, &marginItem); + + auto text3 = nodeAPI->createNode(ARKUI_NODE_TEXT); + ArkUI_AttributeItem LABEL_Item3 = { .string = "radio_value2.1" }; + nodeAPI->setAttribute(text3, NODE_TEXT_CONTENT, &LABEL_Item3); + nodeAPI->setAttribute(text3, NODE_TEXT_FONT, &Font_Item); + nodeAPI->setAttribute(text3, NODE_MARGIN, &marginItem); + + auto text4 = nodeAPI->createNode(ARKUI_NODE_TEXT); + ArkUI_AttributeItem LABEL_Item4 = { .string = "radio_value2.2" }; + nodeAPI->setAttribute(text4, NODE_TEXT_CONTENT, &LABEL_Item4); + nodeAPI->setAttribute(text4, NODE_TEXT_FONT, &Font_Item); + nodeAPI->setAttribute(text4, NODE_MARGIN, &marginItem); + + // parent node + auto parentColumn = nodeAPI->createNode(ARKUI_NODE_COLUMN); + auto row1 = new RowComponent(); + auto row2 = new RowComponent(); + auto row3 = new RowComponent(); + auto row4 = new RowComponent(); + + nodeAPI->addChild(parentColumn, row1->GetComponent()); + nodeAPI->addChild(parentColumn, row2->GetComponent()); + nodeAPI->addChild(parentColumn, row3->GetComponent()); + nodeAPI->addChild(parentColumn, row4->GetComponent()); + nodeAPI->addChild(row1->GetComponent(), text); + nodeAPI->addChild(row1->GetComponent(), radio); + nodeAPI->addChild(row2->GetComponent(), text2); + nodeAPI->addChild(row2->GetComponent(), radio_second); + nodeAPI->addChild(row3->GetComponent(), text3); + nodeAPI->addChild(row3->GetComponent(), radio_third); + nodeAPI->addChild(row4->GetComponent(), text4); + nodeAPI->addChild(row4->GetComponent(), radio_forth); + + // 设置组件Id + ArkUI_AttributeItem idItem; + idItem.string = "radioOnChange"; + nodeAPI->setAttribute(radio_second, NODE_ID, &idItem); + + nodeAPI->registerNodeEventReceiver(&OnEventReceive); + nodeAPI->registerNodeEvent(radio, NODE_RADIO_EVENT_ON_CHANGE, ON_RADIO_EVENT_ID, text); + + std::string id(xComponentID); + if (OH_NativeXComponent_AttachNativeRootNode(PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn) == + INVALID_PARAM) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RadioValueAndGroupTest", + "OH_NativeXComponent_AttachNativeRootNode failed"); + } + + napi_value exports; + if (napi_create_object(env, &exports) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_create_object failed"); + return nullptr; + } + + return exports; +} +} // namespace ArkUICApiDemo diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_value_group_test.h b/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_value_group_test.h new file mode 100644 index 000000000..d284f3bb5 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/radio/radio_value_group_test.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_RADIO_VALUE_GROUP_TEST_H +#define ARKUI_CAPI_DEMO_RADIO_VALUE_GROUP_TEST_H +#include +#include +#include + +#include "../common/common.h" + +namespace ArkUICApiDemo { + +class RadioValueAndGroupTest { +public: + ~RadioValueAndGroupTest(); + // RadioTest:testRadio003,testRadio004 + static napi_value CreateNativeNode(napi_env env, napi_callback_info info); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_RADIO_VALUE_GROUP_TEST_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/refresh/refresh_test.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/refresh/refresh_test.cpp new file mode 100644 index 000000000..627004256 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/refresh/refresh_test.cpp @@ -0,0 +1,542 @@ +/* + * Copyright (c) 2024 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 "refresh_test.h" + +#include +#include +#include + +#include "../manager/plugin_manager.h" +#include "button_component.h" +#include "column_component.h" +#include "refresh_component.h" +#include "scroll_component.h" +#include "text_component.h" +#include "waterflow_component.h" +#define COLOR_RED 0xFFFF0000 +#define INVALID_PARAM 401 +#define ON_REFRESH_EVENT_ID 1314 +#define ON_REFRESH_EVENT_ID_SLEEP 1315 // content and radio +constexpr int32_t FLOW_ITEM_COUNT = 15; + +namespace ArkUICApiDemo { + +static void OnEventReceive(ArkUI_NodeEvent* event) +{ + int32_t eventId = OH_ArkUI_NodeEvent_GetTargetId(event); + int32_t eventType = OH_ArkUI_NodeEvent_GetEventType(event); + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + + // 当触发刷新事件时,设置refreshing属性为0,并通过radio的checked属性展示 + if (eventType == NODE_REFRESH_ON_REFRESH) { + if (ON_REFRESH_EVENT_ID == eventId) { + auto nodeHandler = OH_ArkUI_NodeEvent_GetNodeHandle(event); + auto radio = static_cast(OH_ArkUI_NodeEvent_GetUserData(event)); + ArkUI_NumberValue refreshing_value[] = { { .i32 = 0 } }; + ArkUI_AttributeItem refreshing_item = { refreshing_value, + sizeof(refreshing_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandler, NODE_REFRESH_REFRESHING, &refreshing_item); + + auto refreshing_attr = nodeAPI->getAttribute(nodeHandler, NODE_REFRESH_REFRESHING); + ArkUI_NumberValue checked_value[] = { { .i32 = static_cast(refreshing_attr->value[0].f32) } }; + ArkUI_AttributeItem checked_item = { checked_value, sizeof(checked_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(radio, NODE_RADIO_CHECKED, &checked_item); + } else if (ON_REFRESH_EVENT_ID_SLEEP == eventId) { + std::this_thread::sleep_for(std::chrono::seconds(4)); + } + } else if (ON_REFRESH_EVENT_ID == eventId && eventType == NODE_REFRESH_ON_OFFSET_CHANGE) { + auto refresh = OH_ArkUI_NodeEvent_GetNodeHandle(event); + ArkUI_NodeComponentEvent* result = OH_ArkUI_NodeEvent_GetNodeComponentEvent(event); + float offset = result->data[0].f32; + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "refreshTest", "offset=%{public}f", offset); + // 设置背景色 + ArkUI_NumberValue background_color_value[] = { { .u32 = COLOR_YELLOW } }; + ArkUI_AttributeItem background_color_item = { background_color_value, + sizeof(background_color_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(refresh, NODE_BACKGROUND_COLOR, &background_color_item); + } +} +static void CreateRefreshingComponent(ArkUI_NativeNodeAPI_1* nodeAPI, ArkUI_NodeHandle& refreshingComponent) +{ + // clip + ArkUI_NumberValue clip_value[] = { { .i32 = 1 } }; + ArkUI_AttributeItem clip_item = { clip_value, sizeof(clip_value) / sizeof(ArkUI_NumberValue) }; + refreshingComponent = nodeAPI->createNode(ARKUI_NODE_STACK); + nodeAPI->setAttribute(refreshingComponent, NODE_CLIP, &clip_item); + + auto row = nodeAPI->createNode(ARKUI_NODE_ROW); + // process height + ArkUI_NumberValue height_value[] = { { .f32 = 32 } }; + ArkUI_AttributeItem height_item = { height_value, sizeof(height_value) / sizeof(ArkUI_NumberValue) }; + + // margin + ArkUI_NumberValue margin_value[] = { { .f32 = 5 } }; + ArkUI_AttributeItem margin_item = { margin_value, sizeof(margin_value) / sizeof(ArkUI_NumberValue) }; + + auto loadingProgress = nodeAPI->createNode(ARKUI_NODE_LOADING_PROGRESS); + nodeAPI->setAttribute(loadingProgress, NODE_HEIGHT, &height_item); + + auto text = nodeAPI->createNode(ARKUI_NODE_TEXT); + ArkUI_AttributeItem LABEL_Item = { .string = "refreshing..." }; + ArkUI_NumberValue fontSize[] = { 16 }; + ArkUI_AttributeItem Font_Item = { fontSize, 1 }; + nodeAPI->setAttribute(text, NODE_TEXT_CONTENT, &LABEL_Item); + nodeAPI->setAttribute(text, NODE_TEXT_FONT, &Font_Item); + nodeAPI->setAttribute(text, NODE_MARGIN, &margin_item); + + nodeAPI->addChild(refreshingComponent, row); + nodeAPI->addChild(row, text); +} +static void CreateList(ArkUI_NativeNodeAPI_1* nodeAPI, ArkUI_NodeHandle& list, float width = 400, float height = 230) +{ + // 创建List + ArkUI_NumberValue list_width_value[] = { { .f32 = width } }; + ArkUI_AttributeItem list_width_item = { list_width_value, sizeof(list_width_value) / sizeof(ArkUI_NumberValue) }; + + ArkUI_NumberValue list_height_value[] = { { .f32 = height } }; + ArkUI_AttributeItem list_height_item = { list_height_value, sizeof(list_height_value) / sizeof(ArkUI_NumberValue) }; + + list = nodeAPI->createNode(ARKUI_NODE_LIST); + nodeAPI->setAttribute(list, NODE_WIDTH, &list_width_item); + nodeAPI->setAttribute(list, NODE_HEIGHT, &list_height_item); + + // 设置list item border + ArkUI_NumberValue border_value[] = { { .f32 = 1 } }; + ArkUI_AttributeItem border_item = { border_value, sizeof(border_value) / sizeof(ArkUI_NumberValue) }; + // 设置设置list item margin + ArkUI_NumberValue margin_value[] = { { .f32 = 5 } }; + ArkUI_AttributeItem margin_item = { margin_value, sizeof(margin_value) / sizeof(ArkUI_NumberValue) }; + + // 设置设置list item宽 + ArkUI_NumberValue listitem_width_value[] = { { .f32 = 350 } }; + ArkUI_AttributeItem listitem_width_item = { listitem_width_value, + sizeof(listitem_width_value) / sizeof(ArkUI_NumberValue) }; + + // 设置设置list item高 + ArkUI_NumberValue listitem_height_value[] = { { .f32 = 50 } }; + ArkUI_AttributeItem listitem_height_item = { listitem_height_value, + sizeof(listitem_height_value) / sizeof(ArkUI_NumberValue) }; + + ArkUI_NumberValue listItme_value[] = { { .u32 = COLOR_PINK } }; + ArkUI_AttributeItem listItem_backgroundColor = { listItme_value, 1 }; + + ArkUI_NumberValue list_value[] = { { .u32 = COLOR_GREEN } }; + ArkUI_AttributeItem list_backgroundColor = { list_value, 1 }; + + for (int i = 0; i < 10; i++) { + auto listitem = nodeAPI->createNode(ARKUI_NODE_LIST_ITEM); + nodeAPI->setAttribute(listitem, NODE_WIDTH, &listitem_width_item); + nodeAPI->setAttribute(listitem, NODE_HEIGHT, &listitem_height_item); + nodeAPI->setAttribute(listitem, NODE_MARGIN, &margin_item); + nodeAPI->setAttribute(listitem, NODE_BACKGROUND_COLOR, &listItem_backgroundColor); + nodeAPI->addChild(list, listitem); + } + nodeAPI->setAttribute(list, NODE_BORDER_WIDTH, &border_item); + nodeAPI->setAttribute(list, NODE_MARGIN, &margin_item); +} +static void CreateRadio(ArkUI_NativeNodeAPI_1* nodeAPI, ArkUI_NodeHandle& radio) +{ + // 设置Radio组件宽度 + ArkUI_NumberValue default_width_value[] = { { .f32 = 50 } }; + ArkUI_AttributeItem default_width_item = { default_width_value, + sizeof(default_width_value) / sizeof(ArkUI_NumberValue) }; + + // 设置Radio组件高度 + ArkUI_NumberValue default_height_value[] = { { .f32 = 50 } }; + ArkUI_AttributeItem default_height_item = { default_height_value, + sizeof(default_height_value) / sizeof(ArkUI_NumberValue) }; + // 设置Radio组件的Checked属性 + ArkUI_NumberValue true_checked_value[] = { { .i32 = 1 } }; + ArkUI_AttributeItem true_checked_item = { true_checked_value, + sizeof(true_checked_value) / sizeof(ArkUI_NumberValue) }; + + radio = nodeAPI->createNode(ARKUI_NODE_RADIO); + nodeAPI->setAttribute(radio, NODE_WIDTH, &default_width_item); + nodeAPI->setAttribute(radio, NODE_HEIGHT, &default_height_item); + nodeAPI->setAttribute(radio, NODE_RADIO_CHECKED, &true_checked_item); +} +static std::shared_ptr CreateWaterFlowByNestedScroll(int32_t forward, int32_t backward, bool up = true) +{ + auto scroll = std::make_shared(); + auto column = std::make_shared(); + auto waterFlow = std::make_shared(); + auto input = std::vector>(); + auto adapter = std::make_shared>(input); + auto reserveTop = std::make_shared(); + auto reserveDown = std::make_shared(); + // 设置上占位框 + reserveTop->SetWidth(410); + reserveTop->SetHeight(60); + reserveTop->SetBackgroundColor(COLOR_GREEN); + reserveTop->SetBorderRadius(10, 10, 10, 10); + // 设置下占位框 + reserveDown->SetWidth(410); + reserveDown->SetHeight(60); + reserveDown->SetBackgroundColor(COLOR_RED); + reserveDown->SetBorderRadius(10, 10, 10, 10); + + waterFlow->SetWidth(410); + waterFlow->SetHeight(500); + waterFlow->SetWaterFlowRowsGap(10); + waterFlow->SetBackgroundColor(COLOR_GRAY); + waterFlow->SetLazyAdapter(adapter); + waterFlow->SetBorderWidth(1, 1, 1, 1); + waterFlow->SetBorderColor(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK, COLOR_BLACK); + waterFlow->SetColumnsTemplate("1fr 1fr 1fr"); + waterFlow->SetRowsTemplate("1fr 1fr 1fr"); + waterFlow->SetWaterFlowNestedScroll(forward, backward); + waterFlow->SetId("refreshNested"); + + auto item = waterFlow->getAttribute(NODE_SCROLL_NESTED_SCROLL); + if (item->value[0].i32 != forward || item->value[1].i32 != backward) { + waterFlow->SetBackgroundColor(COLOR_RED); + } + + for (int i = 0; i < FLOW_ITEM_COUNT; i++) { + auto col = std::make_shared(); + col->SetWidth(100); + col->SetHeight(100); + col->SetMargin(10); + if (i == 0) { + col->SetBackgroundColor(COLOR_PURPLE); + } else { + col->SetBackgroundColor(COLOR_WHITE); + } + adapter->InsertItem(i, col); + } + column->AddChild(reserveTop); + column->AddChild(waterFlow); + column->AddChild(reserveDown); + // 设置scroll选项 + scroll->SetHeight(600); + scroll->AddChild(column); + scroll->SetBorderWidth(1, 1, 1, 1); + scroll->SetBorderColor(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK, COLOR_BLACK); + if (up) { + scroll->SetScrollTo(0, 200, {}); + waterFlow->SetWaterFlowScrollToIndex(FLOW_ITEM_COUNT - 1, 0, 0); + } + return scroll; +} +napi_value RefreshTest::CreateNativeNodeForRefreshContentAndRatio(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "refreshTest", "CreateNativeNodeForRefreshContent"); + // 获取id + size_t argc = 2; + napi_value args[2] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "refreshTest", "GetContext env or info is null"); + return nullptr; + } + + double ratio = 1; + napi_get_value_double(env, args[1], &ratio); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "refreshTest", "ratio=%{public}lf", ratio); + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "refreshTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + + // 设置refresh pullToRefresh属性 + ArkUI_NumberValue pullToRefresh_value[] = { { .i32 = 1 } }; + ArkUI_AttributeItem pullToRefresh_item = { pullToRefresh_value, 1 }; + + // 创建refresh组件并添加到容器内 + auto refresh = nodeAPI->createNode(ARKUI_NODE_REFRESH); + nodeAPI->setAttribute(refresh, NODE_REFRESH_PULL_TO_REFRESH, &pullToRefresh_item); + ArkUI_NodeHandle refreshingComponent; + CreateRefreshingComponent(nodeAPI, refreshingComponent); + ArkUI_AttributeItem refreshingComponent_item { .object = refreshingComponent }; + nodeAPI->setAttribute(refresh, NODE_REFRESH_CONTENT, &refreshingComponent_item); + + // 设置refresh pullDownRatio属性正常值0~1:NODE_REFRESH_PULL_DOWN_RATIO + ArkUI_NumberValue pullDownRatio_value[] = { { .f32 = static_cast(ratio) } }; + ArkUI_AttributeItem pullDownRatio_item = { pullDownRatio_value, + sizeof(pullDownRatio_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(refresh, NODE_REFRESH_PULL_DOWN_RATIO, &pullDownRatio_item); + nodeAPI->registerNodeEventReceiver(&OnEventReceive); + nodeAPI->registerNodeEvent(refresh, NODE_REFRESH_ON_REFRESH, ON_REFRESH_EVENT_ID_SLEEP, nullptr); + + // 设置组件Id + ArkUI_AttributeItem idItem; + idItem.string = "refreshcontent"; + nodeAPI->setAttribute(refresh, NODE_ID, &idItem); + + ArkUI_NodeHandle list; + CreateList(nodeAPI, list); + + auto parentColumn = nodeAPI->createNode(ARKUI_NODE_COLUMN); + nodeAPI->addChild(parentColumn, refresh); + nodeAPI->addChild(refresh, list); + // 挂载组件 + std::string id(xComponentID); + OH_NativeXComponent_AttachNativeRootNode(PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn); + + napi_value exports; + napi_create_object(env, &exports); + return exports; +} +napi_value RefreshTest::CreateNativeNodeForRefreshing(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "refreshTest", "CreateNativeNodeForRefreshing"); + // 获取id + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "refreshTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + + // 设置refresh属性:NODE_REFRESH_REFRESHING + ArkUI_NumberValue refreshing_value[] = { { .i32 = 1 } }; + ArkUI_AttributeItem refreshing_item = { refreshing_value, sizeof(refreshing_value) / sizeof(ArkUI_NumberValue) }; + + // 创建refresh组件 + auto refresh = nodeAPI->createNode(ARKUI_NODE_REFRESH); + nodeAPI->setAttribute(refresh, NODE_REFRESH_REFRESHING, &refreshing_item); + // 设置refresh组件Id + ArkUI_AttributeItem idItem; + idItem.string = "refresh"; + nodeAPI->setAttribute(refresh, NODE_ID, &idItem); + // 创建list并放到refresh组件下 + ArkUI_NodeHandle list; + CreateList(nodeAPI, list); + nodeAPI->addChild(refresh, list); + // 创建list并放到radio组件下 + ArkUI_NodeHandle radio; + CreateRadio(nodeAPI, radio); + nodeAPI->registerNodeEventReceiver(&OnEventReceive); + nodeAPI->registerNodeEvent(refresh, NODE_REFRESH_ON_REFRESH, ON_REFRESH_EVENT_ID, radio); + nodeAPI->registerNodeEvent(refresh, NODE_REFRESH_ON_OFFSET_CHANGE, ON_REFRESH_EVENT_ID, nullptr); + + auto parentColumn = nodeAPI->createNode(ARKUI_NODE_COLUMN); + nodeAPI->addChild(parentColumn, refresh); + nodeAPI->addChild(refresh, list); + nodeAPI->addChild(parentColumn, radio); + + // 挂载组件 + std::string id(xComponentID); + OH_NativeXComponent_AttachNativeRootNode(PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn); + + napi_value exports; + napi_create_object(env, &exports); + + return exports; +} +napi_value RefreshTest::CreateNativeNode(napi_env env, napi_callback_info info) +{ + // 获取id + size_t argc = 3; + napi_value args[3] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "refreshTest", "GetContext env or info is null"); + return nullptr; + } + if (args[1] == nullptr || args[2] == nullptr) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "refreshTest", "args[1] == nullptr || args[2] == nullptr"); + } + double offset = 64; + napi_get_value_double(env, args[1], &offset); + + int32_t pullToRefresh = 1; + napi_get_value_int32(env, args[2], &pullToRefresh); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "refreshTest", "pullToRefresh = %{public}d,offset=%{public}lf", + pullToRefresh, offset); + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + + // 设置refreshOffset属性:NODE_REFRESH_OFFSET + ArkUI_NumberValue refreshOffset_value[] = { { .f32 = static_cast(offset) } }; + ArkUI_AttributeItem refreshOffset_item = { refreshOffset_value, + sizeof(refreshOffset_value) / sizeof(ArkUI_NumberValue) }; + + // 设置refresh pullToRefresh属性 + ArkUI_NumberValue pullToRefresh_value[] = { { .i32 = pullToRefresh } }; + ArkUI_AttributeItem pullToRefresh_item = { pullToRefresh_value, + sizeof(pullToRefresh_value) / sizeof(ArkUI_NumberValue) }; + + // 创建refresh组件并添加到容器内,设置NODE_REFRESH_OFFSET,NODE_REFRESH_PULL_TO_REFRESH + auto refresh = nodeAPI->createNode(ARKUI_NODE_REFRESH); + nodeAPI->setAttribute(refresh, NODE_REFRESH_OFFSET, &refreshOffset_item); + nodeAPI->setAttribute(refresh, NODE_REFRESH_PULL_TO_REFRESH, &pullToRefresh_item); + // 设置组件Id + ArkUI_AttributeItem idItem; + idItem.string = "refresh"; + nodeAPI->setAttribute(refresh, NODE_ID, &idItem); + + ArkUI_NodeHandle list; + CreateList(nodeAPI, list); + ArkUI_NodeHandle radio; + CreateRadio(nodeAPI, radio); + nodeAPI->registerNodeEventReceiver(&OnEventReceive); + nodeAPI->registerNodeEvent(refresh, NODE_REFRESH_ON_REFRESH, ON_REFRESH_EVENT_ID, radio); + + // parent node + auto parentColumn = nodeAPI->createNode(ARKUI_NODE_COLUMN); + nodeAPI->addChild(parentColumn, refresh); + nodeAPI->addChild(refresh, list); + nodeAPI->addChild(parentColumn, radio); + + // 挂载组件 + std::string id(xComponentID); + OH_NativeXComponent_AttachNativeRootNode(PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn); + + napi_value exports; + napi_create_object(env, &exports); + + return exports; +} +napi_value RefreshTest::CreateNativeNodeNestedScroll(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "refreshTest", "CreateNativeNodeNestedScroll"); + // 获取id + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "refreshTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + + auto parentColumn = new ColumnComponent(); + auto refresh = std::make_shared(ARKUI_NODE_REFRESH); + + ArkUI_NodeHandle refreshingComponent; + CreateRefreshingComponent(nodeAPI, refreshingComponent); + ArkUI_AttributeItem refreshingComponent_item { .object = refreshingComponent }; + nodeAPI->setAttribute(refresh->GetComponent(), NODE_REFRESH_CONTENT, &refreshingComponent_item); + + auto nestedScroll = CreateWaterFlowByNestedScroll(ArkUI_ScrollNestedMode::ARKUI_SCROLL_NESTED_MODE_PARENT_FIRST, + ArkUI_ScrollNestedMode::ARKUI_SCROLL_NESTED_MODE_PARENT_FIRST); + refresh->AddChild(nestedScroll); + parentColumn->AddChild(refresh); + + // 挂载组件 + std::string id(xComponentID); + OH_NativeXComponent_AttachNativeRootNode( + PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn->GetComponent()); + + napi_value exports; + napi_create_object(env, &exports); + + return exports; +} + +napi_value RefreshTest::CreateNativeNodeForResetAttribute(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "refreshTest", "CreateNativeNodeForResetAttribute"); + // 获取id + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "refreshTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + + auto parentColumn = new ColumnComponent(); + auto refresh = std::make_shared(); + refresh->SetPullToRefresh(0); // 默认值:1 + refresh->SetPullDownRatio(0.5); // 默认值:0.0f + refresh->SetRefreshOffset(20); // 默认值:0.0f + + ArkUI_NodeHandle list; + CreateList(nodeAPI, list); + + auto text = new TextComponent(); + text->SetWidth(300); + text->SetHeight(200); + text->SetBackgroundColor(COLOR_PINK); + + auto button = new ButtonComponent(); + button->SetWidth(200); + button->SetHeight(100); + button->SetId("ResetRefresh"); + button->SetLable("ResetRefresh"); + button->SetMargin(10); + button->RegisterOnClick([refresh, text]() { + refresh->resetAttribute(NODE_REFRESH_PULL_TO_REFRESH); + refresh->resetAttribute(NODE_REFRESH_PULL_DOWN_RATIO); + refresh->resetAttribute(NODE_REFRESH_OFFSET); + + auto pullToRefreshItem = refresh->getAttribute(NODE_REFRESH_PULL_TO_REFRESH); + auto pullDownRatio = refresh->getAttribute(NODE_REFRESH_PULL_TO_REFRESH); + auto refreshOffset = refresh->getAttribute(NODE_REFRESH_PULL_TO_REFRESH); + + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "refreshTest", + "pullToRefreshItem=%{public}d,pullDownRatio=%{public}f,refreshOffset=%{public}f", + pullToRefreshItem->value[0].i32, pullDownRatio->value[0].f32, refreshOffset->value[0].f32); + + std::string str = "pullToRefresh:" + std::to_string(pullToRefreshItem->value[0].i32) + "\n" + + "pullDownRatio:" + std::to_string(pullDownRatio->value[0].f32) + "\n" + + "refreshOffset:" + std::to_string(refreshOffset->value[0].f32) + "\n"; + + text->SetFontSize(20); + text->SetTextContent(str); + }); + + parentColumn->AddChild(std::shared_ptr(refresh)); + parentColumn->AddChild(std::shared_ptr(button)); + nodeAPI->addChild(refresh->GetComponent(), list); + parentColumn->AddChild(std::shared_ptr(text)); + // 挂载组件 + std::string id(xComponentID); + OH_NativeXComponent_AttachNativeRootNode( + PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn->GetComponent()); + + napi_value exports; + napi_create_object(env, &exports); + + return exports; +} +} // namespace ArkUICApiDemo diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/refresh/refresh_test.h b/function/ui_compare/capidemo/entry/src/main/cpp/refresh/refresh_test.h new file mode 100644 index 000000000..516167ce4 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/refresh/refresh_test.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_REFRESH_TEST_H +#define ARKUI_CAPI_DEMO_REFRESH_TEST_H + +#include +#include +#include + +#include "../common/common.h" + +namespace ArkUICApiDemo { + +class RefreshTest { +public: + ~RefreshTest(); + // RefreshTest:testRefresh001,testRefresh002,testRefresh003,testRefresh004 + static napi_value CreateNativeNode(napi_env env, napi_callback_info info); + // RefreshTest:testRefresh005,testRefresh006 + static napi_value CreateNativeNodeForRefreshContentAndRatio(napi_env env, napi_callback_info info); + // RefreshTest:testRefresh007 + static napi_value CreateNativeNodeForRefreshing(napi_env env, napi_callback_info info); + // RefreshTest:testRefresh008 + static napi_value CreateNativeNodeNestedScroll(napi_env env, napi_callback_info info); + // RefreshTest:testRefresh009 + static napi_value CreateNativeNodeForResetAttribute(napi_env env, napi_callback_info info); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_REFRESH_TEST_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/row/row_align_items_test.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/row/row_align_items_test.cpp new file mode 100644 index 000000000..4026213cd --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/row/row_align_items_test.cpp @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2024 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 "row_align_items_test.h" + +#include + +#include "../manager/plugin_manager.h" + +namespace ArkUICApiDemo { + +static auto createChildNode(ArkUI_NativeNodeAPI_1* nodeAPI, uint32_t backgroundColor) +{ + auto nodeHandle = nodeAPI->createNode(ARKUI_NODE_BUTTON); + // set width + ArkUI_NumberValue button_width_value[] = { { .f32 = 30 } }; + ArkUI_AttributeItem button_width_item = { button_width_value, + sizeof(button_width_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_WIDTH, &button_width_item); + // set height + ArkUI_NumberValue button_height_value[] = { { .f32 = 30 } }; + ArkUI_AttributeItem button_height_item = { button_height_value, + sizeof(button_height_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_HEIGHT, &button_height_item); + + // set background color + ArkUI_NumberValue button1_background_color_value[] = { { .u32 = backgroundColor } }; + ArkUI_AttributeItem button1_background_color_item = { button1_background_color_value, + sizeof(button1_background_color_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_BACKGROUND_COLOR, &button1_background_color_item); + return nodeHandle; +} + +static auto createRowNode(ArkUI_NativeNodeAPI_1* nodeAPI, int32_t verticalAlign) +{ + auto nodeHandle = nodeAPI->createNode(ARKUI_NODE_ROW); + // set background color + ArkUI_NumberValue background_color_value[] = { { .u32 = COLOR_BLACK } }; + ArkUI_AttributeItem background_color_item = { background_color_value, + sizeof(background_color_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_BACKGROUND_COLOR, &background_color_item); + // set width + ArkUI_NumberValue width_value[] = { { .f32 = 150 } }; + ArkUI_AttributeItem width_item = { width_value, sizeof(width_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_WIDTH, &width_item); + // set height + ArkUI_NumberValue height_value[] = { { .f32 = 150 } }; + ArkUI_AttributeItem height_item = { height_value, sizeof(height_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_HEIGHT, &height_item); + // set margin + ArkUI_NumberValue margin_value[] = { { .f32 = 5 } }; + ArkUI_AttributeItem margin_item = { margin_value, sizeof(margin_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_MARGIN, &margin_item); + // set children + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_RED)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_GREEN)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_YELLOW)); + // set AlignItems + ArkUI_NumberValue alignItems_value[] = { { .i32 = verticalAlign } }; + ArkUI_AttributeItem alignItems_item = { alignItems_value, sizeof(alignItems_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_ROW_ALIGN_ITEMS, &alignItems_item); + return nodeHandle; +} + +static auto createRowNode(ArkUI_NativeNodeAPI_1* nodeAPI, int32_t verticalAlign, int32_t flexAlign) +{ + auto nodeHandle = nodeAPI->createNode(ARKUI_NODE_ROW); + // set background color + ArkUI_NumberValue background_color_value[] = { { .u32 = COLOR_BLACK } }; + ArkUI_AttributeItem background_color_item = { background_color_value, + sizeof(background_color_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_BACKGROUND_COLOR, &background_color_item); + // set width + ArkUI_NumberValue width_value[] = { { .f32 = 150 } }; + ArkUI_AttributeItem width_item = { width_value, sizeof(width_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_WIDTH, &width_item); + // set height + ArkUI_NumberValue height_value[] = { { .f32 = 150 } }; + ArkUI_AttributeItem height_item = { height_value, sizeof(height_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_HEIGHT, &height_item); + // set margin + ArkUI_NumberValue margin_value[] = { { .f32 = 5 } }; + ArkUI_AttributeItem margin_item = { margin_value, sizeof(margin_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_MARGIN, &margin_item); + // set children + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_RED)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_GREEN)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_YELLOW)); + // set AlignItems + ArkUI_NumberValue alignItems_value[] = { { .i32 = verticalAlign } }; + ArkUI_AttributeItem alignItems_item = { alignItems_value, sizeof(alignItems_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_ROW_ALIGN_ITEMS, &alignItems_item); + // set justifyContent + ArkUI_NumberValue justifyContent_value[] = { { .i32 = flexAlign } }; + ArkUI_AttributeItem justifyContent_item = { justifyContent_value, + sizeof(justifyContent_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_ROW_JUSTIFY_CONTENT, &justifyContent_item); + return nodeHandle; +} + +napi_value RowAlignItemsTest::CreateNativeNode(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RowAlignItemsTest", "CreateNativeNode"); + + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RowAlignItemsTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + // set parent node + auto parentColumn = nodeAPI->createNode(ARKUI_NODE_COLUMN); + auto rowTop = createRowNode(nodeAPI, ARKUI_VERTICAL_ALIGNMENT_TOP); + auto rowCenter = createRowNode(nodeAPI, ARKUI_VERTICAL_ALIGNMENT_CENTER); + auto rowBottom = createRowNode(nodeAPI, ARKUI_VERTICAL_ALIGNMENT_BOTTOM); + auto rowSpaceError = createRowNode(nodeAPI, -1); + nodeAPI->addChild(parentColumn, rowTop); + nodeAPI->addChild(parentColumn, rowCenter); + nodeAPI->addChild(parentColumn, rowBottom); + nodeAPI->addChild(parentColumn, rowSpaceError); + std::string id(xComponentID); + if (OH_NativeXComponent_AttachNativeRootNode(PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn) == + INVALID_PARAM) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RowAlignItemsTest", + "OH_NativeXComponent_AttachNativeRootNode failed"); + } + + napi_value exports; + if (napi_create_object(env, &exports) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_create_object failed"); + return nullptr; + } + + return exports; +} + +napi_value RowAlignItemsTest::CreateMoreAttributeNativeNode(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RowAlignItemsTest", "CreateNativeNode"); + + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RowAlignItemsTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + // set parent node + auto parentColumn = nodeAPI->createNode(ARKUI_NODE_COLUMN); + auto row1 = createRowNode(nodeAPI, ARKUI_VERTICAL_ALIGNMENT_TOP, ARKUI_FLEX_ALIGNMENT_END); + auto row2 = createRowNode(nodeAPI, ARKUI_VERTICAL_ALIGNMENT_CENTER, ARKUI_FLEX_ALIGNMENT_SPACE_BETWEEN); + auto row3 = createRowNode(nodeAPI, ARKUI_VERTICAL_ALIGNMENT_BOTTOM, ARKUI_FLEX_ALIGNMENT_SPACE_EVENLY); + auto row4 = createRowNode(nodeAPI, ARKUI_VERTICAL_ALIGNMENT_CENTER, ARKUI_FLEX_ALIGNMENT_SPACE_AROUND); + nodeAPI->addChild(parentColumn, row1); + nodeAPI->addChild(parentColumn, row2); + nodeAPI->addChild(parentColumn, row3); + nodeAPI->addChild(parentColumn, row4); + std::string id(xComponentID); + if (OH_NativeXComponent_AttachNativeRootNode(PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn) == + INVALID_PARAM) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RowAlignItemsTest", + "OH_NativeXComponent_AttachNativeRootNode failed"); + } + + napi_value exports; + if (napi_create_object(env, &exports) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_create_object failed"); + return nullptr; + } + + return exports; +} +} // namespace ArkUICApiDemo \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/row/row_align_items_test.h b/function/ui_compare/capidemo/entry/src/main/cpp/row/row_align_items_test.h new file mode 100644 index 000000000..485023302 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/row/row_align_items_test.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_ROW_ALIGN_ITEMS_TEST_H +#define ARKUI_CAPI_DEMO_ROW_ALIGN_ITEMS_TEST_H + +#include +#include +#include + +#include "../common/common.h" + +namespace ArkUICApiDemo { + +class RowAlignItemsTest { +public: + ~RowAlignItemsTest(); + static napi_value CreateNativeNode(napi_env env, napi_callback_info info); + static napi_value CreateMoreAttributeNativeNode(napi_env env, napi_callback_info info); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_ROW_ALIGN_ITEMS_TEST_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/row/row_justify_content_test.cpp b/function/ui_compare/capidemo/entry/src/main/cpp/row/row_justify_content_test.cpp new file mode 100644 index 000000000..b54039bf1 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/row/row_justify_content_test.cpp @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2024 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 "row_justify_content_test.h" + +#include + +#include "../manager/plugin_manager.h" + +namespace ArkUICApiDemo { + +static auto createChildNode(ArkUI_NativeNodeAPI_1* nodeAPI, uint32_t backgroundColor) +{ + auto nodeHandle = nodeAPI->createNode(ARKUI_NODE_BUTTON); + // set width + ArkUI_NumberValue button_width_value[] = { { .f32 = 20 } }; + ArkUI_AttributeItem button_width_item = { button_width_value, + sizeof(button_width_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_WIDTH, &button_width_item); + // set height + ArkUI_NumberValue button_height_value[] = { { .f32 = 20 } }; + ArkUI_AttributeItem button_height_item = { button_height_value, + sizeof(button_height_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_HEIGHT, &button_height_item); + + // set background color + ArkUI_NumberValue button1_background_color_value[] = { { .u32 = backgroundColor } }; + ArkUI_AttributeItem button1_background_color_item = { button1_background_color_value, + sizeof(button1_background_color_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_BACKGROUND_COLOR, &button1_background_color_item); + return nodeHandle; +} + +static auto createRowNode(ArkUI_NativeNodeAPI_1* nodeAPI, int32_t flexAlign) +{ + auto nodeHandle = nodeAPI->createNode(ARKUI_NODE_ROW); + // set background color + ArkUI_NumberValue background_color_value[] = { { .u32 = COLOR_BLACK } }; + ArkUI_AttributeItem background_color_item = { background_color_value, + sizeof(background_color_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_BACKGROUND_COLOR, &background_color_item); + // set width + ArkUI_NumberValue width_value[] = { { .f32 = 200 } }; + ArkUI_AttributeItem width_item = { width_value, sizeof(width_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_WIDTH, &width_item); + // set height + ArkUI_NumberValue height_value[] = { { .f32 = 80 } }; + ArkUI_AttributeItem height_item = { height_value, sizeof(height_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_HEIGHT, &height_item); + // set margin + ArkUI_NumberValue margin_value[] = { { .f32 = 5 } }; + ArkUI_AttributeItem margin_item = { margin_value, sizeof(margin_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_MARGIN, &margin_item); + // set children + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_RED)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_GREEN)); + nodeAPI->addChild(nodeHandle, createChildNode(nodeAPI, COLOR_YELLOW)); + // set justifyContent + ArkUI_NumberValue justifyContent_value[] = { { .i32 = flexAlign } }; + ArkUI_AttributeItem justifyContent_item = { justifyContent_value, + sizeof(justifyContent_value) / sizeof(ArkUI_NumberValue) }; + nodeAPI->setAttribute(nodeHandle, NODE_ROW_JUSTIFY_CONTENT, &justifyContent_item); + return nodeHandle; +} + +napi_value RowJustifyContentTest::CreateNativeNode(napi_env env, napi_callback_info info) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RowJustifyContentTest", "CreateNativeNode"); + + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + size_t length = 64; + size_t strLength = 0; + char xComponentID[64] = { 0 }; + napi_get_value_string_utf8(env, args[0], xComponentID, length, &strLength); + + if ((env == nullptr) || (info == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RowJustifyContentTest", "GetContext env or info is null"); + return nullptr; + } + + ArkUI_NativeNodeAPI_1* nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + // set parent node + auto parentColumn = nodeAPI->createNode(ARKUI_NODE_COLUMN); + auto rowStart = createRowNode(nodeAPI, ARKUI_FLEX_ALIGNMENT_START); + auto rowCenter = createRowNode(nodeAPI, ARKUI_FLEX_ALIGNMENT_CENTER); + auto rowEnd = createRowNode(nodeAPI, ARKUI_FLEX_ALIGNMENT_END); + auto rowSpaceBetween = createRowNode(nodeAPI, ARKUI_FLEX_ALIGNMENT_SPACE_BETWEEN); + auto rowSpaceAround = createRowNode(nodeAPI, ARKUI_FLEX_ALIGNMENT_SPACE_AROUND); + auto rowSpaceEvenly = createRowNode(nodeAPI, ARKUI_FLEX_ALIGNMENT_SPACE_EVENLY); + auto rowSpaceError = createRowNode(nodeAPI, -1); + nodeAPI->addChild(parentColumn, rowStart); + nodeAPI->addChild(parentColumn, rowCenter); + nodeAPI->addChild(parentColumn, rowEnd); + nodeAPI->addChild(parentColumn, rowSpaceBetween); + nodeAPI->addChild(parentColumn, rowSpaceAround); + nodeAPI->addChild(parentColumn, rowSpaceEvenly); + nodeAPI->addChild(parentColumn, rowSpaceError); + std::string id(xComponentID); + if (OH_NativeXComponent_AttachNativeRootNode(PluginManager::GetInstance()->GetNativeXComponent(id), parentColumn) == + INVALID_PARAM) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RowJustifyContentTest", + "OH_NativeXComponent_AttachNativeRootNode failed"); + } + + napi_value exports; + if (napi_create_object(env, &exports) != napi_ok) { + napi_throw_type_error(env, NULL, "napi_create_object failed"); + return nullptr; + } + + return exports; +} +} // namespace ArkUICApiDemo \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/row/row_justify_content_test.h b/function/ui_compare/capidemo/entry/src/main/cpp/row/row_justify_content_test.h new file mode 100644 index 000000000..5b270d4a6 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/row/row_justify_content_test.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +#ifndef ARKUI_CAPI_DEMO_ROW_JUSTIFY_CONTENT_TEST_H +#define ARKUI_CAPI_DEMO_ROW_JUSTIFY_CONTENT_TEST_H + +#include +#include +#include + +#include "../common/common.h" + +namespace ArkUICApiDemo { + +class RowJustifyContentTest { +public: + ~RowJustifyContentTest(); + static napi_value CreateNativeNode(napi_env env, napi_callback_info info); +}; +} // namespace ArkUICApiDemo +#endif // ARKUI_CAPI_DEMO_ROW_JUSTIFY_CONTENT_TEST_H diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/types/libnativerender/index.d.ts b/function/ui_compare/capidemo/entry/src/main/cpp/types/libnativerender/index.d.ts new file mode 100755 index 000000000..c5fb16fbe --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/types/libnativerender/index.d.ts @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2024 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. + */ + +export const columnJustifyContentTest: (a: string) => void; + +export const columnAlignItemsTest: (a: string) => void; + +export const columnAlignItemsMoreAttributeTest: (a: string) => void; + +export const rowJustifyContentTest: (a: string) => void; + +export const rowAlignItemsTest: (a: string) => void; + +export const rowAlignItemsMoreAttributeTest: (a: string) => void; + +export const flexOptionsTest: (a: string) => void; + +export const radioCheckedTest: (a: string) => void; + +export const radioStyleTest: (a: string) => void; + +export const radioValueAndGroupTest: (a: string) => void; + +export const radioResetAttributeTest: (a: string) => void; + +export const gridTest: (a: string) => void; + +export const gridCachedCountTest: (a: string) => void; + +export const gridResetAttributeTest: (a: string) => void; + +export const refreshForContentAndRatioTest: (a: string, b: number) => void; + +export const refreshForRefreshingTest: (a: string) => void; + +export const refreshTest: (a: string, b: number, c: number) => void; + +export const refreshNestedScrollTest: (a: string) => void; + +export const refreshResetAttributeTest: (a: string) => void; \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/cpp/types/libnativerender/oh-package.json5 b/function/ui_compare/capidemo/entry/src/main/cpp/types/libnativerender/oh-package.json5 new file mode 100755 index 000000000..c696c592e --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/cpp/types/libnativerender/oh-package.json5 @@ -0,0 +1,6 @@ +{ + "name": "libnativerender.so", + "types": "./index.d.ts", + "version": "0.1.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/ets/entryability/EntryAbility.ets b/function/ui_compare/capidemo/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100755 index 000000000..1ee725035 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2024 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. + */ +import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} diff --git a/function/ui_compare/capidemo/entry/src/main/ets/entryability/EntryAbility.ts b/function/ui_compare/capidemo/entry/src/main/ets/entryability/EntryAbility.ts new file mode 100755 index 000000000..831ac54df --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/ets/entryability/EntryAbility.ts @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2024 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. + */ +import UIAbility from '@ohos.app.ability.UIAbility'; +import hilog from '@ohos.hilog'; +import window from '@ohos.window'; + +export default class EntryAbility extends UIAbility { + onCreate(want, launchParam) { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy() { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage) { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err, data) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? ''); + }); + } + + onWindowStageDestroy() { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground() { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground() { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +}; diff --git a/function/ui_compare/capidemo/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/function/ui_compare/capidemo/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100755 index 000000000..c7f4ee437 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024 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. + */ +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/ets/pages/Index.ets b/function/ui_compare/capidemo/entry/src/main/ets/pages/Index.ets new file mode 100755 index 000000000..4916aa2b5 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from "libnativerender.so" +@Entry +@Component +struct Index { + build() { + Column() { + Column() { + + XComponent({ + id: 'xComponentId', + type: XComponentType.NODE, + libraryname: 'nativerender' + }).onDestroy(() => { + console.log('onDestroy'); + }).onAppear(() => { + + }).width('100%') + .height('100%') + }.margin({ + top: 27, + left: 12, + right: 12 + }) + .height('100%') + .width('100%') + } + .width('100%') + .height('100%') + } +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/module.json5 b/function/ui_compare/capidemo/entry/src/main/module.json5 new file mode 100755 index 000000000..8ac5e62f8 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/module.json5 @@ -0,0 +1,45 @@ +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ts", + "description": "$string:EntryAbility_desc", + "icon": "$media:icon", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:icon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "requestPermissions": [ + { + "name": "ohos.permission.SYSTEM_FLOAT_WINDOW" + }, + { + "name": "ohos.permission.INTERNET" + } + ] + } +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/resources/base/element/color.json b/function/ui_compare/capidemo/entry/src/main/resources/base/element/color.json new file mode 100755 index 000000000..d66f9a7d4 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/resources/base/element/string.json b/function/ui_compare/capidemo/entry/src/main/resources/base/element/string.json new file mode 100755 index 000000000..6b976fb6d --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + } + ] +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/resources/base/media/background.png b/function/ui_compare/capidemo/entry/src/main/resources/base/media/background.png new file mode 100755 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/function/ui_compare/capidemo/entry/src/main/resources/base/media/background_blue.png b/function/ui_compare/capidemo/entry/src/main/resources/base/media/background_blue.png new file mode 100755 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/function/ui_compare/capidemo/entry/src/main/resources/base/media/background_green.png b/function/ui_compare/capidemo/entry/src/main/resources/base/media/background_green.png new file mode 100755 index 0000000000000000000000000000000000000000..385aee55284cd8a5ebde3910bf82c494f057fecf GIT binary patch literal 932 zcmeAS@N?(olHy`uVBq!ia0y~yU{nBM4kiW$hS?7-uLCK@;vjb?hIQv;UIIBR>5jgR z3=A9lx&I`x0{NT;9+AZi419+{nDKc2iWCM0W=l^O$B>G+x0ekW4=4y6IIx`QgFZ)m z$w8-WyH&Y1ox96yvM*dA!GJ@O$BC_Z!a;?UQRZkkj3xpjWBapCEP{nkN*4fg7K5j& KpUXO@geCx)8vc*~ literal 0 HcmV?d00001 diff --git a/function/ui_compare/capidemo/entry/src/main/resources/base/media/background_red.png b/function/ui_compare/capidemo/entry/src/main/resources/base/media/background_red.png new file mode 100755 index 0000000000000000000000000000000000000000..742044d80325e183663d8dffd8a2e5a37c6bed90 GIT binary patch literal 933 zcmeAS@N?(olHy`uVBq!ia0y~yU{nBM4kiW$hS?7-uLCK@;vjb?hIQv;UIIBR>5jgR z3=A9lx&I`x0{NT;9+AZi419+{nDKc2iWCM0W-Ct@$B>G+x0ekW4=4y6II!GG;^TTA z!PpHG-sW{St=WB^q4&KghXjukTl0j23MmF0lB3Mga2QPlXU_1KI5OwBoBDJBvlfG= LtDnm{r-UW|C2#;V literal 0 HcmV?d00001 diff --git a/function/ui_compare/capidemo/entry/src/main/resources/base/media/background_yellow.png b/function/ui_compare/capidemo/entry/src/main/resources/base/media/background_yellow.png new file mode 100755 index 0000000000000000000000000000000000000000..1fa2f73575caef6b5fcf736b6eb2e8ff34802713 GIT binary patch literal 1073 zcmeAS@N?(olHy`uVBq!ia0y~yU{nBM4mJh`29f4<4M2*qILO_JVcj{Imp~3nx}&cn z1H;CC?mvmFKt5-IM`SSr1K&XqX529``z-?l^D$2s$B>G+x7QYmHU|hW9Q5Z|*!3ko zC?)DZqCy*+!-lkDcVd};=UH7VQ6f6XU=+Y(PV0)basIi~}C* c6Ak|@Kg`G1YqZD*n9UhHUHx3vIVCg!06rk|JOBUy literal 0 HcmV?d00001 diff --git a/function/ui_compare/capidemo/entry/src/main/resources/base/media/foreground.png b/function/ui_compare/capidemo/entry/src/main/resources/base/media/foreground.png new file mode 100755 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 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 YcF$itxOuH`1*p99boFyt=akR{06QRBkN^Mx literal 0 HcmV?d00001 diff --git a/function/ui_compare/capidemo/entry/src/main/resources/base/media/layered_image.json b/function/ui_compare/capidemo/entry/src/main/resources/base/media/layered_image.json new file mode 100755 index 000000000..16cf3219a --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/resources/base/media/layered_image.json @@ -0,0 +1,7 @@ +{ + "layered-image": + { + "background" : "$media:background", + "foreground" : "$media:foreground" + } +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/resources/base/media/src.jpg b/function/ui_compare/capidemo/entry/src/main/resources/base/media/src.jpg new file mode 100755 index 0000000000000000000000000000000000000000..36a19cd6b90bb98511116f5015c74fe2f860249d GIT binary patch literal 9329 zcmb7qWmFtb^yT30g9LXA5Zv8eh8cnfhk-zFCuj%|bOv{s!6mqc;1(_2&!lvsa$2k-gm|0kY$03_G|Pk<*H3JCy}1O<%**bT$NJ;fVR4gK@sA==;*(NQ@|4{y4zUTWhB_imyP=Ke8M!d5xS?-m z^A`oB2-u5N)HdS$X$gRjhVmRI8VNuSa1c2q^df^*-G@MUMsvl(8Ap>8W0Z9dK-ad& z1)3#I0eO;C&Zo~9HOdRH9>slZ`Df0aewrdGLoZx&{HL;+i{==X<_7Bz2J#VEn9>iV z*nTQLxZxo~d*ce@(qrcrkGo17zo0r_Bv;u!i?^RF9R zuTbW4uTVR-?gMCH=WY37eJf0yaxdT};9DIe0b@fZ=MqXX=C)=R#2fLg;ei6C9oQ*6 z*5vm%Wl5^%xyjZm#$Qb)Z|)O1w}Ri3oQiv=+Bfkh0K>x;`)Ep6O$#hxiH>iB%cRd8 ziu_)mzKMTtKs6ebz<&1kYnnkk=bl7T)g>{d^z~TXbt3L}-8~xh(@133DU55)C-}{c z+7>?cjNumH=Fv43?+ydyJGwLMfWsuouWRBjRip~#OSQkJFs&Me%8^Ib<2SAy<^vW-e34_GT;XYr`}4-SYIaW0E7JRO3{?tUFm-BNJdD3 z8u&F_amTTNyhD1m#=;lsTb`^u8@~1&GYE_pvkY+qE@Sg_e;&oF_mz265$~jvOSyi7`4uPX zd;S5^Gk>nevKfnpN#w*rD*c5-ytwjM|5=J0d*N!aNclSKpfMw84Yv z+&Vguj6Oz@m0X|Q9C!!2_Ordl!Hly({eIm`Y zg`(i0ck6!qWy#vnc2=p2wIK_FWSe75pF8n5ff2;e9MBaOy0h9Go|*V4_lPdv=zs4* z8E~lfvlIUr1@0z!$Cbf6;z%7=N0vUYIeXtWD4!*W9jRwf(x3qSMi{VGm-l*daPk{p zhWSOAK)vk9Cb`y>D9zjSAvNfle;lO23eyFZt&(O#Hb{T$@PjdK57}OyuxaOD0&!AKG1W*+CbMkmZ zQXX`yr~Jr75cI}DvY?uV+nhuztVGT317&soa|Fi0NBBSZ4p*rA4~}%V`fz-H_hU=e zw?glFY+PlxrsG4Tz6PNm(BB(=ms6*){JEG|c8CG_t)OFM15vZLll=^~^d_5^+^Z(y z{8nm#F6l`_)|tvHc&V@xu`qrtbvs;X*T%h{)8uRDFM~N*<)1wt%j^4j0+x^x11rGh|rTo}C`HrjZaUVHjf&F9^Ztes+7~ZLg^ks+B zT6gOcpeB6!TQ`4wwFHNaUsV)OS@taAV8{`=IfMpY3P~!W+PruUos{Z-hfaJC`D0sg zH*h@q(+zLYVNN9p;_c55ZZ@YFHRSC?YeoA7`K(p`~*nUbA{C#Omspfe6BM? zLfC5}~NQ6*q9&`ga{ie=7v|6$YKl7@cGR zs*QreY4T-k0(oq_;y_e_;k?)MM-mMOXtl7S%;jrk)JrYi7QhJoCAP{ZPED)KIslyl zYm4`+zqO;q+m<4Ppp-SciMu$C#-z-w%@{=06#n8D-U+diU4&R-+ljFaAA9?8xm!P(^y}t zUTTZiuceYjXvOHFCw>ltI*%wtwaw^o=ZDkHATqAQ6xupI)UAds`Jh_&BV;VP@F@

(zs%@2G0f&qW>j6L^ra+ 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 Pf0@AI^sGYY)8hXE54%F} literal 0 HcmV?d00001 diff --git a/function/ui_compare/capidemo/entry/src/main/resources/base/media/startIcon.png b/function/ui_compare/capidemo/entry/src/main/resources/base/media/startIcon.png new file mode 100755 index 0000000000000000000000000000000000000000..205ad8b5a8a42e8762fbe4899b8e5e31ce822b8b GIT binary patch literal 20093 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

c)ijgxDm}8EsRXFt3h@+Ufr7@DN z^55r2UpdZvo*$)c`MJ_3zXBARbH%T}ifygzYy6g*WBtspGU<*Ccb`wpyW!Ui$gZ}y zo>MwK`K>f-62KfvO2{S zXF|ni6T=gB=C>=mF~5ojWS?I%DBt!ouB^&}v*S8G>5&(6>bM<0W9)PIeSXbv;v2lq zgZx&0)nJZqzUPEz=3RZouldy~VSciFe9|fxrs_KoD#u$hYz3BTu8Twxs@yt>*lp{< zm_XbpVEfL5#v}%x;+@AY<0*cV$ZF-248A&7CXCUG-9e@z7Va=V8J*&{q4I$n{~M-~K{qUmg-Y{N~tC__Y!6wZ`uS zAN=8SKnb`wARia}P{>}4q*mFJ2rt$xz9z}40>2@prKgMpJ4y?1MK zsu;8LLY(s8tNKp-L`??i35r}^567PuI=u8S&*EdFoy9Nf;48%{S#m8d=h|q*N!*Hw zE&QzCc2jn4u4(uar*pTPKCQ7DC)&Cs49?>3$7+X~)XJA`!=HT>p7`~r%@S~FvIWT% zL)t28t$h|BY!xpHnSQNXihG*>p${(0U;hi2mrwZcOUrZh0ee^UiT1oYO{3$5Hop*u zLXEN0l1qM=vD`rN)XOLJdon_5oHz3`AzpsrE1f=|*Mk1={U^)6{EcJ3kodUYZmX=p z&l4~2a)h&L*mG4|<3d+3_?Prr)`vgu$Y1U7EWIl2?@iUEd5K>;n9zxxlFNU^0vTLl zH@o9AcfQkuuVr{d?>6N1tv`70$?|*eKGqA1!uC8^rS(s+P1LOQ9lYFac+7nk_^^=}_9|LQHrRm;gm z#jgtmwd-2xd;fSm;rGSZd-@wbDeXS|)%sP&lv@b1qs`Sf43!0V?3qvsHeeF4^Q(*h z^}o7zxuRcU@`@_U0N4FIMxo}rPTLvJc{K#}XhYWmowJJ2$Yjbl`u)zkPnNIv?#GvR zeQ>x@oZ)FOm|m&l>_ivC(ek;URCk@4f5BINBIPcJedSknv#$7sL09O4r%@qb_M zz2et2d?)PSD|vhJv?jf^coe^7;*5D_(i{GoNjc@GFgNZjMJ5=HK91L-#6s_k5ZsDS zGS%RQ&sF+5eNE*3{W~3);ByDsjH9O)4$S@$?yR>?gy?){V`EPI$n>{$7kZJt&E|jq z@9tl&>KhB0wjiX?fvux_ph<@^P`xU#l~@YcVmvoP|52 zFCDST=db-|m-UT`(xE24+%n&4gZ%FnLi&Yo)!)!<`8*?XqEn@~PlG4oI{hPQc|SBA-3UqQo@Ok7n} zIAZ21l@78Rn`X^sw|ukiJP&AnypS?sjm)BYgRrvd_2vm*-zj>cKd@`Ab&91Yp=>6{)F%4)7auKu@lUJhnvWozKNZb^uG+`E@Y3=U zeK~|@uUf1nf;jWRpXQgYuqA_|MTZQJmcB;TNR^GlS{T8}iC6rO{IH|tWqO{uY5h}C zK^05FmfvX7IMk$1hE*ehH{+tKyHIa1DdB;;rJvHi z@XysN8q8vy7k-&z&tLr~zqICPT-#vO+|kk)bI{UP%}!$rHS^6TDD1uXt~a|@W*~+c z8vo^wJW;Rw34f4ZJkG`2_D~Yj%WRNd2O^Mwn=s<$0*s{9@EYCPT5v)bA~e(n|~6M0EUxGtnrcN&$s(s zzN8S(XWAcol9+ za@NCPqQw`HsBTqo#8>DWj&U^~+CTP~&69^IHqX$ty#E|%_>m7|XO7~asM|V+|Xy_l(fh&fm#RNST>VcoN?=6S_DPi%0~BG=sQt4-78)-@|b)lahBHa~PL<9jHj zNE~dl9PG02qUPM@QPu+cEDu-Af8%z}zB%Ihfge*{9Wd$&G+)E(=&9+o!^CjO`cwNdjVRH+WU`h_MXAOitJp5x3ifW{$igPf9iBj$(b=HI#x==`-hy-E&gI#->XR(BW&pMdcoR19-nNcPkY4s2bR7uK27u z;T-wi{Jv$d3tg^Khr|3zu!D-f$3GV1rd-BjB{h8+psmB&uHFO}3e<>-KnIym}P_oSC zslstp61Dm&1NiV|^pEbaNt}ZX!rh1GA<@OoA~K`yhAgd{@foOROsg!`F}gM(u1!jB zP-&PeM7Vk8W1#d^)-p1e`o(13g|c~w?dj`;4_bZu^_E|g3d=E{cLES;rdxmDH283uG=7WUKG<2~ea{IxU4q0( zBCeM((XD0e;O571>R|^u&Ev*jpsQGwzvm-2(K$^ICifY)?_e`E(umG-isbY(H;sFS z_TV{-u;uIR9OWMt?$V=eCxZbQ9k$3lC>2^A@xz~@XvD&(_uWN31AO=Zpf(=jB!lHh zOT3|j8)NsuFr00(J`~5*Aa@-yCcZDeY#2MK^7+byjE?yuYo4B|14zoWZPTeh8BIOF zi#LZ9-0pPpQq1&2arSg`YF@vQoGhb26RLwnlb*1L_^M-Vlx>giHItHpV-y+pt6ZEK z556G7lZ4?GS?qbNp_S;OAM&IlDs9+mIL@;^vinA)D6z3H9OHAVWxzHP_n^luSJ#<< zbsIty2lS^g(Tp%sL>_Jx%DMrbLPR&IRuN*2au@Mv3b3wQaDyVnmOp4Ma3Q*l1@}l- z7!@6xqcC>X;&3#^WC@2>d~Pt-WCFI;DSS*he8-yHfN>hl!&k7gZRoJWX*}IU_<3Dv zFh%O=_d;$wPTu#$88_QzeaYlJH`gOD^~u}%0AtVi0{v!P<5awgzdH2uJ`V|wUL*2lawezA2~fq&{P;mfB?8T6HUC*4h6A&Uoa8O-j$RT~z$aZBVg6 zzF?cyl6N zdHw?sJ7Tp$XXHMr#>SS7hWS(q4Vv|F6FxR`qoAKa__u1W&%AQI4T^VKan^IyU>zfs zE|$R$NQPNwnbWKcmi{dLjG5%b9r@2i8f!K??SvY4H+*lPY@EblJRiC1P#E;CqroIW z@amJ2xy(A56v{9|GuaTpMMj+DK>H#%Xah4-!k=}#^ zneQH-ALI49-brtya+(0Rs?MoH;W4xa=7q~HKFb7Z1nBuy5&@vrkTKXDY=saRII;oP z3R%&P2^nF-NYearIVR*J3O2Ys934KH3%!qF8Ezacu`vg0S*Oab^yt!p+xLq-xy5gM z#Kw5jI=`XA!CkZ&zAqE&VEj1=NFmPhl*4MSO=PEas`~e2-T71-1sApc|fu*Q}= zsYFnC_DZcy+zSDb@&j)&>t^-n;oK7;%>Y=GI zf;q6^#lf=W>#ky4S#ll)lVVQT_DO*_|C(c%5cIB9nT$1w zdZdwu#x~{=-+@S!Al?*`YqRX_$W)w|mL<42l`iKk-%cwYqIN?eH8`i)kL=}d1?JZx ztLCs2KGwvGug#(X==ud4yo;s5T!B+uNNV9YMyc!;d~C+efEeaJa{IVw7aDzJFOkR6 zSlJt<<>?A3vyx@)YW!;#RD~3cJ<+yt$FWi*K*_8K6|i@y5t3Ja zJ+H|ads>I+vjj95MRGK=^x>=qv2joEMXBp_IFN4`AdHaye#ZCSN+T3ki zEEWhGJ-%>&Q^eAnKgqhuJba{|Jl+AxddOr{Cxi+(@50!IbHi4?hjyY5LQ=XVPTEpb zyqVjwx1@vOf~d3GC@cCi=V6PSGqd|Ua>`SZ|JP5mkUUL?=|EPi{@-nlH?JLkAw z*sMbLgtgvL+o_1?*wJfZjcXpC5>GR~M4yu?y`l7N54Pg1hB01ME2+8Z!14qfU-Yz@ zpP&@C_lf&Q^@(4j;1EbkPV$`KhCay2t@XoalE&DO(HG;)bGsV$(1$|8a365@r{WKw zNW$FkEp^Sm<|7b9uV3Ad{N#D~L@0goVuYqx6L^T_<{Zg#=0otZT7J0Sg93< zJ_mX2IquB#Bm6s#^rsweb>du#$y5q2icb}=oNpi;{UA7T{^iK)*yGw5d6=pq_?*D>mRC&iQRDaItw;A9 zUwyN}YMcO55)^&3H9%p>YklyFuHBgRqrZ5o{^}Fg-RyE2Q&BkPr4P7!;2dsBBY5kZ z6MOo=-HSke#!JD&S`O^!e_!8v^T8YV)+p1?{L!gB{K1puy1vT%sWe=-JBLXqC(&~o zh8QdS8g_rYT88wPo<6+$(H>5CKO8#&q^#c>*j4hprAvR9e{%Kyt8YGf`?u>?8Tz14 zS1k!Et{sV(!ehcu#U^0M9yMmukRS`=W<1D5*Xuj%0?f#3B#i1AuV%Dk0a#p(np`Z z@Ny<>{{ZDV5+@v)mOs>&&;9Vv>-)pHaOkS3YygE%;ePHnZ!h`bKx(H9HZuLnZ`piM z2ii=ClLN3rsu>=c{+jNjKd(=0rLpid^!u4*y(mWJPG6kjm0Yv8i=0jt@0q$c?3SO6 zo`T_+i0(Myt98b;JQvD(PJ8@c_^spR4R6xbATVp;gA^fWJoolt6Viy=aHkR(bL6>a z0*u#QIOR-CHs#1eI_@gp{LgMJH~1i?ZcMM{ufkCb2He+@V%l*Br$@ccN`(OGk)9u)8Cl^IS$70>cnNtJOD;^adIv1mfzOH@{j*A zpUGT+)Iu&-&YD8$81J|E-`Afpo?Sod(=~-f1KG?W4N<>A4H|trX(W)6k{Oa&+m(#9NV~FpO<-jgq5FpLo=R80h%`t-tc094&kfl2?<-(g>J|r?=r^r}OA> zmp&f(`pX~wSI3@L@|*kMoPV!t)up3lQ3afNHGkNJ?ukAA%&S+P!*d|=aQo0Nz5YfK zKR4s_UId|>uzYyqbjJt5=GTt(Ez-yS$U9G{Cqm(9+ajN> zgT~ide(a0*RMefm>R_qQXttNTKUJiWa#G(o>gibbxL(-&eO>l^>-4Yw{;}#f=Ndog zTpjgwLr5GKkp=Bm^VjU9%39U~*@|iCk3RCfSN<|`f4G7d?}tSDTy`AIwQL?;#$97+ ztSvnwvYK=4p}Io0?fv>@g@5oyeJpBc$rtZF^xS26hCWZ4#Yok->p2VeHu^YSPUGG2k^A|XtmgmW>+a9E=9)4OCk5TSW^(Rd;pI_JfySLre zQLOv*sbCN46V?6wuS}=FN|eBT_p(bFq*`MXpIA`Vg(EMp(umI{;a4t?=!xmyYV?&H2P7PMKv=d+vjRBWh(As6Lj0Qcn$#3?!%y6`&&<3aj!!;n$@xk0 z*`QFf2~yb7*ZgYBR84)J;s=KZ&x_vE!tWtII60`G5(@|IFyHPr=5zVG<@(X_<1hTc z_kGCwAo)o&!Uw+XL*A!{f;S*LxN;y5=0e-ZrK)pdNED2liw(!iVbw-%n7!XMpG8kA zGUJMmr0RBj5-MyJddQOpL{O*s7%s{`6u+WXrgQwlI?smCIg$&Q{AYgqCt0wKb7$_% zm%{TugWsEv_{Fa|uJO;}cZ_9uLpG0)>jq*Vhu`WPlbLjiH(IU~Fm-o{X+n|rIebs+ zBK*FBMohVN%r4@=_@qH>4)KXqe5CL#cK)Tu;+Dei@z-rsKEYOe;uO{W-~*^lGv{e} zg4af91r84J?WZul<4pXy&Q9bMAD7uEiayKu@j6WtFdw~+#;%<5b$dDfR;X#?4us;} z-~EhV6zs>~=Rof`?o~=VM~9%M_?8J+n!&AcCV)?AP=;fE71{~UeEA>#S{QucDki=r zzHybu$j{hvT>Nr&n2+r=zY;+&dlw*cHh$KbFJ$UN=-6jIG7AR2vDH_c$iN1FmhpRt z?{%2s!?BZglURd~-k|DP8~&9Flv)o?mLI$Jz3h>-Z8i{UeJRS<(K9vL#!-~$F*1Sp z9>4-|wb7EC2gB>kF9$2`EI#_O(HBeOdGZy+=Ze2BPH_+Mi?qgP47=j(>kB=mJ%oMS z9r<0iE@an9F`Z)KGra&4x%#2EIrCiSSMf=2pI?~4w>$UPbpC{gT;8zlrl=Bb2 zc!MuoiVfHWSDf^|NDlF(^ZW;&*`LSHX6X1EeyW$cIeN{P*pA<}=H;OUB#~>P2l%!Y z!u69#KlsSz*U2UJ{M*;+{q-Mwz4pdlJGFtZ-+TGiS1Ql<#B&y|xO2F8BP#-G95X!= zS3AtF&0v5*jT?Lk8~!j1%0_T}otooBko6is#Sgz&6@Aj7$ONp`$^7Ks*zOGN$=Vl+ z!3WfQyRB%BY(65Ff(S*v1=yWtyJ{I0gB$4W-~OP!g>&~BlI$ss{JeWJ0Y~lvE4La}LgwmJ{B^=-^LrxrR*K+!NY34Y z%M z<9FfUS32e(gAJbEtbl5ub8iasSIo+HYW6cI2(;PPCVrX9hj6>)HIID%gYPzH@6^%v zv^{*@-@5)2n!;y#NN$bBu|)+fn^0}89(_q=8AGE|lG!A3qm}-*G$sPd@g2 zSN`*ry_F8$fdaX8yu3>5_^=Mm3a>SxDq|(W496V3gthog+!l-+gI^0x3>K~U0B9_I z@g1v9#%%cbQY(J<)|7{e%NhR$c6@0R)3;{wt|Y5hT-qAn?23((Ie*Is_;P_4Gx3j1 z3^!RMCcZ=O#~*wM_}}BBm6H6+W|(D1K9`SA_)O&v{7zZehxLm7tBQH}eC`H%|3AL+ zwv$WC=ZSiwBbOHn*aasRMW->jDp-wcQfvqt$sDPv&GGOq`KuGkd^o;c>O`@?JJE_` zdU788%6;TNa;;()znFK!uf=i(n|UXb!}$}T5F5S&N6!Fu`(`Au^2Zij=Z|V?HNBZ# z{Jg_J&>P3Qlh3>HhAVHIXs5)?*?J{TB9TPPY-Gp32p`^F3!lv=`TY2MT!#Dn_EX5YDwXjm4@%zo zyA%j0dpPZ8aUi>rp!dHqyG~d+l6Q>+x9T-*oC&4dQmFv;TYcH~Spj>DJ0esIt zzWNO+#A`{>E5i(Xk;Z0`sjgNLsQM^ePYfMu`tZTDpWqGSgiZetwnduxeT7P8ynTsi zel~9SC}kpn5&t6m<~Z?*-@e9Xw_7%@1cxGiwOUv!*ZAgV{^YpI;WyoHSsAi`#H6j9 zt$aSe;%xY&tQ7Q@%CCLw|GfH*c7B0V=63;TLHuy07aBFXpK@e@kz6>#YSGcv3{ghz zzVXF3=^Q@()T&z5KP7&Q>i!XZTNu&$kfkNQnO!8-_aDL+?R~C8sjF4t! z6x@c9tB)3F@nK85F<=By?G&Gi4}X@LiXJ2XmM&tvDMDVeZJcH{s6W+y1bgFn`9~ZXTFjEjziZ(}(o3vn z`%X>ZGshK%2W48h%Jnqix>9=bSGbGC-{Va~Hp{r_k-l2)R5e=9GXJFTue#GuTPtHLO_kpoE;{;<|N8ou=yCIP zN<{A~WY5T@7mLhsKlK)EER*b9LF?v{dT-&+=Hpvd_~PVB{13->Hs|DD_AU++MKR^? zVbs#s_)ceV^X6!`7vaB08NBAP@4xarcZzYI{jMLv_MN@||G4r!x9+?3(b^}k&qm0m zIJo%3!Mf<)XVROminu6NX7e>E)#+h2O$}L)eu$)~=3}XaGUgyZ_V8KMnK#)7zjPHp z_Ts=j%wK(OAJ%4maf|Pa51wLAKZDR6(r+-k<@J}An;-pDHxE9y+0Rj)g#6$aUwirP zX!kYxQ0mVy-QN2yL-92;)+QS*i|kvrv|fAPK+-?Jmin%y1ZS6N0LGw(w2!|y(vgZ*y#F}>^b>-1db)Nj=f;xC|Ft8@YI zMIq1nn~#0+?)d1{!hey9e+8a5izk@{Oplez2GHqrSUlSN&@^wrvVyP!giSlmuO%9r zW`jOGD83?gYTjdlCEZT%G_f_YKb`yp!)N?Qcc8y6-5c~LFW-9YpKRX@b^v?Vs?#fW z*DlT`JnOH$|Jl3C_q|fP=kqnu&(d`7^YSrkS5(VraZMu&zIv_2t3qXyto_-1d=_pk z^vbJk!~$p|XLVszAW2V_Pv+Y=r{jaEb~--#@C&o@YkYyT{(x!uak=@SdyXFer}KN5 zFTlMk$hvZOMZ0@2f4q3@#*LTjFKs?eK|fUioJEMtmjUO-<02&yOE|p|V-%X=6Xv@X(oCxjr1jf2;npdQ$tQM<2QW z=azp~pZ|S`@O0`r&8O4l#eLPLy7n@?{`u15<>(>(HP?sj)ax^gp0C0^Q@=iWK*f2c zD)fL#sXs~F-K&MVM;neWi6M8@tERwteOT%%cv{JMqtu2a&-F?ld~arKwAH@y=LKKw z#h-2EA?L&VSjQ(K-_mq$Dl8u&b4}hKRXUGo8jtD{dqj15STlZy(C<7sI)2CQ_~fnE k9@EG3{4s5ok?kb>|H;3ubeVRY^#A|>07*qoM6N<$f~C=$asU7T literal 0 HcmV?d00001 diff --git a/function/ui_compare/capidemo/entry/src/main/resources/base/profile/backup_config.json b/function/ui_compare/capidemo/entry/src/main/resources/base/profile/backup_config.json new file mode 100755 index 000000000..d742c2f96 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/resources/base/profile/main_pages.json b/function/ui_compare/capidemo/entry/src/main/resources/base/profile/main_pages.json new file mode 100755 index 000000000..14bbd62cb --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/Index" + ] +} diff --git a/function/ui_compare/capidemo/entry/src/main/resources/en_US/element/string.json b/function/ui_compare/capidemo/entry/src/main/resources/en_US/element/string.json new file mode 100755 index 000000000..6b976fb6d --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/resources/en_US/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + } + ] +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/main/resources/zh_CN/element/string.json b/function/ui_compare/capidemo/entry/src/main/resources/zh_CN/element/string.json new file mode 100755 index 000000000..cab069eb2 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "模块描述" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + } + ] +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/Application/AbilityStage.ts b/function/ui_compare/capidemo/entry/src/ohosTest/ets/Application/AbilityStage.ts new file mode 100755 index 000000000..252a037b7 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/Application/AbilityStage.ts @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2024 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. + */ + +import AbilityStage from '@ohos.app.ability.AbilityStage'; + +export default class MyAbilityStage extends AbilityStage { + onCreate() { + console.log('[Demo] MyAbilityStage onCreate'); + globalThis.stageOnCreateRun = 1; + globalThis.stageContext = this.context; + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/MainAbility.ts b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/MainAbility.ts new file mode 100755 index 000000000..95e23de1a --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/MainAbility.ts @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2024 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. + */ + +import Ability from '@ohos.app.ability.UIAbility'; +import Settings from '../test/common/Settings'; + +const TAG: string = '[createWindow]' + +export default class MainAbility extends Ability { + onCreate(want, launchParam) { + // Ability is creating, initialize resources for this ability + console.log(`${TAG} MainAbility onCreate`); + globalThis.abilityWant = want; + globalThis.abilityLaunchParam = launchParam; + } + + onDestroy() { + // Ability is destroying, release resources for this ability + console.log(`${TAG} MainAbility onDestroy`); + } + + onWindowStageCreate(windowStage) { + // Main window is created, set main page for this ability + console.log(`${TAG} MainAbility onWindowStageCreate windowStage=` + windowStage); + globalThis.windowStage = windowStage; + globalThis.context = this.context; + + setTimeout(() => { + console.info(`${TAG} setTimeout`) + Settings.createWindow('MainAbility/pages/DemoIndex', { + width: 720, height: 1280, dpi: 230 + }) + }, 1000) + } + + onWindowStageDestroy() { + //Main window is destroyed, release UI related resources + console.log(`${TAG} MainAbility onWindowStageDestroy`); + } + + onForeground() { + // Ability has brought to foreground + console.log(`${TAG} MainAbility onForeground`); + } + + onBackground() { + // Ability has back to background + console.log(`${TAG} MainAbility onBackground`); + } +}; \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/componet/CommonView.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/componet/CommonView.ets new file mode 100755 index 000000000..cd3064660 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/componet/CommonView.ets @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2024 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. + */ + +@Component +export struct CommonView { + pageTag: string = ''; + + build() { + Column() { + Column({ space: 10 }) { + XComponent({ + id: this.pageTag, + type: 'node', + libraryname: 'nativerender' + }).onDestroy(() => { + console.log('onDestroy'); + }).backgroundColor('#FFEEEEEE') + .width('100%') + .height('100%') + }.margin(20) + .height('100%') + .width('100%') + } + .id(this.pageTag) + .width('100%') + .height('100%') + } +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/DemoIndex.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/DemoIndex.ets new file mode 100755 index 000000000..a6b910285 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/DemoIndex.ets @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024 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. + */ + +import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; +import { Hypium } from '@ohos/hypium'; +import testsuite from '../../test/List.test'; + +@Entry +@Component +struct DemoIndex { + aboutToAppear() { + setTimeout(() => { + let abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator() + let abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments() + console.info('start run testcase!!!') + Hypium.hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite) + }, 2000) + } + + build() { + Flex({ + direction: FlexDirection.Column, + alignItems: ItemAlign.Center, + justifyContent: FlexAlign.Center + }) { + Text('ARKUI CAPI DEMO') + .fontSize(36) + .fontWeight(FontWeight.Bold) + } + .width('100%') + .height('100%') + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/column/ColumnAlignItemsMoreAttributeTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/column/ColumnAlignItemsMoreAttributeTest.ets new file mode 100644 index 000000000..3bdb88447 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/column/ColumnAlignItemsMoreAttributeTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct ColumnAlignItemsMoreAttributeTest { + PAGE_TAG: string = 'ColumnAlignItemsMoreAttributeTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.columnAlignItemsMoreAttributeTest(this.PAGE_TAG); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/column/ColumnAlignItemsTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/column/ColumnAlignItemsTest.ets new file mode 100644 index 000000000..c56c6b6eb --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/column/ColumnAlignItemsTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct ColumnAlignItemsTest { + PAGE_TAG: string = 'ColumnAlignItemsTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.columnAlignItemsTest(this.PAGE_TAG); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/column/ColumnJustifyContentTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/column/ColumnJustifyContentTest.ets new file mode 100644 index 000000000..5316260d3 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/column/ColumnJustifyContentTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct ColumnJustifyContentTest { + PAGE_TAG: string = 'ColumnJustifyContentTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.columnJustifyContentTest(this.PAGE_TAG); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/flex/FlexOptionsTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/flex/FlexOptionsTest.ets new file mode 100644 index 000000000..0b24bcf7e --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/flex/FlexOptionsTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct FlexOptionsTest { + PAGE_TAG: string = 'FlexOptionsTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.flexOptionsTest(this.PAGE_TAG); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/grid/GridCachedCountTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/grid/GridCachedCountTest.ets new file mode 100644 index 000000000..7267c855d --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/grid/GridCachedCountTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct GridCachedCountTest { + PAGE_TAG: string = 'GridCachedCountTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.gridCachedCountTest(this.PAGE_TAG); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/grid/GridResetAttributeTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/grid/GridResetAttributeTest.ets new file mode 100644 index 000000000..9ccdfc8a6 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/grid/GridResetAttributeTest.ets @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct GridResetAttributeTest { + PAGE_TAG: string = 'GridResetAttributeTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.gridResetAttributeTest(this.PAGE_TAG); + }) + } + } +} + diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/grid/GridTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/grid/GridTest.ets new file mode 100644 index 000000000..92810e85f --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/grid/GridTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct GridTest { + PAGE_TAG: string = 'GridTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.gridTest(this.PAGE_TAG); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/radio/RadioCheckedTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/radio/RadioCheckedTest.ets new file mode 100644 index 000000000..1942424dc --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/radio/RadioCheckedTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct RadioCheckedTest { + PAGE_TAG: string = 'RadioCheckedTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.radioCheckedTest(this.PAGE_TAG); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/radio/RadioResetAttributeTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/radio/RadioResetAttributeTest.ets new file mode 100644 index 000000000..4753336ba --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/radio/RadioResetAttributeTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct RadioRestAttributeTest { + PAGE_TAG: string = 'RadioResetAttributeTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.radioResetAttributeTest(this.PAGE_TAG); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/radio/RadioStyleTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/radio/RadioStyleTest.ets new file mode 100644 index 000000000..82ab817ce --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/radio/RadioStyleTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct RadioStyleTest { + PAGE_TAG: string = 'RadioStyleTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.radioStyleTest(this.PAGE_TAG); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/radio/RadioValueAndGroupTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/radio/RadioValueAndGroupTest.ets new file mode 100644 index 000000000..efc0f46fc --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/radio/RadioValueAndGroupTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct RadioValueAndGroupTest { + PAGE_TAG: string = 'RadioValueAndGroupTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.radioValueAndGroupTest(this.PAGE_TAG); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshForContentAndRatioAbnormalTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshForContentAndRatioAbnormalTest.ets new file mode 100644 index 000000000..f10cdb466 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshForContentAndRatioAbnormalTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct RefreshForContentAndRatioAbnormalTest { + PAGE_TAG: string = 'RefreshForContentAndRatioAbnormalTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.refreshForContentAndRatioTest(this.PAGE_TAG,-1); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshForContentAndRatioTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshForContentAndRatioTest.ets new file mode 100644 index 000000000..e31c7842b --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshForContentAndRatioTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct RefreshForContentAndRatioTest { + PAGE_TAG: string = 'RefreshForContentAndRatioTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.refreshForContentAndRatioTest(this.PAGE_TAG,0.3); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshForRefreshingTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshForRefreshingTest.ets new file mode 100644 index 000000000..5b651fe5e --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshForRefreshingTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct RefreshForRefreshingTest { + PAGE_TAG: string = 'RefreshForRefreshingTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.refreshForRefreshingTest(this.PAGE_TAG); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshNestedScrollTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshNestedScrollTest.ets new file mode 100644 index 000000000..c10058886 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshNestedScrollTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct RefreshNestedScrollTest { + PAGE_TAG: string = 'RefreshNestedScrollTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.refreshNestedScrollTest(this.PAGE_TAG); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshPullToRefreshAbnormalTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshPullToRefreshAbnormalTest.ets new file mode 100644 index 000000000..882e2af89 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshPullToRefreshAbnormalTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct RefreshTest { + PAGE_TAG: string = 'RefreshTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.refreshTest(this.PAGE_TAG,-100,-1); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshPullToRefreshFalseTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshPullToRefreshFalseTest.ets new file mode 100644 index 000000000..a4bdc0ad8 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshPullToRefreshFalseTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct RefreshTest { + PAGE_TAG: string = 'RefreshTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.refreshTest(this.PAGE_TAG,20,0); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshPullToRefreshTrueAbnormalTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshPullToRefreshTrueAbnormalTest.ets new file mode 100644 index 000000000..89d2745d0 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshPullToRefreshTrueAbnormalTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct RefreshTest { + PAGE_TAG: string = 'RefreshTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.refreshTest(this.PAGE_TAG,800,1); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshPullToRefreshTrueTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshPullToRefreshTrueTest.ets new file mode 100644 index 000000000..793bedac9 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshPullToRefreshTrueTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct RefreshTest { + PAGE_TAG: string = 'RefreshTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.refreshTest(this.PAGE_TAG,20,1); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshResetAttributeTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshResetAttributeTest.ets new file mode 100644 index 000000000..e5d32ab49 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/refresh/RefreshResetAttributeTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct RefreshResetAttributeTest { + PAGE_TAG: string = 'RefreshResetAttributeTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.refreshResetAttributeTest(this.PAGE_TAG); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/row/RowAlignItemsMoreAttributeTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/row/RowAlignItemsMoreAttributeTest.ets new file mode 100644 index 000000000..42ff62488 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/row/RowAlignItemsMoreAttributeTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct RowAlignItemsMoreAttributeTest { + PAGE_TAG: string = 'RowAlignItemsMoreAttributeTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.rowAlignItemsMoreAttributeTest(this.PAGE_TAG); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/row/RowAlignItemsTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/row/RowAlignItemsTest.ets new file mode 100644 index 000000000..aff4b851f --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/row/RowAlignItemsTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct RowAlignItemsTest { + PAGE_TAG: string = 'RowAlignItemsTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.rowAlignItemsTest(this.PAGE_TAG); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/row/RowJustifyContentTest.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/row/RowJustifyContentTest.ets new file mode 100644 index 000000000..0e68ae8e0 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/MainAbility/pages/row/RowJustifyContentTest.ets @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 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. + */ + +import render from 'libnativerender.so' +import { CommonView } from '../../componet/CommonView'; + +@Entry +@Component +struct RowJustifyContentTest { + PAGE_TAG: string = 'RowJustifyContentTest'; + + build() { + Column() { + CommonView({ + pageTag: this.PAGE_TAG, + }).onAppear(() => { + render.rowJustifyContentTest(this.PAGE_TAG); + }) + } + } +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/List.test.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/List.test.ets new file mode 100755 index 000000000..b0e43da86 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 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. + */ + +import columnJustifyContentTest from './column/ColumnJustifyContentTest.test' +import columnAlignItemsTest from './column/ColumnAlignItemsTest.test' +import rowJustifyContentTest from './row/RowJustifyContentTest.test' +import rowAlignItemsTest from './row/RowAlignItemsTest.test' +import flexOptionsTest from './flex/FlexOptinsTest.test' +import radioTest from './radio/RadioTest.test' +import gridTest from './grid/GridTest.test' +import refreshTest from './refresh/RefreshTest.test' + +export default function testsuite() { + columnJustifyContentTest() + columnAlignItemsTest() + rowJustifyContentTest() + rowAlignItemsTest() + flexOptionsTest() + radioTest() + gridTest() + refreshTest() +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/column/ColumnAlignItemsTest.test.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/column/ColumnAlignItemsTest.test.ets new file mode 100644 index 000000000..f1d590559 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/column/ColumnAlignItemsTest.test.ets @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2024 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. + */ + +import { afterEach, beforeAll, describe, it } from '@ohos/hypium'; +import Utils from '../common/Utils'; +import WindowSnap from '../common/Snap'; + +export default function columnAlignItemsTest() { + + describe('ColumnAlignItemsTest', () => { + + let PAGE_TAG = 'ColumnAlignItemsTest'; + let PAGE_TAG2 = 'ColumnAlignItemsMoreAttributeTest'; + + afterEach(async (done: Function) => { + WindowSnap.snapShot(globalThis.context, 'test', done) + }) + + it('testColumnAlignItems001', 0, async (done: Function) => { + await Utils.pushPage(`column/${PAGE_TAG}`, done); + }); + + it('testColumnAlignItems002', 0, async (done: Function) => { + await Utils.pushPage(`column/${PAGE_TAG2}`, done); + }); + }) +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/column/ColumnJustifyContentTest.test.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/column/ColumnJustifyContentTest.test.ets new file mode 100644 index 000000000..f60119c15 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/column/ColumnJustifyContentTest.test.ets @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 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. + */ + +import { afterEach, beforeAll, describe, it } from '@ohos/hypium'; +import Utils from '../common/Utils'; +import WindowSnap from '../common/Snap'; + +export default function columnJustifyContentTest() { + + describe('ColumnJustifyContentTest', () => { + + let PAGE_TAG = 'ColumnJustifyContentTest'; + + afterEach(async (done: Function) => { + WindowSnap.snapShot(globalThis.context, 'test', done) + }) + + it('testColumnJustifyContent001', 0, async (done: Function) => { + await Utils.pushPage(`column/${PAGE_TAG}`, done); + }); + }) +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/common/Interfaces.d.ts b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/common/Interfaces.d.ts new file mode 100755 index 000000000..1ad4cf063 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/common/Interfaces.d.ts @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2024 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. + */ + +export class ComponentInfo { + $type: string; + $rect: Object[]; +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/common/Settings.ts b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/common/Settings.ts new file mode 100755 index 000000000..9e47b1a64 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/common/Settings.ts @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2024 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. + */ +// import screen from '@ohos.screen'; +import window from '@ohos.window'; + +const TAG: string = '[SettingsCApiDemo]' + +class Settings { + sleep(time) { + return new Promise((resolve) => { + setTimeout(resolve, time) + }); + } + + windowClass: window.Window = null + + //为悬浮窗设置位置 + changeWindowPosition(windowClass, X, Y) { + windowClass.moveWindowTo(X, Y, (err) => { + if (err.code) { + console.error(`${TAG}, Fail to move the window. Cause: ${JSON.stringify(err)}`); + return; + } + }) + } + + //为悬浮窗设置大小 + changeWindowSize(windowClass, width, height) { + windowClass.resize(width, height, (err) => { + if (err.code) { + console.error(`${TAG}, Fail to change the window size. Cause: ${JSON.stringify(err)}`); + return; + } + }) + } + + loadContent(windowClass, pageURI) { + //为悬浮窗加载对应的目标页面 + windowClass.setUIContent(pageURI, (err) => { + if (err.code) { + console.error(`${TAG}, Fail to load the content. Cause: ${JSON.stringify(err)}`); + return; + } + console.info(`${TAG}, Succeeded in loading the content.`); + + //显示悬浮窗 + windowClass.showWindow((err) => { + if (err.code) { + console.error(`${TAG}, Fail to show the window. Cause: ${JSON.stringify(err)}`); + return; + } + console.info(`${TAG}, Succeeded in showing the window.`); + }) + + }) + } + + // changeDpi(dpi) { + // let screenClass = null; + // screen.getAllScreens((err, data) => { + // if (err.code) { + // console.error(`${TAG}, Fail to get all screens. Cause: ${JSON.stringify(err)}`); + // return; + // } + // console.info(`${TAG}, Succeeded in geting all screens.`); + // + // screenClass = data[0]; + // //设置设备dpi + // screenClass.setDensityDpi(dpi, (err, data) => { + // if (err.code) { + // console.error(`${TAG}, Fail to set the piexl density. Cause: ${JSON.stringify(err)}`); + // return; + // } + // console.info(`${TAG}, Succeeded in seting the piexl density.`) + // }) + // }) + // } + + destroyWindow() { + //销毁窗口 + let windowClass = null; + try { + windowClass = window.findWindow('floatWindow'); + console.info(`${TAG}, find window success.`) + } catch (exception) { + console.error(`${TAG}, Fail to find the window. Cause: ${JSON.stringify(exception)}`); + } + windowClass.destroyWindow((err) => { + if (err.code) { + console.error(`${TAG}, Fail to destroy the window. Cause: ${JSON.stringify(err)}`); + return; + } + console.info(`${TAG}, Succeeded in destroying the window.`) + }) + } + + createWindow(pageURI: String, {X=0,Y=0,width=1344,height=2560,dpi=400}={}) { + console.info(`${TAG}, params, pageURI=${pageURI}}, X=${X}, Y=${Y}, width=${width}, height=${height}, dpi=${dpi}`) + + // this.changeDpi(dpi); + this.sleep(1000); + let windowClass = null; + let config = { + name: 'floatWindow', windowType: window.WindowType.TYPE_FLOAT, ctx: globalThis.context + } + window.createWindow(config, (err, data) => { + if (err.code) { + console.error(`${TAG}, Fail to create the floatWindow. Cause: ${JSON.stringify(err)}`); + return; + } + console.info(`${TAG}, Succeeded in creating the floatWindow.`) + windowClass = data; + this.windowClass = data; + + this.changeWindowPosition(windowClass, X, Y) + this.changeWindowSize(windowClass, width, height) + this.loadContent(windowClass, pageURI) + }) + } +} + +export default new Settings() \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/common/Snap.ts b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/common/Snap.ts new file mode 100755 index 000000000..827a1cb47 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/common/Snap.ts @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2024 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. + */ +import window from '@ohos.window'; +import image from '@ohos.multimedia.image'; +import fs from '@ohos.file.fs'; +import { Driver, Rect } from '@ohos.UiTest'; + +const TAG: string = '[WindowSnap]' +const INFO = { + 'img': { + prefix: 'IMG_', + suffix: '.webp' + }, + 'txt': { + prefix: 'TXT_', + suffix: '.txt' + } +} + +class WindowSnap { + async sleep(time) { + return new Promise((resolve) => { + setTimeout(resolve, time) + }); + } + + createFile(context: any, type, page) { + console.info(`${TAG}, createFile start`) + let pathDir = context.filesDir; + console.info(`${TAG}, createFile pathDir = ${pathDir}`) + let name = page + let info = INFO[type] + let displayName = `${info.prefix}${name}${info.suffix}` + let filePath = pathDir + '/' + displayName + console.info(`${TAG}, createFile filePath = ${filePath}`) + let exists = fs.accessSync(filePath) + console.info(`${TAG}, oldFile exists = ${exists}`) + if (exists) { + fs.unlinkSync(filePath) + console.info(`${TAG}, remove file succeed`) + } + return fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE) + } + + async save(data: image.PixelMap, context: any, page) { + console.info(`${TAG}, start save image`) + let packOpts: image.PackingOption = { + format: 'image/webp', quality: 100 + } + let imagePackerApi = image.createImagePacker() + let arrayBuffer = await imagePackerApi.packing(data, packOpts) + let file = null + while (file == null) { + file = this.createFile(context, 'img', page) + } + let exists = fs.accessSync(file.path) + console.info(`${TAG}, createFile exists = ${exists}`) + let fd = file.fd + console.info(`${TAG}, createFile fd = ${fd}`) + imagePackerApi.release() + try { + fs.writeSync(fd, arrayBuffer) + } catch (err) { + console.error(`${TAG}, write failed, code is ${err.code}, message is ${err.message}}`) + } + fs.closeSync(file) + console.info(`${TAG}, write picture done`) + } + + /** + * 获取窗口截图&文件保存 + * 入参必须为ability的context + * + * save:设备保存路径:/data/app/el2/100/base/{bundle_name}/haps/entry_test/files/IMG_test.webp + */ + async snapShot(context, page, done?) { + console.info(`${TAG}, start snapshot`) + await this.sleep(2000); + let windowClass = null + try { + windowClass = window.findWindow('floatWindow') + console.info(`${TAG}, find window success`) + } catch (exception) { + console.error(`${TAG}, Failed to find the window. Cause: ${JSON.stringify(exception)}`) + } + + windowClass.snapshot(async (err, data) => { + console.info(`${TAG}, windowClass.snapshot`) + if (err.code) { + console.error(`${TAG}, Failed to snapshot window. Cause: ${JSON.stringify(err)}`) + return + } + await this.save(data, context, page) + data.release() + if (done) { + done(); + } + }) + } + + async snapShotNext(context, page, done?) { + console.info(`${TAG}, start snapshot`) + let windowClass = null + try { + windowClass = window.findWindow('floatWindow'); + } catch (exception) { + console.error(`${TAG}, Failed to find the window. Cause: ${JSON.stringify(exception)}`) + } + await this.sleep(600); + windowClass.snapshot(async (err, data) => { + console.info(`${TAG}, windowClass.snapshot`) + + if (err.code) { + console.error(`${TAG}, Failed to snapshot window. Cause: ${JSON.stringify(err)}`) + return + } + await this.save(data, context, page) + data.release() + if (done) { + done(); + } + }) + } + + async snapShotByDriver(context, page, done?) { + console.info(`Start snapshot by driver`) + await this.sleep(2000); + let file = null + while (file == null) { + file = this.createFile(context, 'img', page) + } + let exists = fs.accessSync(file.path) + console.info(`${TAG}, createFile exists = ${exists}`) + + try { + let windowClass = window.findWindow('floatWindow') + console.info(`${TAG}, find window success`) + let windowRect = windowClass.getWindowProperties().windowRect; + console.info(`${TAG}, windowRct is ${JSON.stringify(windowRect)}`) + let driver = Driver.create(); + await driver.screenCapture(file.path, { + left: windowRect.left, + top: windowRect.top, + right: windowRect.width, + bottom: windowRect.height + }); + } catch (exception) { + console.error(`${TAG}, Failed to snap shot. Cause: ${JSON.stringify(exception)}`) + } + + if (done) { + done(); + } + } +} + +export default new WindowSnap() \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/common/Utils.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/common/Utils.ets new file mode 100755 index 000000000..da612f94c --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/common/Utils.ets @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2024 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. + */ +import events_emitter from '@ohos.events.emitter'; +import { Driver, ON, PointerMatrix, Rect } from '@ohos.UiTest'; +import { ComponentInfo } from './Interfaces'; +import systemDateTime from '@ohos.systemDateTime'; +import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry' +import fs from '@ohos.file.fs'; +import router from '@ohos.router'; + +export default class Utils { + static sleep(time: number) { + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve("ok") + }, time) + }).then(() => { + console.info(`sleep ${time} over...`) + }) + } + + static getSystemTime() { + return systemDateTime.getTime(true) / 1000 + } + + static getSandboxFileDir() { + let sandboxFileDir = AbilityDelegatorRegistry.getAbilityDelegator().getAppContext().filesDir + "/" + console.log(`[getSandboxFileDir] return ${sandboxFileDir}`); + return sandboxFileDir; + } + + static deleteFile(filePath: string) { + console.info("[deleteFile] filePath:" + filePath); + try { + fs.unlinkSync(filePath) + } catch (error) { + console.info("[deleteFile] error:" + error); + } + } + + static isFileExist(filePath: string): boolean { + console.info("[isFileExist] filePath:" + filePath); + try { + let fileExist = fs.accessSync(filePath) + console.info("[isFileExist] return:" + fileExist); + return fileExist + } catch (error) { + console.info("[isFileExist] error:" + error); + return false + } + } + + static getComponentInfoByKey(key: string): ComponentInfo { + let strJson = getInspectorByKey(key); + let obj: ComponentInfo = JSON.parse(strJson); + console.info('[getInspectorByKey] current component info: ' + JSON.stringify(obj)); + return obj; + } + + + static async flingComponent(key: string, isHorizontal: boolean, isForward: boolean) { + let driver = Driver.create(); + let rect = Utils.getComponentRect(key); + let centerX = Utils.getRectHorizontalCenterX(rect) + let centerY = Utils.getRectVerticalCenterY(rect) + let X1 = centerX - 100; + let X2 = centerX + 100; + let Y1 = centerY - 100; + let Y2 = centerY + 100; + let stepLen = 20; + let speed = 10000; + if (isHorizontal) { + if (isForward) { + await driver.fling({ + x: X2, y: centerY + }, { + x: X1, y: centerY + }, stepLen, speed); + } else { + await driver.fling({ + x: X1, y: centerY + }, { + x: X2, y: centerY + }, stepLen, speed); + } + } else { + if (isForward) { + await driver.fling({ + x: centerX, y: Y2 + }, { + x: centerX, y: Y1 + }, stepLen, speed); + } else { + await driver.fling({ + x: centerX, y: Y1 + }, { + x: centerX, y: Y2 + }, stepLen, speed); + } + } + } + + static async clickComponent(id: string) { + let driver = Driver.create(); + let component = await driver.findComponent(ON.id(id)); + await component.click(); + } + + static async doubleClickComponent(id: string) { + let driver = Driver.create(); + let component = await driver.findComponent(ON.id(id)); + await component.click(); + await component.click(); + } + + static async clickLocation(X: number, Y: number) { + let driver = Driver.create(); + await driver.click(X, Y); + } + + static async triggerKey(id: number) { + let driver = Driver.create(); + await driver.triggerKey(id); + } + + static async longClickComponent(id: string) { + let driver = Driver.create(); + let component = await driver.findComponent(ON.id(id)); + await component.longClick(); + } + + static async clickComponentByText(text: string) { + let driver = Driver.create(); + let component = await driver.findComponent(ON.text(text)); + await component.click(); + } + + static async fingerZoom(key: string, isOut: boolean) { + let rect = Utils.getComponentRect(key); + let centerX = Utils.getRectHorizontalCenterX(rect) + let centerY = Utils.getRectVerticalCenterY(rect) + let fingerUpCenterY = centerY - 100; + let fingerDownCenterY = centerY + 100; + let driver: Driver = Driver.create(); + let pointers: PointerMatrix = PointerMatrix.create(2, 3); + pointers.setPoint(0, 0, { + x: centerX, y: fingerUpCenterY - (isOut ? 40 : 120) + }); + pointers.setPoint(0, 1, { + x: centerX, y: fingerUpCenterY - 80 + }); + pointers.setPoint(0, 2, { + x: centerX, y: fingerUpCenterY - (isOut ? 120 : 40) + }); + pointers.setPoint(1, 0, { + x: centerX, y: fingerDownCenterY + (isOut ? 40 : 120) + }); + pointers.setPoint(1, 1, { + x: centerX, y: fingerDownCenterY + 80 + }); + pointers.setPoint(1, 2, { + x: centerX, y: fingerDownCenterY + (isOut ? 120 : 40) + }); + await driver.injectMultiPointerAction(pointers); + } + + static registerEvent(pageTag: string, eventId: number, callBack: Function) { + events_emitter.on({ + eventId: eventId, + priority: events_emitter.EventPriority.LOW + }, (eventData: events_emitter.EventData) => { + console.info("Value Change CallBack"); + if (eventData != null && eventData.data != null) { + if (pageTag == eventData.data.PAGE_TAG) { + console.info("CallBack value:" + JSON.stringify(eventData)); + callBack(eventData.data.VALUE); + } + } + }) + } + + static emitEvent(pageTag: string, emitValue: number | string | object, eventId: number) { + try { + let backData: events_emitter.EventData = { + data: { + "PAGE_TAG": pageTag, + "VALUE": emitValue + } + } + let backEvent: events_emitter.InnerEvent = { + eventId: eventId, + priority: events_emitter.EventPriority.LOW + } + console.info("start to emit page state"); + events_emitter.emit(backEvent, backData); + } catch (err) { + console.info("emit page state err: " + JSON.stringify(err)); + } + } + + static async pushPage(pageTag: string, done?: Function) { + let options: router.RouterOptions = { + url: `MainAbility/pages/${pageTag}`, + } + try { + router.clear(); + let pages = router.getState(); + console.info(`get ${pageTag} state success ` + JSON.stringify(pages)); + if (pageTag.indexOf(pages.name) < 0) { + console.info(`get ${pageTag} state success ` + JSON.stringify(pages.name)); + let result = await router.pushUrl(options); + await Utils.sleep(2000); + console.info(`push ${pageTag} page success ` + JSON.stringify(result)); + } + } catch (err) { + console.error(`push ${pageTag} page error: ` + err); + } + if (done) { + done(); + } + } + + static getComponentRect(key: string): Rect { + let strJson = getInspectorByKey(key); + let obj: ComponentInfo = JSON.parse(strJson); + console.info('[getInspectorByKey] key is: ' + key); + return Utils.getComponentRectByObj(obj); + } + + static getComponentRectByObj(obj: ComponentInfo): Rect { + console.info('[getInspectorByKey] current component is: ' + obj.$type); + let rectInfo: Object[] = JSON.parse('[' + obj.$rect + ']'); + let rect_value: Rect = { + left: JSON.parse('[' + rectInfo[0] + ']')[0], + top: JSON.parse('[' + rectInfo[0] + ']')[1], + right: JSON.parse('[' + rectInfo[1] + ']')[0], + bottom: JSON.parse('[' + rectInfo[1] + ']')[1] + }; + console.info(JSON.stringify(rect_value)); + return rect_value; + } + + static getRectHorizontalCenterX(rect: Rect): number { + return Number.parseInt(Number((rect.right - rect.left) / 2 + rect.left).toFixed(0)); + } + + static getRectVerticalCenterY(rect: Rect): number { + return Number.parseInt(Number((rect.bottom - rect.top) / 2 + rect.top).toFixed(0)); + } + + static async mouseMoveTo(X: number, Y: number) { + let driver = Driver.create(); + await driver.mouseMoveTo({ + x: X, y: Y + }); + } + + static async mouseMoveToCurrentComponent(componentId: string) { + let driver = Driver.create(); + let component = await driver.findComponent(ON.id(componentId)); + let point = await component.getBounds(); + await driver.mouseMoveTo({ + x: point.left + 10, y: point.bottom - 10 + }); + } +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/flex/FlexOptinsTest.test.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/flex/FlexOptinsTest.test.ets new file mode 100644 index 000000000..9ef9e992b --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/flex/FlexOptinsTest.test.ets @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 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. + */ + +import { afterEach, beforeAll, describe, it } from '@ohos/hypium'; +import Utils from '../common/Utils'; +import WindowSnap from '../common/Snap'; + +export default function flexOptionsTest() { + + describe('FlexOptionsTest', () => { + + let PAGE_TAG = 'FlexOptionsTest'; + + afterEach(async (done: Function) => { + WindowSnap.snapShot(globalThis.context, 'test', done) + }) + + it('testFlexOptions001', 0, async (done: Function) => { + await Utils.pushPage(`flex/${PAGE_TAG}`, done); + }); + }) +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/grid/GridTest.test.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/grid/GridTest.test.ets new file mode 100644 index 000000000..0025c0f01 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/grid/GridTest.test.ets @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2024 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. + */ + +import { afterEach, beforeAll, describe, it } from '@ohos/hypium'; +import Utils from '../common/Utils'; +import WindowSnap from '../common/Snap'; +import { Driver, ON } from '@ohos.UiTest'; + +export default function gridTest() { + + describe('GridTest', () => { + + afterEach(async (done: Function) => { + WindowSnap.snapShot(globalThis.context, 'test', done) + }) + + //Grid组件测试 + // NODE_GRID_COLUMN_TEMPLATE + // NODE_GRID_ROW_TEMPLATE + // NODE_GRID_COLUMN_GAP + // NODE_GRID_ROW_GAP + // NODE_GRID_NODE_ADAPTER + it('testGrid001', 0, async (done: Function) => { + let PAGE_TAG = 'GridTest'; + await Utils.pushPage(`grid/${PAGE_TAG}`); + let driver = Driver.create(); + await Utils.sleep(1000); + let component = await driver.findComponent(ON.id("grid1")); + let point = await component.getBounds(); + await driver.swipe(point.left + 20, point.bottom - 10, point.left + 20, point.top - 200, 4000); + await Utils.sleep(2000); + component = await driver.findComponent(ON.id("grid2")); + point = await component.getBounds(); + await driver.swipe(point.right - 20, point.bottom - 20, point.left + 100, point.bottom - 20, 40000); + await Utils.sleep(3000) + done(); + }); + + // NODE_GRID_CACHED_COUNT + it('testGrid002', 0, async (done: Function) => { + let PAGE_TAG = 'GridCachedCountTest'; + await Utils.pushPage(`grid/${PAGE_TAG}`); + await Utils.clickComponent('gridClick'); + let driver = Driver.create(); + await Utils.sleep(1000); + let component = await driver.findComponent(ON.id("gridCachedCount1")); + let point = await component.getBounds(); + await driver.drag(point.right - 20, point.bottom - 20, point.left + 100 , point.bottom - 20, 40000); + await Utils.sleep(1000); + component = await driver.findComponent(ON.id("gridCachedCount2")); + point = await component.getBounds(); + await driver.drag(point.left + 20, point.bottom - 10, point.left + 20 , point.bottom - 200, 4000); + await Utils.sleep(1000); + component = await driver.findComponent(ON.id("gridCachedCount3")); + point = await component.getBounds(); + await driver.drag(point.right, point.bottom - 20, point.left - 20 , point.bottom - 20, 40000); + await Utils.sleep(3000) + done(); + }); + + // Reset Grid的属性: NODE_GRID_COLUMN_TEMPLATE, NODE_GRID_ROW_TEMPLATE,NODE_GRID_COLUMN_GAP, NODE_GRID_ROW_GAP + it('testGrid003', 0, async (done: Function) => { + let PAGE_TAG = 'GridResetAttributeTest'; + await Utils.pushPage(`grid/${PAGE_TAG}`); + await Utils.clickComponent('GridReset'); + await Utils.sleep(2000) + done(); + }); + }) +} + diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/radio/RadioTest.test.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/radio/RadioTest.test.ets new file mode 100644 index 000000000..40ef2a871 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/radio/RadioTest.test.ets @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2024 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. + */ + +import { afterEach, describe, it } from '@ohos/hypium'; +import Utils from '../common/Utils'; +import WindowSnap from '../common/Snap'; + +export default function radioTest() { + + describe('RadioTest', () => { + + afterEach(async (done: Function) => { + WindowSnap.snapShot(globalThis.context, 'test', done) + }) + + //Radio组件Check属性分别设置为true、false时的显示效果测试。 默认值:false + it('testRadio001', 0, async (done: Function) => { + let PAGE_TAG = 'RadioCheckedTest'; + await Utils.pushPage(`radio/${PAGE_TAG}`, done); + }); + //Radio组件Style属性设置显示效果测试。 + it('testRadio002', 0, async (done: Function) => { + let PAGE_TAG = 'RadioStyleTest'; + await Utils.pushPage(`radio/${PAGE_TAG}`, done); + }); + //Radio组设置Value和Group + it('testRadio003', 0, async (done: Function) => { + let PAGE_TAG = 'RadioValueAndGroupTest'; + await Utils.pushPage(`radio/${PAGE_TAG}`, done); + }); + //Radio组件OnChange回调函数测试 + it('testRadio004', 0, async (done: Function) => { + let PAGE_TAG = 'RadioValueAndGroupTest'; + await Utils.pushPage(`radio/${PAGE_TAG}`); + await Utils.clickComponent('radioOnChange') + await Utils.sleep(2000); + done(); + }); + //Radio组件测试Reset以下属性:checked, radioStyle,value,group + it('testRadio005', 0, async (done: Function) => { + let PAGE_TAG = 'RadioResetAttributeTest'; + await Utils.pushPage(`radio/${PAGE_TAG}`); + await Utils.clickComponent('ResetRadio') + await Utils.sleep(3000); + done(); + }); + }) +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/refresh/RefreshTest.test.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/refresh/RefreshTest.test.ets new file mode 100644 index 000000000..2100a2e24 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/refresh/RefreshTest.test.ets @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2024 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. + */ + +import { describe, it, afterEach } from '@ohos/hypium'; +import Utils from '../common/Utils'; +import WindowSnap from '../common/Snap'; +import { Driver, ON } from '@kit.TestKit'; + +async function doIt(id: string, done: Function, speed: number = 400, x = 100, y = 300) { + let driver = Driver.create(); + let refresh = await driver.findComponent(ON.id(id)); + let point = await refresh.getBounds(); + driver.swipe(point.left + x, point.bottom - x, point.left + x, point.bottom + y , speed); + WindowSnap.snapShot(globalThis.context, 'test',done); + await Utils.sleep(2000); +} +async function doItNext(id: string, done: Function, speed: number = 400, x = 100, y = 300) { + let driver = Driver.create(); + let refresh = await driver.findComponent(ON.id(id)); + let point = await refresh.getBounds(); + driver.swipe(point.left + x, point.bottom - x, point.left + x, point.bottom + y , speed); + WindowSnap.snapShotNext(globalThis.context, 'test',done); + await Utils.sleep(2000); +} + +export default function refreshTest() { + + describe('RefreshTest', () => { + afterEach(async (done: Function) => { + // WindowSnap.snapShot(globalThis.context, 'test', done) + await Utils.sleep(5000) + done() + }) + + // Refresh设置NODE_REFRESH_REFRESHING + // NODE_REFRESH_OFFSET:20 + // NODE_REFRESH_PULL_TO_REFRESH:1 + // 能够刷新,对应radio组件从选中状态变到非选中状态 + it('testRefresh001', 0, async (done: Function) => { + let PAGE_TAG = 'RefreshPullToRefreshTrueTest'; + await Utils.pushPage(`refresh/${PAGE_TAG}`,() => setTimeout(() => { + }, 10000)); + await doIt('refresh', done, 10000); + done() + }) + // Refresh设置NODE_REFRESH_REFRESHING + // NODE_REFRESH_OFFSET:20 + // NODE_REFRESH_PULL_TO_REFRESH:0 + // 不能刷新,对应radio组件仍然是选中状态 + it('testRefresh002', 0, async (done: Function) => { + let PAGE_TAG = 'RefreshPullToRefreshFalseTest'; + await Utils.pushPage(`refresh/${PAGE_TAG}`,() => setTimeout(() => { + }, 10000)); + doIt('refresh', done, 40000); + done() + }) + // Refresh设置NODE_REFRESH_REFRESHING + // NODE_REFRESH_OFFSET:-100 + // NODE_REFRESH_PULL_TO_REFRESH:-1 + // 能够刷新,对应radio组件从选中状态变到非选中状态 + it('testRefresh003', 0, async (done: Function) => { + let PAGE_TAG = 'RefreshPullToRefreshAbnormalTest'; + await Utils.pushPage(`refresh/${PAGE_TAG}`,() => setTimeout(() => { + }, 10000)); + await doIt('refresh', done, 40000); + done() + }) + + // Refresh设置NODE_REFRESH_REFRESHING + // NODE_REFRESH_OFFSET:800 + // NODE_REFRESH_PULL_TO_REFRESH:1 + // 不能刷新,对应radio组件仍然是选中状态 + it('testRefresh004', 0, async (done: Function) => { + let PAGE_TAG = 'RefreshPullToRefreshTrueAbnormalTest'; + await Utils.pushPage(`refresh/${PAGE_TAG}`,() => setTimeout(() => { + }, 10000)); + await doIt('refresh', done, 10000); + await Utils.sleep(5000) + done() + }) + + // Refresh组件设置 NODE_REFRESH_CONTENT:自定义component + // NODE_REFRESH_PULL_DOWN_RATIO:0.3 + it('testRefresh005', 0, async (done: Function) => { + let PAGE_TAG = 'RefreshForContentAndRatioTest'; + await Utils.pushPage(`refresh/${PAGE_TAG}`,() => setTimeout(() => { + }, 10000)); + doItNext('refreshcontent', done, 3000); + await Utils.sleep(5000) + done() + }) + // Refresh组件设置 NODE_REFRESH_CONTENT:自定义component + // NODE_REFRESH_PULL_DOWN_RATIO:-1 + it('testRefresh006', 0, async (done: Function) => { + let PAGE_TAG = 'RefreshForContentAndRatioAbnormalTest'; + await Utils.pushPage(`refresh/${PAGE_TAG}`,() => setTimeout(() => { + }, 12000)); + doItNext('refreshcontent', done, 2000); + await Utils.sleep(5000) + done() + }) + // Refresh测试refresing属性,在onRefresh回调中设置NODE_REFRESH_REFRESHING为0, 结束刷新状态 + // Refresh组件测试onOffsetChange回调函数,在回调中设置背景颜色变成黄色 + it('testRefresh007', 0, async (done: Function) => { + let PAGE_TAG = 'RefreshForRefreshingTest'; + await Utils.pushPage(`refresh/${PAGE_TAG}`,() => setTimeout(() => { + }, 10000)); + await doIt('refresh', done, 40000); + await Utils.sleep(5000) + done() + }) + // Refresh组件中方式嵌套滚动组件,正常刷新 + it('testRefresh008', 0, async (done: Function) => { + let PAGE_TAG = 'RefreshNestedScrollTest'; + await Utils.pushPage(`refresh/${PAGE_TAG}`, () => setTimeout(() => { + }, 12000)); + let driver = Driver.create(); + let refresh = await driver.findComponent(ON.id('refreshNested')); + let point = await refresh.getBounds(); + await driver.swipe(point.left + 20, point.bottom - 300, point.left + 20, point.bottom + 300, 10000); + WindowSnap.snapShot(globalThis.context, 'test', done); + await Utils.sleep(5000) + done() + }) + // Refresh组件中Reset属性:refreshOffset默认值为1,pullToRefresh默认值为0,pullDownRatio默认值为0 + it('testRefresh009', 0, async (done: Function) => { + let PAGE_TAG = 'RefreshResetAttributeTest'; + await Utils.pushPage(`refresh/${PAGE_TAG}`,() => setTimeout(() => { + }, 10000)); + await Utils.clickComponent("ResetRefresh"); + WindowSnap.snapShot(globalThis.context, 'test', done) + await Utils.sleep(5000) + done() + }) + }) +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/row/RowAlignItemsTest.test.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/row/RowAlignItemsTest.test.ets new file mode 100644 index 000000000..9a4bda8fe --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/row/RowAlignItemsTest.test.ets @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2024 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. + */ + +import { afterEach, beforeAll, describe, it } from '@ohos/hypium'; +import Utils from '../common/Utils'; +import WindowSnap from '../common/Snap'; + +export default function rowAlignItemsTest() { + + describe('RowAlignItemsTest', () => { + + let PAGE_TAG = 'RowAlignItemsTest'; + let PAGE_TAG2 = 'RowAlignItemsMoreAttributeTest'; + + afterEach(async (done: Function) => { + WindowSnap.snapShot(globalThis.context, 'test', done) + }) + + it('testRowAlignItems001', 0, async (done: Function) => { + await Utils.pushPage(`row/${PAGE_TAG}`, done); + }); + + it('testRowAlignItems002', 0, async (done: Function) => { + await Utils.pushPage(`row/${PAGE_TAG2}`, done); + }); + }) +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/row/RowJustifyContentTest.test.ets b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/row/RowJustifyContentTest.test.ets new file mode 100644 index 000000000..7f18b66c6 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/test/row/RowJustifyContentTest.test.ets @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 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. + */ + +import { afterEach, beforeAll, describe, it } from '@ohos/hypium'; +import Utils from '../common/Utils'; +import WindowSnap from '../common/Snap'; + +export default function rowJustifyContentTest() { + + describe('RowJustifyContentTest', () => { + + let PAGE_TAG = 'RowJustifyContentTest'; + + afterEach(async (done: Function) => { + WindowSnap.snapShot(globalThis.context, 'test', done) + }) + + it('testRowJustifyContent001', 0, async (done: Function) => { + await Utils.pushPage(`row/${PAGE_TAG}`, done); + }); + }) +} diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ts b/function/ui_compare/capidemo/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ts new file mode 100755 index 000000000..02823b530 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ts @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2024 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. + */ +import TestRunner from '@ohos.application.testRunner'; +import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; + +let abilityDelegator = undefined; +let abilityDelegatorArguments = undefined; + +function translateParamsToString(parameters) { + const keySet = new Set([ + '-s class', '-s notClass', '-s suite', '-s it', + '-s level', '-s testType', '-s size', '-s timeout', + '-s dryRun' + ]); + let targetParams = ''; + for (const key in parameters) { + if (keySet.has(key)) { + targetParams = `${targetParams} ${key} ${parameters[key]}`; + } + } + return targetParams.trim(); +} + +async function onAbilityCreateCallback() { + console.log('onAbilityCreateCallback'); +} + +async function addAbilityMonitorCallback(err: any) { + console.info('addAbilityMonitorCallback : ' + JSON.stringify(err)); +} + +export default class OpenHarmonyTestRunner implements TestRunner { + constructor() { + } + + onPrepare() { + console.info('OpenHarmonyTestRunner OnPrepare '); + } + + async onRun() { + console.log('OpenHarmonyTestRunner onRun run'); + abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments(); + abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator(); + let testAbilityName = abilityDelegatorArguments.bundleName + '.MainAbility'; + let lMonitor = { + abilityName: testAbilityName, + onAbilityCreate: onAbilityCreateCallback, + }; + abilityDelegator.addAbilityMonitor(lMonitor, addAbilityMonitorCallback); + let cmd = 'aa start -d 0 -a MainAbility' + + ' -b ' + abilityDelegatorArguments.bundleName; + cmd += ' ' + translateParamsToString(abilityDelegatorArguments.parameters); + let debug = abilityDelegatorArguments.parameters['-D']; + if (debug == 'true') { + cmd += ' -D'; + } + console.info('cmd : ' + cmd); + abilityDelegator.executeShellCommand(cmd, + (err: any, d: any) => { + console.info('executeShellCommand : err : ' + JSON.stringify(err)); + console.info('executeShellCommand : data : ' + d.stdResult); + console.info('executeShellCommand : data : ' + d.exitCode); + }); + console.info('OpenHarmonyTestRunner onRun end'); + } +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/module.json5 b/function/ui_compare/capidemo/entry/src/ohosTest/module.json5 new file mode 100755 index 000000000..d5c61594f --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/module.json5 @@ -0,0 +1,47 @@ +{ + "module": { + "name": "entry_test", + "type": "feature", + "srcEntry": "./ets/Application/AbilityStage.ts", + "description": "$string:module_desc", + "mainElement": "MainAbility", + "deviceTypes": [ + "tablet", + "default" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "MainAbility", + "srcEntry": "./ets/MainAbility/MainAbility.ts", + "description": "$string:EntryAbility_desc", + "icon": "$media:icon", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:icon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "orientation": "portrait", + "skills": [ + { + "actions": [ + "action.system.home" + ], + "entities": [ + "entity.system.home" + ] + } + ] + } + ], + "requestPermissions": [ + { + "name": "ohos.permission.SYSTEM_FLOAT_WINDOW" + }, + { + "name": "ohos.permission.INTERNET" + } + ] + } +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/resources/base/element/color.json b/function/ui_compare/capidemo/entry/src/ohosTest/resources/base/element/color.json new file mode 100755 index 000000000..d66f9a7d4 --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/resources/base/element/float.json b/function/ui_compare/capidemo/entry/src/ohosTest/resources/base/element/float.json new file mode 100755 index 000000000..789ad804a --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/resources/base/element/float.json @@ -0,0 +1,24 @@ +{ + "float": [ + { + "name": "300vp", + "value": "300vp" + }, + { + "name": "200vp", + "value": "200vp" + }, + { + "name": "100vp", + "value": "100vp" + }, + { + "name": "50vp", + "value": "50vp" + } + ,{ + "name": "10vp", + "value": "10vp" + } + ] +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/resources/base/element/string.json b/function/ui_compare/capidemo/entry/src/ohosTest/resources/base/element/string.json new file mode 100755 index 000000000..6b976fb6d --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + } + ] +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/resources/base/media/background.png b/function/ui_compare/capidemo/entry/src/ohosTest/resources/base/media/background.png new file mode 100755 index 0000000000000000000000000000000000000000..bbe9979eda9db82793df2873701e4beae14c44cc GIT binary patch literal 312971 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

n&DYjfVtWM^(We*cv(TSfo?T8jR40?> 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%0DP>+r zVS|H93R^VKCEK0MI6Z-@S1k+{OK`&>wy7hy?MW+aT5by63}T|@@snoNUV%qy(6gR6 zl~NLS1J3GjWb##&O0yi~_w}N2Zv;F-tGJA}a%$w(h;B*6B5RpUkeLsbq;f~EwNZ-l zMY4FIa#WnMx3|4RB*9pK#djPZn-s+I(Vdqp7;W3s1M6BtMPpii>a%9Bx{d7=CI}0S zr>gr?BD}@CskD-PdSsF=b$4>Y z#0Hg6vqZhX$3OjQkwmw5GQlL$E#jsbmnvgn)G!`~u6RRRv(t4ZyDB#XWedD1!N>Sk zUZ<=|y0z`yw1F-znYW#p8%fU|_0XE-)s0D}taNi|)*oWFNnPGpgGgT|0aR`(dGCtO zy1ttCPLgE`i@(c3oP}OF{*^@QFbz3ji*k*pbcB*z`_(~smgY#@hEgyT@CR^fH!J9F zmbboz?IJrHE5ABWOJ^!M!N;{puX&dWw+7it%nR_?E0dfb&a#E%(<C%%+mb#r@V8UOztBz|x>5@(v<5Tkml#p_8dHgAl zZf+7ONoeFka8FhPrB^z=m{*bSH>hn^2kpie@n$?C` zNj#CB*`aE*Gm3JShHmJmMgIU-3j@@S4QQp55!$WA+HVSQ%)g+l@9gGXQB=5SzV=T% z4%L3`Ugl_{Spr+4mO0KDy?;tkNoZS*-L62^$vPotWyF94$0v4i`cpNFYo9q``I;zj zxg(==Kdop_c+4P_TSpU(s-z49f!2#jn&RQDS-_H8tQ9}q40=_ztz=YbH1!e%jctj$ z+9fDgkkcmW5g|{+&oiSOwwF4n8XXnBRB-sJ+qXEBLI$1 z%+36$wVGzJi?c}6iq6TVSpX`l{2-hG?M}OqBUq!fMiKBbat;R-mwBi^+7WXi9+^|a zFVePbtfQYnlIiZ0T(fOhU+-<_1XZVP*%FP`h=R#cBNsPer7U?Q_0RtRTBDBbN=~5_ zSYaD-@Km0^T88%RqJ~Hq?*M?L4ixsqR%y(3tFr{N0n?m;k|{Yh(;Q>&*xH8SO_&%3 zh$==n03I_*X=wxB2auI*#FpvY=BjDx*6W!!GnOm^9EJQUVR%*5r0mSxjP z+RVZ@q)RzZmdX_X0PbV&SoT)$WU)wD7IF^NC#wKWS$QOKr9!hY8$cZi@Ay=gaWC7E z*_D_AaNLkFkLy;oB|B(Sn%-oQbqO~B$;ifV-RmaXPM>mId2DwQ$Z>$c9@W-Is4Aec zl%S22DBJS_DNi+8swnfMwNz}K0 zO2NubSLjp|Z^+lTonA;9c|aK}wMGCZfmbc2iDHuR5x&qeyGi*-BOl7LN_khMXJSk* zkbS|=^r_loJ+8z?W@aE`smCYutAv`>lTx3(r&6u`!TW4(tYSc+PsoVNTxvEh+6A_cVa`}_fla-Y)-E%# zM<=I0f9C)s9X(8kRd~yqL>AGQ1A#a%t+~-EfeOK?JDhA4+N1l?&Z6q^Rf_#uPVJJ!ytU zIE!;^U^-Qs$lgf8qp~r^6}jO0Re57&ZK1;-Zr;=}sI;ug=^kHd@>KOEn(!n|%C_Us zW4%edgl{kJE(tV-R&Si{%M8+Qu`OyK91>80{pvuW!791OUMV-pCN_b$9r}uuSZrXw zC||t5<0gcz$+Bf|LXt>1#(5Oz-!Y$*`g2M*vZ|IWMLFML2zdoT#wx5E4@6wPAk-Me^h&VR1S;ss;C+6X_7lR0G+Gp>rh6?<^>sJoN{Tk z)NWQ~;c@E6*6b@*6hIrJGwMQ7wB++3eOCw=G zT($-dJJJb0TnsB??@}sAC00R^j4-FQxkYE&&qfD<^%Nvhk|qi!jZuyz;07HD^rTlP zN=TSyIP}eDJf#qMWw#U8H9U7;Xi!*|b>p5*XJlRciI3OSQ<%X z4BH3O@|A>2*@;O3_n4ms=SeJS6$E=lMc zo;4~Mu6kmg+ox3ke2a|dlTB#MpgNPm>Dbc__(30Zj&Yu}lW2z6;18It7bA8$b*XU3 z%;ihIFhJ-tQST^#D-cw1Pnn!Vs!ITHdG)5HVQPkNbX8Ib&m4aZHPDU*LFjNfsK9N( za@~0%tp;~uM>*hn(4Cn{-*6K=U;xD9w`zPjci$#3ypTH61S+x+AL;?)@v9IZX&kQv zE)V$CIb2Tba=hD^wo0GwfO-mtDx?wjbJC;;>+_DiNj<5-k;WrYyU_QhL)?c2WCRa> zYFBNF4;xQJ+IMZp6~4UZ)#}AcNMcf>;7_2cfAp;|xK_?^Y&G}0pakUuNJ`_-7sv>{_$6%>UJmI)mwX`Uy(uV-U#U2_c2@;J zIO3yMbT}Bn>M8IImqCxs>ImYWDkHkcm{1QV9Vs+B*lCQn%rZe8yHv=lJS7Rts=q1q z9+cz+F;y7%^{VYRmcf*Kz~>|RRJIA~NC|sVmA*CML`17MO>x>Ta$X$V(zclL|jPN7!BH-cgN1+$VV8aG-Z%Thn(^U7&L^@G8RM5K_di%(xwN@z+eoE(Y6sH)=iXI57%7@UkBz3EYDH=tSWh+xuKUL!n;`@UiqoxfVX9Va*L#YhmUpg+QQ z4u73GE5x(;CPH^E7zO2j8br6Yx=Wzat#01tsU>7A8azh8$t#%|l!Mt+ zdXLJVYJhxt=K6W*x2uN(><9i~>??Vc2O#b@8@ z61>ci$Q4_XK;-dOwOS7CFLbqW5K$?S)mJ=Z_Npcks47QkGQ|k{+nbj6tq85|H7%CK zRgsedH?b4e|lS}bV{t0by$+eQX`1rTi~+?q=5x3OnTcx1U-O+n07(DF`l&9{&M z_r*znd2K!KoQ|kL+K>)`dSv?bswA1^^I5`zc8$GBth<+are=cOg0ITW-l{D%WUM-p zN!c25YA_@DNdS1F<*~rYrrYYW$#b>>u`V0u$IPqT=90!3B7)VYMxAaPtcpKORP6*X z>oM6{w$z$(tmJT`cikUOm2gTeq%^FqiQq(@_D?ck-bo6)WN!5yl|o}rTc@37$+R<;ATjmDXDGMVLTX=f#qIR=?mlo^c>pV9bf-3< zb0Y<14$B@vCxPigX`<@l-X&#N&|tCddXxJ8l@-KK4A&Cde)0&|sBC9;IO4QPBnh)l z`rN@_%M+o1u>)&zr#%m)Qi?M1EH=eVr0qEC%}*_oTWK=LE_~T#A0m^zO{utuIu?^d6_)71QbHR zFR##5+oI_V*HMD8Z{&9slGi9^n`OfRD*VT|&swEjEh33j?o!_AG|rB|77V1Go|U5= zMnW8inIUVByrNh030+4O*6XUKUhAv|#hab55&zy-mIyY*xR#`$eM2 z2PLr}&q6AIWmCKyo=-i6SZU16s~Rr^78%AzrAI2R=}8^9Bd5}cwb;T^ySUkQBPxO$ zjJtYOd9tw<7{D0>^*r%U3`fr(&OT=Y&~uN{k>?Hxoj@7j53Mw;?n99UvPiKBik5xZ z+m5`|xh34{$r%aQbTZMCPLXQo-jLNhSyRrZOShb zq&{SYvcswVA)1xT+*>KysByF?>x$O6fJh91L5)TiBkxx}rP60F@&I_r=}@&=2}6*KKi3^CLEg=I0sOjxhC59;6nG0c8BxgK&Q%|{ZN$P~R z-6Iro#1WI8*r~+sCMaEuWZ-T&z|U%`j*l|Q8WvwhIK@a6r`?8ZmfEF96-?FYgokVl z>Abq`3_BW@TZFhJoz+-<-NumGw2t5@1ae9AHD2n~)^9B_!jG7mJ=RM~`Vw<6<;xM& zgPNTkf~rQug4o=DB#m5?wa89h%Ts~9MA1eFNdpq1BlVkx|Aqb=WTYSuYx}U8i@G zL$hS$dsVsL%NaNUhSnX(HBv03sw2oo8<*OW-sV%+R9cGX?9j3m+*tJol4+LLZ)-N> zOqNhsVre)A)9)nwzAs$8ii%G%lm%h;9mhr+TMlqB5~-iGxeaFzbML;-i&Kxn;MR-cine z=pW~r8jC5y`rA@TrtsGs&b@S3Bn3#dr*-`c)`hT!jZ@T$b|Y;T7Wy$2(bZlBT4vxVX2tk?&Dn zDU-@|9hcNpakKerBxuS=$>OC_j~gt7hDLbmPp8tfii~y~BDWrwNer;74a^BgkevtTVOI(fg~LAeQKaaGAix>0ymE0vq@g&{IR{w19EPyQW8#7 zVVfE0(Ek7`g39g~E+mprt%PDSe~8o(U3n170_2cDHJV#;xA&@D-i$8Y?rmCLGS39d zwOwTMH+Lj-{c2~C=3tr5=PX$CteZ9tfE!W1D|@XmNbo$xqKA!nILy^ ztAg8lp5S7%;<;-(Xp9rAv&yPmvu@f)Z)&M!acq#xgcW54lLLl5I@WZ=tg(Q_PV6Z5 zs^}~0a@FcuTSBP&nqom-k z6J4ZQ1%p``WxFCwZjc5z8R$5r9avuLQwvO z>Nb}Taw6JT=j2?EnSQ;hBevE#7BmvOrqPaeR=qSic~!}bh_@fSo6KRIxaS6zb1dXX z=XqFDxVIVl3a=KQ3*4g#+jA1f9RR05>E|CiF1aLb;Q9(BD=UggC!u`KEp1jfWMmlJ z#{@GUddiPdy0)09a>~anSCDg3PK8(n9C3`C)we}_q^HSkp%qjEyX#h^bO|n{X>`|n zgEVMca`~M*o^UH>TS@O?+Z=>M%o%|=0CE2S*Qzb3yjG!hZFCz!#xvMbA(=`(_E^~b z%rZe0H%t|u-_#-ovzSz?%gWR18UwBIgEyVBz=BW0OS0CB}ap0;9AZR#=Y+IDF{3`=~a zk3mtqPUJ@#ZXo=;brm>bg!zZ&U*TbapGvg?A_ln`1wjg+7M&|-3$k@rT-WBweTl(#Wz`?9;F%LxvR^K+68DJ2CVMGNzH z?@C|o1dZjCoB`6Ka8g#ralGT{MU35(u&k`C3v~kk=AQr=K4;xwf(=CO00$Y(2&L7J zIoZ1z{3)fa$W|r}s_ftnyFg=rY3{6rUuuMIcWvY8RZysiMIrfm=eRX;8H`Y*bAIv` zs?One9D|NBYI#D$Lm?qZ;FHBfq{;J?I|tqexus>W zHFt5aY+^jZaCkgYtWOHa5l_mkf;rtyIcYc;2dCjvL|No62PAynf`#Tz+6{mRA!8wJ z?ZGY34)qLq8qsrN0`~Sj1#+_qLwB?+cUc&r9}P9 z5CH)|ub!bo;5xG4 z`uhHrP{JNO5tfXeoy}&f?wLv4f`5@u$h%vW))E5DF(nn`InxZMP@Z2$k9wnpOk@t z??F#0Gle9M*v%tGt_#LFJq~frNfV8`W+6{zBl-H#r&3#FNX)5{*um&&!I9LYpDs@Z ziB?#P0074%9&t^F5)8!2<;G=~Ri4Ac=<5!Pq%D>qJpQ9HGc&1&7Rd z3rEi5A+SeEQ0(ee*a4m~>rIN*G-ZQKduM05Z$Bey_CB>z`raF6jUhQK12GMd1yu-3 z9pgCa-jx03M@4R1Xc<1jv$IWDZJ~wT+hUEX4sDoq37a1%2Q)vG78C-+jO6sIjo9}h zFTHudZ08jjVvCW^4k-JDjsQDnbNELdM?9*c$xyWEtj&X`Z8%()YCmm|U zNX@*0LmvL3og6q~0dKvATFz5R*^?;Ps^FrIHxMehNhFT|Z6Nfmi`#ghiFTF*51XG_ z&vSsPq#TdDD2+tb(2~;PMw<~;{!^SO^{Elj3&kKIMsR&;j8%|^AeH1F=~FGEPP@Sy z*R>}u;cKF^+%u;jx#^ z*EpyIMb~R_k3-g^h_E1FfH;YLastEyxaZ=k@JgpMCGBW_k#Pr2G zQ4Xu+L=?Z?I6Z}8-QBvK4K0~c+Ap+;q$+l=36a5XPv=FwoMJNf54Ke#qJxT9B)GP+ z*g-MBAo@2v)b^I`ETPEUHXoZEIPF)W*_M@-`v{M0Y~*)#^9ysha@0V^$~h-2V-528 zdBGx>wyM^*0JA9oFbDW~r?h5Uh|+f)k6v+#ZC^wZO{6pJqH<%CK@1uS~=+M-cfYoRtvN3k}d#iESM zHzf$#qork~yy(hfgE>62dS;SX%*W2Sl&NJq6m=x@s{-xb+hA<5!hxQCwWG8Zk~MOQ zG$4iIvytNp&^v9B_h7Ldg+1;qBT&HY+&IYO8iv8lw#QB*HwaA8FF@Y8HCE((u&eCA zQSyZyMQ0^>CiXI%wM}eDvU!Y_@V@pVmd6X~ezkHTZ>L(a$uhBG8J8Hz9kbT4tpSQ> ze=vfelmpisQ?2mdX`bRiDOK8|90ojb`qtdHcTCk;B+jDd@f%IGztb&}D^+2=iv89n z1pbvlc0qRUAW1^pw9&EcmM8M4mgVfUt3;9Z#kHHtBZnoA-mF>f=AB7ws(s?UIHF3< z$d@OvwWzP!AlYt+(Z`kvoP3p_B-p1+;y5w?q3X0-+?jQ*d%Wj}3V}($CYc9em(cU2ZGUdm& z^c8a6H2Vt^I~bqtDHu>Y5mKq7?%1Ig-lci&k>pVvjKU`E>z=i;Zle|}D7bc%3<0~L z`c!&mn72&95D3DZjgP#;{{XL5Z*AjM4$M}5Hz*hw^{a0BBARJ7$4h))rtE(nPY3X- zFETTRiGq@Fa4NKN1-cC*w!xBA9zGFBXa1BzCC>hyRQ+nWb$2EQ_=bXn8e1!l2M?qOmeD^q0h9Kl|j8*%0 z+a6c%7UTL+B%072t)XIFUQ~odAq4ZVW1y_r-KHgi_2<%=J1?2LImQ)9_U}YWOl>Yp zBA?9Dj8YwvdKwm&gdMU#n^<5jPEA|6pL7Hdl#jZr+Om@I9eF^dSDXrnO6b$D(%VY#&JOX{(~c^f6?>XwaXK={*NduQUx<8{n!AhBOFsv%0;l9$0f7qDcDW2#7>Y%K$8WBAdaGynHUD$mE$CL zs_qPMti{x`3<2mV(5Cogc*gECiZ&Wn(3VsMGTGXC4_a81v#N{*4S+jSQH!);h*O+^ z$FH?qw2#b~upKjiJ$g~G3Jtp=7DwK|FbduMsf~qfL;{82k5g7BMz>;*v}ETwSpLUAP1cT&_S8A{0!N=1TTj#i9Q+8CGFKlL# z;fmb??BpUZPJV9nX?waF#kU(W>~8k(7B94gBXB(hXT-(YC?mKycFQs3({68?Yfy>+ z0dUQVNFK+cHORQa5O&#zS^BUr})x4`qO~QoK&jI~7F)oN=6*(t_PCEl=(QWWL?U zCaJ}6kWIZnGBLnVGC-^8bLYe46Xix*dokdT@vZtBMO|5rMG?YbB|rxZ#P=Qkn5JA# zkwmFzqa-nD5Ah8D09u9Sg57WwyB>_)556i1ZX3&UB+r5{5pn<&uWifaNoYrKgY8VQ zl2LHmk5+F=W9&x&F6j>}+2CPC;;efrx zR|=(yI-WmTnaP!kH_Tan_op=2p?KyVVK`MS&!DCkEL*I0?ejJO$>e6HNdiK|0Q;8% zJxI+}+vck0zH(_`5!b0g+FNRgok4h*4Sst4ucc7zFdrb3|lMHQkXbrPDU~Bs-Z)V7DM=6+N7y-3u=wKvjEz zRUDr*fWeM7f@u>0xXSJ5y^qp|Ce?$NOB3G}-meR7P&vn~M69m}+)nM_^{Cu$Wgm5c z=RGPl1)bDzK<`gyp_{eMFFG__>=JQ-gVLh;ofj;|PC3u%Rjn99a0~4_c)_V2S}Lo8M=OD#aQNvOgmNABX6}p=2cMOV01sq zrGeFCUztNMAd$hVHzi`1WO1kyAl?xKR;GSyQ zOD&jE&cT)N%3C0cWy1y@Yr+~ZerbAR*if}Il#_NvbOtotw2U4qW{o5REET}d&CuqQ zAZW*yOLLBClH?GeWx5(`%$X6(Y|OwDv>pM?SeIavasjm&V;07yM4 zla*tDc4fB^4^vg57eYB3YwiO%J;gpESOqLVJw+-ZIc6A9(A234vatbk3ykz90DAW| zn_wrH`-dBVAYk+quB^m>Hvyi9flDURKirWSD*$UZ=M9nCASOms>zzF`ZF-GxY8 zqu^i$!nf9lU`O)+!6h?;NpH2lN9)1Q)4e-&V^U7Vbvacse87(0l^FRX-4Vz=Po+G% z#-=iGR1h)P(<7661t4ac(UUC+1Nm`oByJ>{i9)x`+@7FQ)naxFxbk{bvP6h?bpgKV z_NwNw2@$gs6Sl*iz;>$Q-MAq+Jd)m(eO(qeVltp)f$vc~rN_!fGr&Al^D>o@cG}@B z;fW$Yb%}3MJ*up?0cH&zMp&FvB2tVSaokTisH6-7kU0de(u9Yovyz2fQw!9A*b`CU zgS6z98--5u9pQ-2%Y*Mw6x_krl^lDDv=4ECSeuCCqeTb^y0Wtf!2{(Sd?+K zyEkf<2$|qk+aly2;sTqzg(^+~;QG==-cx|Ym2NZZPcl4mws6ajN=*gDiIg{&k`=mC zo??b%d@)`yX^Si;1&}Ka>q{lNNKC0HV~@Mg=9R8LLSb}{m^>92UBjsKsAZL0{G@@< zk4lBXDso6T;A0r1iWw2Nf*U=l^4t+7S-A>G>}o|hNT-$BqhqR`-~e;@)lVyC7?9r7@gR2j_&pc37Px4Ik+--c z9iU)my&~)`RE&&tsR+mJ&m?pp(}_e~jBwq}G(%%Tp&^l*zCq|sO5p|-ae_Ihl}jlg zaHBshI0RraTi+dNhoG+PM%|z4*nlo_dl60f+pp!CdIFA3i!`@WQioH7#IK$SQ^nu zbt*C)ItB&OO{5XEb5^a?c}mPieRJBW>_v$qkLGU1tt2t+EX+t!K3vvv*HjXRHluEi z%X8$iu`QBMJXKwrVJZhF2XGxK@QoYi*c2{sJ*u;mxKQJEcM_wfPimMUa@r*n^8;c* zhHeIX`c{H5F|(%*t<-crwAT)?mnaT-+QX$0PDC=tv3E(0tT-#{il&=(Gijtwfn|<4 z7@iJx_Qg8&(d=VX1&;hSIK@?2f6$d1s^kOfO938RCp)VL7TSG;orsY)xIw@pgHTIu zQ#-NHyM3a4tmgMY=k*RJ8Ghgy*^mLhjCt53>;IWAgJ7*Gj{q^fFZSJ+`&|B0MMC5SB#WK0CdL{ z6E@Wu9A>POOp8XFw07_j@jFniOAqqg)LM|GtC0B0QfQm zr?oK~(z^)lXN{Rl0_O+5 zXrhSjiC+p6Mknlxo=eWViRyW+%{myG-uap}C3caK??n}|>Ra6v{?PJ%?ZUdPzTg;V zo$NoAW@=64YH&oVyBR|eM|@F5CN^r$N@_Rw>`p%_qaEC{T|guul@#p+bn8VGjCW?M z;R`}{$eB2jK&*R_n!XfGskAOhjRMB2*e>3bQCf5|`$&8jvqK|A837?rkYlA+lnE`G zX68>bZhfetiEM`c0~SP4JE$CF(PYIH24=ti$U?6=lS& zDu7!9r%Jteiw=sWF|?kz`q4!XbWFM#tMbMeb)_VWcaVMJc{EW;Zd5lkwCH2|46nE5 z`FZ?lj~cAX>M-7-iYjHfPoWDj^G`gH$?w*mDJcwvc+PYA(M3Li5|S|u*EvE?eQ{d4 zdMj9o2>FI_MHEY7R^@p{EX=^2`;U5LKQksth7T0U!>TG*L{6?8)qixQ#s3RypcNG~1Y#Cv`$b4+lK-qKb~D4`f4V z?jn%+j85L>lIr3?0^z!#&*UhgwvNMHO04X*?S?$(HDVw!j@bT`QAa?INcRAKQT*tlq){eb5R|T?ltl?BFmc+M z3Fn~Wr4&&OjcNQLa8A`fS^|M;SbgAlG*MPt+-uCi_V7m?MLZyRWQlq&?%xLZ8kxm$NHLGd|?j*;|>UVqbMHNrsW^&kV(J6B# z-ZtYHtr&Q>G7r7SG*MFi5q*)GtC0%e4pW{h3|u*kkU&1diYk`D4}`r6hPp&Nsa{9n zPPbzeh*043MHHlHw-)8tO1$yU9ji*%2Z6T??Tj$bu4tl@*wJ+>$O76#KpDyYb(yH0 zw`XVr7{(}~h-_esU+e4yvU1?{tc#gmSpaj84+FInRa4y0?IPbqVhPA$ik{_ELbCuj z=dBb}y^&o=5s5A{#@dG8=bsJ8+u!R&6>DY)wm$wlRK2m-FBDN(^d*$yV)sNb$ib;( z`67Xrg2S39r_dI}*5D-D*Mo!oDl3O%b=q-76f#%DN2nsK=K~o$)p$TIGyU2qp%(XL zz^bs81Ch}FGzKy@Tas6w%8Dp^khdK1sIhzx?$s=xv;o+3qKc)kEy=^PA<3dbNsm3x zG*MF$(HzA6p@(eMW*oi=9Co6LsO}=&uRB!q#Wqiw256#@LR*sa2-}tPs|=&d2OQBw z43t;20L?Hx063??^W{l6qKX+vkTH?n7~}!PGjT(K(uygK4Q4s1E#+q=8w7ibD4`tF8@cLeqJn#qAPbBST9^Rp3G0s3QAa`b z5fC{FbB=q|3{G*AfHM+c=vC*2>76jbyxU}8fa@;+nK(!ugc9snE~D531ef@D>@ zmjj{VqJ9`+iYatJODM|3PhG#%)RO-IsEl@^ig7LMMQ#4LQrv)sO}t?7MHKpnLIfq0 R6Uog?;4FMmMKI`p|JkTu`9=T$ literal 0 HcmV?d00001 diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/resources/base/media/icon.png b/function/ui_compare/capidemo/entry/src/ohosTest/resources/base/media/icon.png new file mode 100755 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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

(zs%@2G0f&qW>j6L^ra+ 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 Pf0@AI^sGYY)8hXE54%F} literal 0 HcmV?d00001 diff --git a/function/ui_compare/capidemo/entry/src/ohosTest/resources/base/profile/main_pages.json b/function/ui_compare/capidemo/entry/src/ohosTest/resources/base/profile/main_pages.json new file mode 100755 index 000000000..5f3052c1f --- /dev/null +++ b/function/ui_compare/capidemo/entry/src/ohosTest/resources/base/profile/main_pages.json @@ -0,0 +1,28 @@ +{ + "src": [ + "MainAbility/pages/DemoIndex", + "MainAbility/pages/column/ColumnJustifyContentTest", + "MainAbility/pages/column/ColumnAlignItemsTest", + "MainAbility/pages/column/ColumnAlignItemsMoreAttributeTest", + "MainAbility/pages/row/RowJustifyContentTest", + "MainAbility/pages/row/RowAlignItemsTest", + "MainAbility/pages/row/RowAlignItemsMoreAttributeTest", + "MainAbility/pages/flex/FlexOptionsTest", + "MainAbility/pages/radio/RadioCheckedTest", + "MainAbility/pages/radio/RadioStyleTest", + "MainAbility/pages/radio/RadioValueAndGroupTest", + "MainAbility/pages/radio/RadioResetAttributeTest", + "MainAbility/pages/grid/GridTest", + "MainAbility/pages/grid/GridCachedCountTest", + "MainAbility/pages/grid/GridResetAttributeTest", + "MainAbility/pages/refresh/RefreshForContentAndRatioTest", + "MainAbility/pages/refresh/RefreshForContentAndRatioAbnormalTest", + "MainAbility/pages/refresh/RefreshForRefreshingTest", + "MainAbility/pages/refresh/RefreshPullToRefreshTrueTest", + "MainAbility/pages/refresh/RefreshPullToRefreshFalseTest", + "MainAbility/pages/refresh/RefreshPullToRefreshAbnormalTest", + "MainAbility/pages/refresh/RefreshPullToRefreshTrueAbnormalTest", + "MainAbility/pages/refresh/RefreshResetAttributeTest" + ] +} + diff --git a/function/ui_compare/capidemo/hvigor/hvigor-config.json5 b/function/ui_compare/capidemo/hvigor/hvigor-config.json5 new file mode 100755 index 000000000..b4886e292 --- /dev/null +++ b/function/ui_compare/capidemo/hvigor/hvigor-config.json5 @@ -0,0 +1,5 @@ +{ + "modelVersion": "5.0.0", + "dependencies": { + } +} \ No newline at end of file diff --git a/function/ui_compare/capidemo/hvigorfile.ts b/function/ui_compare/capidemo/hvigorfile.ts new file mode 100755 index 000000000..159890e9e --- /dev/null +++ b/function/ui_compare/capidemo/hvigorfile.ts @@ -0,0 +1,6 @@ +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/function/ui_compare/capidemo/oh-package.json5 b/function/ui_compare/capidemo/oh-package.json5 new file mode 100755 index 000000000..8cde42f47 --- /dev/null +++ b/function/ui_compare/capidemo/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2024 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. + */ + +{ + "modelVersion": "5.0.0", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} \ No newline at end of file -- Gitee