已关闭
UI组件_DEMO #189
UI组件_DEMO #189
已关闭
jarvis_chen创建于 9月15日关闭于 21 天前
共 232 个文件变更+20133-93
@@ -13,6 +13,7 @@
13 13 
14import("//build/lite/config/hap_pack.gni")14import("//build/lite/config/hap_pack.gni")
15import("//build/lite/config/subsystem/applications/config.gni")15import("//build/lite/config/subsystem/applications/config.gni")
16+import("//foundation/arkui/ui_lite/ui.gni")
16 17 
17# lite 构建默认 language_cpp 为 c++11,本模块使用 std::make_unique 需要 c++14。18# lite 构建默认 language_cpp 为 c++11,本模块使用 std::make_unique 需要 c++14。
18# 注意:目标直写 cflags_cc 会排在默认配置之前而被 -std=c++11 覆盖,19# 注意:目标直写 cflags_cc 会排在默认配置之前而被 -std=c++11 覆盖,
@@ -32,9 +33,39 @@ shared_library("graphic") {
32 "graphic/src/main/cpp/button_demo_ability_slice.cpp",33 "graphic/src/main/cpp/button_demo_ability_slice.cpp",
33 "graphic/src/main/cpp/scroller_demo_ability_slice.cpp",34 "graphic/src/main/cpp/scroller_demo_ability_slice.cpp",
34 "graphic/src/main/cpp/switch_demo_ability_slice.cpp",35 "graphic/src/main/cpp/switch_demo_ability_slice.cpp",
35- "graphic/src/main/cpp/slider_demo_ability_slice.cpp"36+ "graphic/src/main/cpp/slider_demo_ability_slice.cpp",
37+ "graphic/src/main/cpp/rm_test_utils.cpp"
36 ]38 ]
37 39 
40+ if (ui_lite_enable_button_animation_touch_extend_config) {
41+ sources += [
42+ "graphic/src/main/cpp/button_rm_case_view.cpp",
43+ "graphic/src/main/cpp/button_rm_test_slice.cpp",
44+ ]
45+ }
46+
47+ if (ui_lite_enable_scroller_indicator_style_adapt) {
48+ sources += [
49+ "graphic/src/main/cpp/scroller_rm_case_view.cpp",
50+ "graphic/src/main/cpp/scroller_rm_test_slice.cpp",
51+ ]
52+ }
53+
54+ if (ui_lite_enable_switch_config) {
55+ sources += [
56+ "graphic/src/main/cpp/switch_rm_case_view.cpp",
57+ "graphic/src/main/cpp/switch_rm_test_slice.cpp",
58+ ]
59+ }
60+
61+ if (ui_lite_enable_slider_config) {
62+ sources += [
63+ "graphic/src/main/cpp/slider_rm_case_view.cpp",
64+ "graphic/src/main/cpp/slider_rm_test_slice.cpp",
65+ ]
66+ }
67+
68+ 
38 deps = [69 deps = [
39 "${aafwk_lite_path}/frameworks/ability_lite:aafwk_abilitykit_lite",70 "${aafwk_lite_path}/frameworks/ability_lite:aafwk_abilitykit_lite",
40 "${appexecfwk_lite_path}/frameworks/bundle_lite:bundle",71 "${appexecfwk_lite_path}/frameworks/bundle_lite:bundle",
@@ -47,7 +78,8 @@ shared_library("graphic") {
47 "${appexecfwk_lite_path}/interfaces/kits/bundle_lite",78 "${appexecfwk_lite_path}/interfaces/kits/bundle_lite",
48 "${aafwk_lite_path}/interfaces/kits/want_lite",79 "${aafwk_lite_path}/interfaces/kits/want_lite",
49 "//foundation/arkui/ui_lite/interfaces/kits",80 "//foundation/arkui/ui_lite/interfaces/kits",
50- "//foundation/arkui/ui_lite/interfaces/innerkits"81+ "//foundation/arkui/ui_lite/interfaces/innerkits",
82+ "//foundation/arkui/ui_lite/frameworks"
51 ]83 ]
52 84 
53 defines = [85 defines = [
@@ -0,0 +1,106 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#ifndef BUTTON_RM_CASE_VIEW_H
17+#define BUTTON_RM_CASE_VIEW_H
18+ 
19+#include "components/ui_label.h"
20+#include "components/ui_label_button.h"
21+#include "components/ui_view_group.h"
22+#include "graphic_config.h"
23+#include "rm_test_utils.h"
24+ 
25+namespace OHOS {
26+#if GRAPHIC_ENABLE_BUTTON_FLAG
27+ 
28+enum ButtonRmCaseType : uint8_t {
29+ BUTTON_CASE_DEMO,
30+ BUTTON_CASE_INTERRUPT,
31+ BUTTON_CASE_STRESS_CLICK,
32+ BUTTON_CASE_STRESS_MANY,
33+ BUTTON_CASE_STRESS_CONFIG,
34+ BUTTON_CASE_STRESS_ENABLE,
35+};
36+ 
37+struct ButtonRmCase {
38+ const char* id;
39+ const char* name;
40+ const char* expect;
41+ ButtonRmCaseType type;
42+ bool isHotZone;
43+ bool adjacent;
44+ bool useDefaults;
45+ bool invalidEffect;
46+ uint16_t repeatCount;
47+ UIButton::ButtonAnimationEffect effect;
48+ int16_t expandL;
49+ int16_t expandT;
50+ int16_t expandR;
51+ int16_t expandB;
52+ bool disabled;
53+};
54+ 
55+extern const ButtonRmCase g_buttonRmCases[];
56+extern const uint32_t g_buttonRmCaseNum;
57+ 
58+/**
59+ * @brief Button RM 单个用例的视图构建与清理器。
60+ *
61+ * Build() 在 content 内部创建并返回用例容器;析构时先剥离监听器再删除容器子树。
62+ */
63+class ButtonRmCaseRunner {
64+public:
65+ explicit ButtonRmCaseRunner(const ButtonRmCase* testCase);
66+ ~ButtonRmCaseRunner();
67+ 
68+ UIViewGroup* Build(UIViewGroup* content);
69+ 
70+private:
71+ void ResetState();
72+ UILabelButton* CreateDemoButton();
73+ void ShowDemoCase();
74+ void ShowInterruptCase();
75+ void ShowStressCase();
76+ void ShowManyButtonsCase();
77+ void AddClickListener(UIView* view, std::function<bool(UIView&, const ClickEvent&)> fn);
78+ void SetInfoText(const char* text);
79+ void RefreshCount();
80+ 
81+ struct ListenerEntry {
82+ UIView* view;
83+ RmClickListener* listener;
84+ };
85+ static constexpr uint8_t MAX_LISTENERS = 128;
86+ 
87+ const ButtonRmCase* case_;
88+ UIViewGroup* container_;
89+ UILabel* countLabel_;
90+ UILabel* infoLabel_;
91+ uint32_t demoClickCount_;
92+ uint32_t demoOutsideCount_;
93+ uint32_t adjacentClickCount_;
94+ uint32_t stressPassCount_;
95+ uint32_t stressFailCount_;
96+ uint32_t distinctHitCount_;
97+ bool manyHitFlags_[100];
98+ bool currentIsHotZone_;
99+ bool currentHasAdjacent_;
100+ ListenerEntry listeners_[MAX_LISTENERS];
101+ uint8_t listenerCount_;
102+};
103+ 
104+#endif // GRAPHIC_ENABLE_BUTTON_FLAG
105+} // namespace OHOS
106+#endif // BUTTON_RM_CASE_VIEW_H
@@ -0,0 +1,25 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#include "button_rm_test_slice.h"
17+ 
18+#if GRAPHIC_ENABLE_BUTTON_FLAG
19+namespace OHOS {
20+REGISTER_AS(ButtonRmTestSlice)
21+ 
22+ButtonRmTestSlice::ButtonRmTestSlice() : RmTestSliceBase("Button RM验收") {}
23+ 
24+} // namespace OHOS
25+#endif // GRAPHIC_ENABLE_BUTTON_FLAG
@@ -0,0 +1,31 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#ifndef BUTTON_RM_TEST_SLICE_H
17+#define BUTTON_RM_TEST_SLICE_H
18+ 
19+#include "rm_test_slice_base.h"
20+#include "button_rm_case_view.h"
21+ 
22+#if GRAPHIC_ENABLE_BUTTON_FLAG
23+namespace OHOS {
24+class ButtonRmTestSlice : public RmTestSliceBase<ButtonRmCaseRunner, ButtonRmCase,
25+ g_buttonRmCases, g_buttonRmCaseNum> {
26+public:
27+ ButtonRmTestSlice();
28+};
29+} // namespace OHOS
30+#endif // GRAPHIC_ENABLE_BUTTON_FLAG
31+#endif // BUTTON_RM_TEST_SLICE_H
@@ -28,7 +28,7 @@ MainMenuAbilitySlice::~MainMenuAbilitySlice()
28{28{
29 // 先解除菜单项对 listener 的引用并释放 listener,再销毁视图树,29 // 先解除菜单项对 listener 的引用并释放 listener,再销毁视图树,
30 // 防止视图树销毁过程中触发回调访问已释放的 listener30 // 防止视图树销毁过程中触发回调访问已释放的 listener
31- for (int16_t i = 0; i < menuItemCount; i++) {31+ for (int16_t i = 0; i < menuItemCount_; i++) {
32 if (itemViews_[i] != nullptr) {32 if (itemViews_[i] != nullptr) {
33 itemViews_[i]->SetOnClickListener(nullptr);33 itemViews_[i]->SetOnClickListener(nullptr);
34 }34 }
@@ -67,14 +67,27 @@ void MainMenuAbilitySlice::SetupContent(UIViewGroup* content)
67 const char* target;67 const char* target;
68 };68 };
69 69 
70- const MenuItem items[menuItemCount] = {70+ MenuItem items[menuItemMaxCount];
71- { "Button组件验证", "ButtonDemoAbilitySlice" },71+ int16_t count = 0;
72- { "Scroller组件验证", "ScrollerDemoAbilitySlice" },72+ items[count++] = { "Button组件验证", "ButtonDemoAbilitySlice" };
73- { "Switch组件验证", "SwitchDemoAbilitySlice" },73+ items[count++] = { "Scroller组件验证", "ScrollerDemoAbilitySlice" };
74- { "Slider组件验证", "SliderDemoAbilitySlice" },74+ items[count++] = { "Switch组件验证", "SwitchDemoAbilitySlice" };
75- };75+ items[count++] = { "Slider组件验证", "SliderDemoAbilitySlice" };
76+#if defined(GRAPHIC_ENABLE_BUTTON_FLAG) && GRAPHIC_ENABLE_BUTTON_FLAG
77+ items[count++] = { "Button RM验收", "ButtonRmTestSlice" };
78+#endif
79+#if defined(GRAPHIC_ENABLE_SCROLL_FLAG) && GRAPHIC_ENABLE_SCROLL_FLAG
80+ items[count++] = { "Scroller RM验收", "ScrollerRmTestSlice" };
81+#endif
82+#if defined(GRAPHIC_ENABLE_SWITCH_FLAG) && GRAPHIC_ENABLE_SWITCH_FLAG
83+ items[count++] = { "Switch RM验收", "SwitchRmTestSlice" };
84+#endif
85+#if defined(GRAPHIC_ENABLE_SLIDER_FLAG) && GRAPHIC_ENABLE_SLIDER_FLAG
86+ items[count++] = { "Slider RM验收", "SliderRmTestSlice" };
87+#endif
88+ menuItemCount_ = count;
76 89 
77- for (int16_t i = 0; i < menuItemCount; i++) {90+ for (int16_t i = 0; i < menuItemCount_; i++) {
78 int16_t itemY = menuItemStartY + i * (menuItemHeight + menuItemGap);91 int16_t itemY = menuItemStartY + i * (menuItemHeight + menuItemGap);
79 AddMenuItem(items[i].title, items[i].target, itemY, i);92 AddMenuItem(items[i].title, items[i].target, itemY, i);
80 }93 }
@@ -35,7 +35,7 @@ private:
35 void AddMenuItem(const char* title, const char* target, int16_t y, int16_t index);35 void AddMenuItem(const char* title, const char* target, int16_t y, int16_t index);
36 36 
37 // UI布局常量37 // UI布局常量
38- static constexpr int16_t menuItemCount = 4;38+ static constexpr int16_t menuItemMaxCount = 8;
39 static constexpr int16_t menuItemHeight = 80;39 static constexpr int16_t menuItemHeight = 80;
40 static constexpr int16_t menuItemGap = 12;40 static constexpr int16_t menuItemGap = 12;
41 static constexpr int16_t menuItemStartY = 16;41 static constexpr int16_t menuItemStartY = 16;
@@ -51,8 +51,9 @@ private:
51 51 
52 UIScrollView* scrollView_ = nullptr;52 UIScrollView* scrollView_ = nullptr;
53 // 菜单项归属 scrollView_ 视图树;保存指针仅为析构时解除监听绑定53 // 菜单项归属 scrollView_ 视图树;保存指针仅为析构时解除监听绑定
54- UIViewGroup* itemViews_[menuItemCount] = {};54+ int16_t menuItemCount_ = 0;
55- std::unique_ptr<EventListener> itemListeners_[menuItemCount] = {};55+ UIViewGroup* itemViews_[menuItemMaxCount] = {};
56+ std::unique_ptr<EventListener> itemListeners_[menuItemMaxCount] = {};
56};57};
57} // namespace OHOS58} // namespace OHOS
58#endif // GRAPHIC_MAIN_MENU_ABILITY_SLICE_H59#endif // GRAPHIC_MAIN_MENU_ABILITY_SLICE_H
@@ -0,0 +1,203 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#ifndef RM_TEST_SLICE_BASE_H
17+#define RM_TEST_SLICE_BASE_H
18+ 
19+#include "component_demo_slice.h"
20+#include "components/ui_list.h"
21+#include "components/ui_label_button.h"
22+#include "common/screen.h"
23+#include "graphic_utils.h"
24+#include "rm_test_utils.h"
25+#include <cstdio>
26+#include <new>
27+ 
28+namespace OHOS {
29+ 
30+/**
31+ * @brief 共享的 RM 列表/用例/返回按钮模板基类。
32+ *
33+ * @tparam RunnerType 用例运行器类型(如 ButtonRmCaseRunner/ScrollerRmCaseRunner)
34+ * @tparam CaseType 用例配置类型(如 ButtonRmCase/ScrollerRmCase)
35+ * @tparam Cases 用例表全局数组指针
36+ * @tparam CaseCount 用例数全局变量指针
37+ */
38+template<typename RunnerType, typename CaseType, const CaseType* Cases, const uint32_t& CaseCount>
39+class RmTestSliceBase : public ComponentDemoSlice {
40+public:
41+ explicit RmTestSliceBase(const char* title);
42+ ~RmTestSliceBase() override;
43+ 
44+protected:
45+ void SetupContent(UIViewGroup* content) override;
46+ 
47+private:
48+ void EnterCase(uint32_t index);
49+ void BackToList();
50+ 
51+ static constexpr int16_t BACK_BTN_W = 88;
52+ static constexpr int16_t BACK_BTN_H = 56;
53+ static constexpr int16_t BACK_BTN_TOP = 8;
54+ static constexpr int16_t BACK_BTN_RIGHT_MARGIN = 8;
55+ static constexpr uint16_t BACK_BTN_FONT_SIZE = 20;
56+ 
57+ UIList* caseList_ = nullptr;
58+ RmCaseListAdapter* adapter_ = nullptr;
59+ UILabelButton* backToListBtn_ = nullptr;
60+ RunnerType* runner_ = nullptr;
61+ RmClickListener* backListener_ = nullptr;
62+ UIViewGroup* content_ = nullptr;
63+};
64+ 
65+namespace internal {
66+inline void FormatCaseTitle(uint32_t index, char* buf, uint32_t bufSize,
67+ const char* id, const char* name)
68+{
69+ (void)snprintf(buf, bufSize, "%s %s", id, name);
70+}
71+} // namespace internal
72+ 
73+template<typename RunnerType, typename CaseType, const CaseType* Cases, const uint32_t& CaseCount>
74+RmTestSliceBase<RunnerType, CaseType, Cases, CaseCount>::RmTestSliceBase(const char* title)
75+ : ComponentDemoSlice(title) {}
76+ 
77+template<typename RunnerType, typename CaseType, const CaseType* Cases, const uint32_t& CaseCount>
78+RmTestSliceBase<RunnerType, CaseType, Cases, CaseCount>::~RmTestSliceBase()
79+{
80+ if (runner_ != nullptr) {
81+ delete runner_;
82+ runner_ = nullptr;
83+ }
84+ if (backToListBtn_ != nullptr) {
85+ backToListBtn_->SetOnClickListener(nullptr);
86+ }
87+ delete backListener_;
88+ backListener_ = nullptr;
89+ if (adapter_ != nullptr) {
90+ delete adapter_;
91+ adapter_ = nullptr;
92+ }
93+ caseList_ = nullptr;
94+ backToListBtn_ = nullptr;
95+}
96+ 
97+template<typename RunnerType, typename CaseType, const CaseType* Cases, const uint32_t& CaseCount>
98+void RmTestSliceBase<RunnerType, CaseType, Cases, CaseCount>::SetupContent(UIViewGroup* content)
99+{
100+ content_ = content;
101+ int16_t screenW = Screen::GetInstance().GetWidth();
102+ int16_t screenH = Screen::GetInstance().GetHeight();
103+ 
104+ adapter_ = new (std::nothrow) RmCaseListAdapter(
105+ CaseCount,
106+ [](uint32_t index, char* buf, uint32_t bufSize) {
107+ internal::FormatCaseTitle(index, buf, bufSize, Cases[index].id, Cases[index].name);
108+ },
109+ [this](uint32_t index) { EnterCase(index); });
110+ if (adapter_ == nullptr) {
111+ printf("[RmTestSlice] create case list adapter failed\n");
112+ return;
113+ }
114+ 
115+ caseList_ = GraphicCreateView<UIList>(content);
116+ if (caseList_ == nullptr) {
117+ printf("[RmTestSlice] create case list failed\n");
118+ delete adapter_;
119+ adapter_ = nullptr;
120+ return;
121+ }
122+ caseList_->SetPosition(RM_GROUP_LIST_MARGIN, RM_GROUP_LIST_TOP,
123+ screenW - RM_GROUP_LIST_MARGIN * 2,
124+ screenH - headHeight - RM_GROUP_LIST_TOP * 2);
125+ caseList_->SetThrowDrag(true);
126+ caseList_->SetReboundSize(50);
127+ caseList_->SetYScrollBarVisible(true);
128+ caseList_->SetAdapter(adapter_);
129+ 
130+ backToListBtn_ = GraphicCreateView<UILabelButton>(content);
131+ if (backToListBtn_ == nullptr) {
132+ printf("[RmTestSlice] create back button failed\n");
133+ GraphicDeleteViewTree(caseList_);
134+ caseList_ = nullptr;
135+ delete adapter_;
136+ adapter_ = nullptr;
137+ return;
138+ }
139+ backToListBtn_->SetPosition(screenW - BACK_BTN_W - BACK_BTN_RIGHT_MARGIN, BACK_BTN_TOP,
140+ BACK_BTN_W, BACK_BTN_H);
141+ backToListBtn_->SetText("返回列表");
142+ backToListBtn_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BACK_BTN_FONT_SIZE);
143+ backToListBtn_->SetStyleForState(STYLE_BORDER_RADIUS, 12, UIButton::RELEASED);
144+ backToListBtn_->SetStyleForState(STYLE_BORDER_RADIUS, 12, UIButton::PRESSED);
145+ backToListBtn_->SetStyleForState(STYLE_BORDER_RADIUS, 12, UIButton::INACTIVE);
146+ backToListBtn_->SetStyleForState(STYLE_BACKGROUND_COLOR, RM_BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::RELEASED);
147+ backToListBtn_->SetStyleForState(STYLE_BACKGROUND_COLOR, RM_BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::PRESSED);
148+ backToListBtn_->SetStyleForState(STYLE_BACKGROUND_COLOR, RM_BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::INACTIVE);
149+ backToListBtn_->SetVisible(false);
150+ backListener_ = new (std::nothrow) RmClickListener([this](UIView& view, const ClickEvent& event) -> bool {
151+ (void)view;
152+ (void)event;
153+ BackToList();
154+ return true;
155+ });
156+ if (backListener_ == nullptr) {
157+ printf("[RmTestSlice] create back listener failed\n");
158+ backToListBtn_->SetOnClickListener(nullptr);
159+ GraphicDeleteViewTree(caseList_);
160+ caseList_ = nullptr;
161+ backToListBtn_->SetOnClickListener(nullptr);
162+ GraphicDeleteViewTree(backToListBtn_);
163+ backToListBtn_ = nullptr;
164+ delete adapter_;
165+ adapter_ = nullptr;
166+ return;
167+ }
168+ backToListBtn_->SetOnClickListener(backListener_);
169+}
170+ 
171+template<typename RunnerType, typename CaseType, const CaseType* Cases, const uint32_t& CaseCount>
172+void RmTestSliceBase<RunnerType, CaseType, Cases, CaseCount>::EnterCase(uint32_t index)
173+{
174+ if ((caseList_ == nullptr) || (runner_ != nullptr) || (index >= CaseCount) || (content_ == nullptr)) {
175+ return;
176+ }
177+ caseList_->SetVisible(false);
178+ runner_ = new (std::nothrow) RunnerType(&Cases[index]);
179+ if (runner_ == nullptr) {
180+ printf("[RmTestSlice] create runner failed\n");
181+ caseList_->SetVisible(true);
182+ return;
183+ }
184+ runner_->Build(content_);
185+ backToListBtn_->SetVisible(true);
186+ content_->Invalidate();
187+}
188+ 
189+template<typename RunnerType, typename CaseType, const CaseType* Cases, const uint32_t& CaseCount>
190+void RmTestSliceBase<RunnerType, CaseType, Cases, CaseCount>::BackToList()
191+{
192+ if ((runner_ == nullptr) || (caseList_ == nullptr) || (content_ == nullptr)) {
193+ return;
194+ }
195+ delete runner_;
196+ runner_ = nullptr;
197+ backToListBtn_->SetVisible(false);
198+ caseList_->SetVisible(true);
199+ content_->Invalidate();
200+}
201+ 
202+} // namespace OHOS
203+#endif // RM_TEST_SLICE_BASE_H
@@ -0,0 +1,249 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#include "rm_test_utils.h"
17+#include <cstdio>
18+#include <new>
19+#include "common/screen.h"
20+#include "graphic_utils.h"
21+ 
22+namespace OHOS {
23+ 
24+// RmClickListener
25+RmClickListener::RmClickListener(std::function<bool(UIView&, const ClickEvent&)> fn) : fn_(std::move(fn)) {}
26+ 
27+RmClickListener::~RmClickListener() {}
28+ 
29+bool RmClickListener::OnClick(UIView& view, const ClickEvent& event)
30+{
31+ return fn_(view, event);
32+}
33+ 
34+// RmStressDriver
35+RmStressDriver::RmStressDriver() : animator_(this, this, STEP_PERIOD_MS, true) {}
36+ 
37+RmStressDriver::~RmStressDriver()
38+{
39+ animator_.Stop();
40+}
41+ 
42+void RmStressDriver::SetStepHandler(const std::function<void(uint32_t iter)>& handler)
43+{
44+ handler_ = handler;
45+}
46+ 
47+void RmStressDriver::Start()
48+{
49+ iter_ = 0;
50+ animator_.Start();
51+}
52+ 
53+void RmStressDriver::Stop()
54+{
55+ animator_.Stop();
56+}
57+ 
58+bool RmStressDriver::IsRunning() const
59+{
60+ return animator_.GetState() == Animator::START;
61+}
62+ 
63+void RmStressDriver::Callback(UIView* view)
64+{
65+ (void)view;
66+ if (handler_ != nullptr) {
67+ handler_(iter_++);
68+ }
69+}
70+ 
71+// RmCaseListAdapter
72+RmCaseListAdapter::ItemClickListener::ItemClickListener(std::function<void(uint32_t)> cb, uint32_t index)
73+ : cb_(std::move(cb)), index_(index)
74+{
75+}
76+ 
77+RmCaseListAdapter::ItemClickListener::~ItemClickListener() {}
78+ 
79+bool RmCaseListAdapter::ItemClickListener::OnClick(UIView& view, const ClickEvent& event)
80+{
81+ (void)view;
82+ (void)event;
83+ if (cb_ != nullptr) {
84+ cb_(index_);
85+ }
86+ return true;
87+}
88+ 
89+namespace {
90+constexpr int16_t GROUP_LIST_MARGIN = RM_GROUP_LIST_MARGIN;
91+constexpr int16_t GROUP_LIST_TOP = RM_GROUP_LIST_TOP;
92+constexpr uint16_t ITEM_HEIGHT = RM_ITEM_HEIGHT;
93+constexpr uint16_t ITEM_BORDER = RM_ITEM_BORDER;
94+constexpr uint16_t ITEM_RADIUS = RM_ITEM_RADIUS;
95+constexpr int16_t ITEM_TEXT_X = RM_ITEM_TEXT_X;
96+constexpr uint16_t ITEM_FONT_SIZE = RM_ITEM_FONT_SIZE;
97+} // namespace
98+ 
99+RmCaseListAdapter::RmCaseListAdapter(uint32_t count, TitleProvider provider,
100+ std::function<void(uint32_t index)> onClick)
101+ : count_(count), provider_(std::move(provider)), onClick_(std::move(onClick)), titles_(nullptr),
102+ listeners_(nullptr), views_(nullptr)
103+{
104+ if (count_ == 0) {
105+ return;
106+ }
107+ 
108+ titles_ = new (std::nothrow) char*[count_];
109+ if (titles_ == nullptr) {
110+ count_ = 0;
111+ return;
112+ }
113+ for (uint32_t i = 0; i < count_; i++) {
114+ titles_[i] = nullptr;
115+ }
116+ 
117+ listeners_ = new (std::nothrow) ItemClickListener*[count_];
118+ if (listeners_ == nullptr) {
119+ count_ = 0;
120+ return;
121+ }
122+ for (uint32_t i = 0; i < count_; i++) {
123+ listeners_[i] = nullptr;
124+ }
125+ 
126+ views_ = new (std::nothrow) UIView*[count_];
127+ if (views_ == nullptr) {
128+ count_ = 0;
129+ return;
130+ }
131+ for (uint32_t i = 0; i < count_; i++) {
132+ views_[i] = nullptr;
133+ }
134+ 
135+ for (uint32_t i = 0; i < count_; i++) {
136+ titles_[i] = new (std::nothrow) char[TITLE_BUF_SIZE];
137+ if (titles_[i] != nullptr) {
138+ provider_(i, titles_[i], TITLE_BUF_SIZE);
139+ }
140+ listeners_[i] = new (std::nothrow) ItemClickListener(onClick_, i);
141+ }
142+}
143+ 
144+RmCaseListAdapter::~RmCaseListAdapter()
145+{
146+ if (views_ != nullptr) {
147+ for (uint32_t i = 0; i < count_; i++) {
148+ if (views_[i] != nullptr) {
149+ views_[i]->SetOnClickListener(nullptr);
150+ }
151+ }
152+ }
153+ if (listeners_ != nullptr) {
154+ for (uint32_t i = 0; i < count_; i++) {
155+ delete listeners_[i];
156+ listeners_[i] = nullptr;
157+ }
158+ delete[] listeners_;
159+ listeners_ = nullptr;
160+ }
161+ if (views_ != nullptr) {
162+ delete[] views_;
163+ views_ = nullptr;
164+ }
165+ if (titles_ != nullptr) {
166+ for (uint32_t i = 0; i < count_; i++) {
167+ delete[] titles_[i];
168+ titles_[i] = nullptr;
169+ }
170+ delete[] titles_;
171+ titles_ = nullptr;
172+ }
173+}
174+ 
175+uint16_t RmCaseListAdapter::GetCount()
176+{
177+ return static_cast<uint16_t>(count_);
178+}
179+ 
180+UIView* RmCaseListAdapter::GetView(UIView* inView, int16_t index)
181+{
182+ if ((index < 0) || (index >= static_cast<int16_t>(count_))) {
183+ return nullptr;
184+ }
185+ UILabelButton* item = nullptr;
186+ if (inView == nullptr) {
187+ item = new (std::nothrow) UILabelButton();
188+ if (item == nullptr) {
189+ return nullptr;
190+ }
191+ item->SetPosition(0, 0);
192+ item->SetStyleForState(STYLE_BORDER_WIDTH, ITEM_BORDER, UIButton::RELEASED);
193+ item->SetStyleForState(STYLE_BORDER_WIDTH, ITEM_BORDER, UIButton::PRESSED);
194+ item->SetStyleForState(STYLE_BORDER_WIDTH, ITEM_BORDER, UIButton::INACTIVE);
195+ item->SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::RELEASED);
196+ item->SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::PRESSED);
197+ item->SetStyleForState(STYLE_BORDER_OPA, 0, UIButton::INACTIVE);
198+ item->Resize(Screen::GetInstance().GetWidth() - GROUP_LIST_MARGIN * 2 - ITEM_BORDER * 2, ITEM_HEIGHT);
199+ } else {
200+ item = static_cast<UILabelButton*>(inView);
201+ // 视图被回收时,先清除旧 listener 的绑定,避免旧条目上的 listener 悬空
202+ if (views_ != nullptr) {
203+ for (uint32_t i = 0; i < count_; i++) {
204+ if (views_[i] == item) {
205+ views_[i] = nullptr;
206+ break;
207+ }
208+ }
209+ }
210+ }
211+ 
212+ if (listeners_[index] != nullptr) {
213+ item->SetOnClickListener(listeners_[index]);
214+ }
215+ if (titles_[index] != nullptr) {
216+ item->SetText(titles_[index]);
217+ item->SetViewId(titles_[index]);
218+ }
219+ item->SetFont(DEFAULT_VECTOR_FONT_FILENAME, ITEM_FONT_SIZE);
220+ item->SetViewIndex(index);
221+ item->SetAlign(TEXT_ALIGNMENT_LEFT);
222+ item->SetLabelPosition(ITEM_TEXT_X, 0);
223+ item->SetImageSrc(GRAPHIC_IMAGE_FORWARD, GRAPHIC_IMAGE_FORWARD);
224+ item->SetImagePosition(item->GetWidth() - RM_TEXT_DISTANCE_TO_LEFT_SIDE, ITEM_HEIGHT / 2 - 18);
225+ item->SetStyleForState(STYLE_BORDER_RADIUS, ITEM_RADIUS, UIButton::RELEASED);
226+ item->SetStyleForState(STYLE_BORDER_RADIUS, ITEM_RADIUS, UIButton::PRESSED);
227+ item->SetStyleForState(STYLE_BORDER_RADIUS, ITEM_RADIUS, UIButton::INACTIVE);
228+ item->SetStyleForState(STYLE_BACKGROUND_COLOR, RM_BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::RELEASED);
229+ item->SetStyleForState(STYLE_BACKGROUND_COLOR, RM_BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::PRESSED);
230+ item->SetStyleForState(STYLE_BACKGROUND_COLOR, RM_BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::INACTIVE);
231+ if (views_ != nullptr) {
232+ views_[index] = item;
233+ }
234+ return item;
235+}
236+ 
237+int16_t RmCaseListAdapter::GetItemWidthWithMargin(int16_t index)
238+{
239+ (void)index;
240+ return Screen::GetInstance().GetWidth() - GROUP_LIST_MARGIN * 2;
241+}
242+ 
243+int16_t RmCaseListAdapter::GetItemHeightWithMargin(int16_t index)
244+{
245+ (void)index;
246+ return ITEM_HEIGHT + ITEM_BORDER * 2;
247+}
248+ 
249+} // namespace OHOS
@@ -0,0 +1,133 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#ifndef RM_TEST_UTILS_H
17+#define RM_TEST_UTILS_H
18+ 
19+#include <functional>
20+#include "components/ui_label_button.h"
21+#include "components/ui_list.h"
22+#include "components/abstract_adapter.h"
23+#include "animator/animator.h"
24+ 
25+namespace OHOS {
26+ 
27+/**
28+ * @brief 从 ui_test.h 抽取的 RM 验收页面通用常量。
29+ */
30+constexpr uint16_t RM_TITLE_LABEL_DEFAULT_HEIGHT = 29;
31+constexpr uint16_t RM_FONT_DEFAULT_SIZE = 20;
32+constexpr uint16_t RM_VIEW_DISTANCE_TO_LEFT_SIDE = 48;
33+constexpr uint16_t RM_VIEW_DISTANCE_TO_TOP_SIDE = 48;
34+constexpr uint16_t RM_VIEW_DISTANCE_TO_LEFT_SIDE2 = 24;
35+constexpr uint16_t RM_TEXT_DISTANCE_TO_LEFT_SIDE = 48;
36+constexpr uint16_t RM_TEXT_DISTANCE_TO_TOP_SIDE = 11;
37+constexpr uint16_t RM_HALF_OPA_OPAQUE = OPA_OPAQUE / 2;
38+constexpr uint16_t RM_VIEW_STYLE_BORDER_WIDTH = 2;
39+constexpr uint16_t RM_VIEW_STYLE_BORDER_RADIUS = 8;
40+constexpr uint16_t RM_BUTTON_LABEL_SIZE = 16;
41+constexpr uint8_t RM_BUTTON_STYLE_BORDER_RADIUS_VALUE = 20;
42+constexpr uint32_t RM_BUTTON_STYLE_BACKGROUND_COLOR_VALUE = 0xFF333333;
43+constexpr uint32_t RM_BUTTON_STYLE_BACKGROUND_COLOR_PRESS = 0xFF2D2D2D;
44+constexpr int16_t RM_BACK_BUTTON_HEIGHT = 64;
45+ 
46+// 共享的用例列表布局常量
47+constexpr int16_t RM_GROUP_LIST_MARGIN = 24;
48+constexpr int16_t RM_GROUP_LIST_TOP = 8;
49+constexpr uint16_t RM_ITEM_HEIGHT = 64;
50+constexpr uint16_t RM_ITEM_BORDER = 4;
51+constexpr uint16_t RM_ITEM_RADIUS = 12;
52+constexpr int16_t RM_ITEM_TEXT_X = 24;
53+constexpr uint16_t RM_ITEM_FONT_SIZE = 24;
54+ 
55+/**
56+ * @brief 将 std::function 包装为 UIView::OnClickListener。
57+ */
58+class RmClickListener : public UIView::OnClickListener {
59+public:
60+ explicit RmClickListener(std::function<bool(UIView&, const ClickEvent&)> fn);
61+ ~RmClickListener() override;
62+ bool OnClick(UIView& view, const ClickEvent& event) override;
63+ 
64+private:
65+ std::function<bool(UIView&, const ClickEvent&)> fn_;
66+};
67+ 
68+/**
69+ * @brief RM 验收压测驱动:挂在内容容器内的不可见 UIView,用 repeat Animator 每 16ms 推进一次压测步。
70+ *
71+ * 压测逻辑通过 SetStepHandler 注入;驱动随 DeleteChildren 一并析构,析构中停止 Animator,
72+ * 避免 AnimatorManager 残留。
73+ */
74+class RmStressDriver : public UIView, public AnimatorCallback {
75+public:
76+ static constexpr uint32_t STEP_PERIOD_MS = 16;
77+ 
78+ RmStressDriver();
79+ ~RmStressDriver() override;
80+ 
81+ void SetStepHandler(const std::function<void(uint32_t iter)>& handler);
82+ void Start();
83+ void Stop();
84+ bool IsRunning() const;
85+ 
86+ void Callback(UIView* view) override;
87+ void OnStop(UIView& view) override {}
88+ 
89+private:
90+ Animator animator_;
91+ std::function<void(uint32_t iter)> handler_;
92+ uint32_t iter_ = 0;
93+};
94+ 
95+/**
96+ * @brief UIList 用例列表适配器:一行一个用例(id + name),点击回调进入对应用例。
97+ */
98+class RmCaseListAdapter : public AbstractAdapter {
99+public:
100+ using TitleProvider = std::function<void(uint32_t index, char* buf, uint32_t bufSize)>;
101+ 
102+ RmCaseListAdapter(uint32_t count, TitleProvider provider, std::function<void(uint32_t index)> onClick);
103+ ~RmCaseListAdapter() override;
104+ 
105+ uint16_t GetCount() override;
106+ UIView* GetView(UIView* inView, int16_t index) override;
107+ int16_t GetItemWidthWithMargin(int16_t index) override;
108+ int16_t GetItemHeightWithMargin(int16_t index) override;
109+ 
110+private:
111+ class ItemClickListener : public UIView::OnClickListener {
112+ public:
113+ ItemClickListener(std::function<void(uint32_t)> cb, uint32_t index);
114+ ~ItemClickListener() override;
115+ bool OnClick(UIView& view, const ClickEvent& event) override;
116+ 
117+ private:
118+ std::function<void(uint32_t)> cb_;
119+ uint32_t index_;
120+ };
121+ 
122+ static constexpr uint32_t TITLE_BUF_SIZE = 96;
123+ 
124+ uint32_t count_;
125+ TitleProvider provider_;
126+ std::function<void(uint32_t index)> onClick_;
127+ char** titles_;
128+ ItemClickListener** listeners_;
129+ UIView** views_;
130+};
131+ 
132+} // namespace OHOS
133+#endif // RM_TEST_UTILS_H
@@ -0,0 +1,163 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#ifndef SCROLLER_RM_CASE_VIEW_H
17+#define SCROLLER_RM_CASE_VIEW_H
18+ 
19+#include "components/ui_label.h"
20+#include "components/ui_label_button.h"
21+#include "components/ui_scroll_view.h"
22+#include "components/ui_view_group.h"
23+#include "components/ui_arc_scroll_bar.h"
24+#include "graphic_config.h"
25+#include "rm_test_utils.h"
26+ 
27+namespace OHOS {
28+#if GRAPHIC_ENABLE_SCROLL_FLAG
29+ 
30+enum ScrollerRmCaseType : uint8_t {
31+ SC_CASE_DEMO,
32+ SC_CASE_RESET,
33+ SC_CASE_LATE_VISIBLE,
34+ SC_CASE_UPDATE,
35+ SC_CASE_PLACEHOLDER,
36+ SC_CASE_MANY_ITEMS,
37+ SC_CASE_STRESS_UPDATE,
38+ SC_CASE_STRESS_SCROLL,
39+ SC_CASE_XY_SCROLL,
40+};
41+ 
42+struct ScrollerRmCase {
43+ const char* id;
44+ const char* name;
45+ const char* expect;
46+ ScrollerRmCaseType type;
47+ bool wholeStyle;
48+ bool setWidth;
49+ uint16_t width;
50+ bool setColor;
51+ uint32_t colorRgb;
52+ bool setRadius;
53+ uint16_t radius;
54+ bool setMinLen;
55+ uint16_t minLen;
56+ bool setOpa;
57+ uint8_t opacity;
58+ bool longContent;
59+ bool smallViewport;
60+ bool hScroll;
61+};
62+ 
63+extern const ScrollerRmCase g_scrollerRmCases[];
64+extern const uint32_t g_scrollerRmCaseNum;
65+ 
66+/**
67+ * @brief 测试用 UIScrollView:暴露 GetAllChildRelativeRect 给 ArcScrollBarHostView 使用。
68+ */
69+class TestUIScrollView : public UIScrollView {
70+public:
71+ Rect GetAllChildRelativeRect() const
72+ {
73+ return UIViewGroup::GetAllChildRelativeRect();
74+ }
75+};
76+ 
77+/**
78+ * @brief 老代码路径对照用 UIArcScrollBar:把受保护的轨道线宽暴露给测试侧。
79+ */
80+class LegacyTrackArcScrollBar : public UIArcScrollBar {
81+public:
82+ void SetTrackLineWidth(int16_t width)
83+ {
84+ backgroundStyle_->lineWidth_ = width;
85+ }
86+};
87+ 
88+/**
89+ * @brief 矩形屏下承载 UIArcScrollBar 的宿主视图,并同步目标 UIScrollView 的滚动位置。
90+ */
91+class ArcScrollBarHostView : public UIView, public AnimatorCallback {
92+public:
93+ ArcScrollBarHostView();
94+ ~ArcScrollBarHostView() override;
95+ 
96+ void InitArcScrollBar();
97+ void InitArcScrollBarLegacy();
98+ UIArcScrollBar* GetArcBar() const;
99+ void BindScrollView(TestUIScrollView* scroll);
100+ 
101+ void Callback(UIView* view) override;
102+ 
103+protected:
104+ void OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea) override;
105+ 
106+private:
107+ UIArcScrollBar* arcBar_;
108+ TestUIScrollView* targetScroll_;
109+ Animator animator_;
110+};
111+ 
112+/**
113+ * @brief Scroller RM 单个用例的视图构建与清理器。
114+ */
115+class ScrollerRmCaseRunner {
116+public:
117+ explicit ScrollerRmCaseRunner(const ScrollerRmCase* testCase);
118+ ~ScrollerRmCaseRunner();
119+ 
120+ UIViewGroup* Build(UIViewGroup* content);
121+ 
122+private:
123+ static constexpr uint32_t READBACK_LINES = 2;
124+ static constexpr uint32_t CFG_LINES = 2;
125+ 
126+ UIScrollView* CreateDemoScroll();
127+ void CreateCompareScroll();
128+ void CreateConfigLabels();
129+ void CreateReadbackLabels();
130+ void RefreshReadback();
131+ void ApplyCaseStyle(UIScrollView* scroll);
132+ void SetStatusText(const char* text);
133+ void AddClickListener(UIView* view, std::function<bool(UIView&, const ClickEvent&)> fn);
134+ 
135+ void ShowCase();
136+ void ShowResetCase();
137+ void ShowLateVisibleCase();
138+ void ShowUpdateCase();
139+ void ShowPlaceholderCase();
140+ void ShowStressUpdateCase();
141+ void ShowStressScrollCase();
142+ 
143+ static constexpr uint8_t MAX_LISTENERS = 8;
144+ 
145+ const ScrollerRmCase* case_;
146+ UIViewGroup* container_;
147+ UIScrollView* demoScroll_;
148+ UILabel* cfgLabels_[CFG_LINES];
149+ UILabel* readbackLabels_[READBACK_LINES];
150+ UILabel* statusLabel_;
151+ uint32_t updateCount_;
152+ 
153+ struct ListenerEntry {
154+ UIView* view;
155+ RmClickListener* listener;
156+ };
157+ ListenerEntry listeners_[MAX_LISTENERS];
158+ uint8_t listenerCount_;
159+};
160+ 
161+#endif // GRAPHIC_ENABLE_SCROLL_FLAG
162+} // namespace OHOS
163+#endif // SCROLLER_RM_CASE_VIEW_H
@@ -0,0 +1,25 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#include "scroller_rm_test_slice.h"
17+ 
18+#if GRAPHIC_ENABLE_SCROLL_FLAG
19+namespace OHOS {
20+REGISTER_AS(ScrollerRmTestSlice)
21+ 
22+ScrollerRmTestSlice::ScrollerRmTestSlice() : RmTestSliceBase("Scroller RM验收") {}
23+ 
24+} // namespace OHOS
25+#endif // GRAPHIC_ENABLE_SCROLL_FLAG
@@ -0,0 +1,31 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#ifndef SCROLLER_RM_TEST_SLICE_H
17+#define SCROLLER_RM_TEST_SLICE_H
18+ 
19+#include "rm_test_slice_base.h"
20+#include "scroller_rm_case_view.h"
21+ 
22+#if GRAPHIC_ENABLE_SCROLL_FLAG
23+namespace OHOS {
24+class ScrollerRmTestSlice : public RmTestSliceBase<ScrollerRmCaseRunner, ScrollerRmCase,
25+ g_scrollerRmCases, g_scrollerRmCaseNum> {
26+public:
27+ ScrollerRmTestSlice();
28+};
29+} // namespace OHOS
30+#endif // GRAPHIC_ENABLE_SCROLL_FLAG
31+#endif // SCROLLER_RM_TEST_SLICE_H
@@ -0,0 +1,589 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#include "slider_rm_case_view.h"
17+ 
18+#if GRAPHIC_ENABLE_SLIDER_FLAG
19+#include <cstdio>
20+#include <cstdlib>
21+#include <new>
22+#include "components/ui_edit_text.h"
23+#include "events/click_event.h"
24+#include "graphic_utils.h"
25+ 
26+namespace OHOS {
27+ 
28+namespace {
29+const int32_t g_valsEven[] = { 0, 20, 40, 60, 80, 100 };
30+constexpr uint16_t g_valsEvenNum = 6;
31+const int32_t g_valsMessy[] = { 60, 20, 20, -10, 120, 100, 0 };
32+constexpr uint16_t g_valsMessyNum = 7;
33+const int32_t g_valsDense[] = { 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50,
34+ 55, 60, 65, 70, 75, 80, 85, 90, 95, 100 };
35+constexpr uint16_t g_valsDenseNum = 21;
36+const int32_t g_valsOverMax[] = { 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30,
37+ 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63,
38+ 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96 };
39+constexpr uint16_t g_valsOverMaxNum = 33;
40+ 
41+struct SliderColorScheme {
42+ ColorType background;
43+ ColorType foreground;
44+ ColorType knob;
45+};
46+const SliderColorScheme g_colorSchemes[] = {
47+ { Color::GetColorFromRGB(0x2E, 0x5A, 0x2E), Color::GetColorFromRGB(0x00, 0x7A, 0xFF),
48+ Color::GetColorFromRGB(0xFF, 0xA0, 0x00) },
49+ { Color::GetColorFromRGB(0x50, 0x30, 0x30), Color::GetColorFromRGB(0xD8, 0x30, 0x60),
50+ Color::GetColorFromRGB(0x30, 0xD8, 0xC0) },
51+};
52+constexpr uint32_t g_colorSchemeNum = sizeof(g_colorSchemes) / sizeof(g_colorSchemes[0]);
53+ 
54+struct SliderGradient {
55+ const ColorType* bg;
56+ uint16_t bgCount;
57+ const ColorType* onTint;
58+ uint16_t onTintCount;
59+};
60+const ColorType g_gradBg0[] = { Color::GetColorFromRGB(0x30, 0x30, 0x30),
61+ Color::GetColorFromRGB(0x90, 0x90, 0x90) };
62+const ColorType g_gradFg0[] = { Color::GetColorFromRGB(0x00, 0x7A, 0xFF),
63+ Color::GetColorFromRGB(0x00, 0xD8, 0x60),
64+ Color::GetColorFromRGB(0xFF, 0xD0, 0x00) };
65+const SliderGradient g_gradients[] = {
66+ { g_gradBg0, 2, g_gradFg0, 3 },
67+};
68+ 
69+constexpr int16_t CONT_X = 100;
70+constexpr int16_t CONT_Y = 0;
71+constexpr int16_t CONT_W = 760;
72+constexpr int16_t CONT_H = 400;
73+constexpr uint8_t CONT_RADIUS = 16;
74+ 
75+constexpr int16_t INFO_X = 24;
76+constexpr int16_t INFO_W = 712;
77+constexpr uint8_t INFO_SIZE = 22;
78+constexpr uint8_t HINT_SIZE = 20;
79+constexpr int16_t HINT_X = 24;
80+constexpr int16_t HINT_W = 712;
81+constexpr int16_t HINT_H = 44;
82+ 
83+constexpr int16_t TITLE_X = 24;
84+constexpr int16_t TITLE_Y = 4;
85+constexpr int16_t TITLE_W = 712;
86+constexpr uint8_t TITLE_H = 26;
87+constexpr uint8_t TITLE_FONT = 20;
88+ 
89+constexpr int16_t SL_H_W = 600;
90+constexpr int16_t SL_H_H = 92;
91+constexpr int16_t SL_H_Y = 64;
92+constexpr int16_t SL_MARK_TEXT_H = 132;
93+constexpr int16_t SL_EXTEND_H = 180;
94+constexpr int16_t SL_TRACK_H = 92;
95+constexpr int16_t SL_V_W = 60;
96+constexpr int16_t SL_V_H = 210;
97+constexpr int16_t SL_V_Y = 42;
98+constexpr int16_t SL_VAL_Y = 168;
99+constexpr int16_t SL_INPUT_Y = 205;
100+constexpr int16_t SL_CFG_Y = 258;
@@ -0,0 +1,104 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#ifndef SLIDER_RM_CASE_VIEW_H
17+#define SLIDER_RM_CASE_VIEW_H
18+ 
19+#include "components/ui_label.h"
20+#include "components/ui_label_button.h"
21+#include "components/ui_slider.h"
22+#include "components/ui_view_group.h"
23+#include "graphic_config.h"
24+#include "rm_test_utils.h"
25+ 
26+namespace OHOS {
27+#if GRAPHIC_ENABLE_SLIDER_FLAG
28+ 
29+class SliderRmValueListener;
30+ 
31+/**
32+ * @brief RM013/014/015 Slider 单个验收用例的配置。
33+ *
34+ * 字段与 PR1230 实际 API 一一对应:
35+ * - 刻度:EnableMarkings / SetMarkingsType(LINE|DOT) / SetMarkingsSize
36+ * - 刻度文本:EnableMarkText
37+ * - 吸附:EnableTicks(或设置 values)
38+ * - 自定义刻度值:SetValues
39+ * - 扩展点击:SetExpandClickArea;disabled:SetDisabled + SetDisabledToastMsg
40+ * - 值 Toast:EnableToast;渐变:SetBgGradientColors / SetOnTintGradientColors
41+ */
42+struct SliderRmCase {
43+ const char* id;
44+ const char* name;
45+ const char* expect;
46+ int32_t rangeMin;
47+ int32_t rangeMax;
48+ uint32_t step;
49+ int32_t initValue;
50+ uint8_t direction;
51+ bool enableMarkings;
52+ uint8_t markingsType;
53+ int16_t markingsSize;
54+ bool enableMarkText;
55+ bool enableTicks;
56+ const int32_t* values;
57+ uint16_t valuesCount;
58+ bool expandClickArea;
59+ bool disabled;
60+ const char* disabledToastMsg;
61+ bool enableToast;
62+ int8_t colorScheme;
63+ int8_t gradientScheme;
64+ uint8_t loopAction;
65+};
66+ 
67+extern const SliderRmCase g_sliderRmCases[];
68+extern const uint32_t g_sliderRmCaseNum;
69+ 
70+/**
71+ * @brief Slider RM 单个用例的视图构建与清理器。
72+ *
73+ * Build() 在 content 内部创建并返回用例容器;析构时先剥离监听器再删除容器子树。
74+ */
75+class SliderRmCaseRunner {
76+public:
77+ explicit SliderRmCaseRunner(const SliderRmCase* testCase);
78+ ~SliderRmCaseRunner();
79+ 
80+ UIViewGroup* Build(UIViewGroup* content);
81+ 
82+private:
83+ void ResetState();
84+ void ShowCase(const SliderRmCase& testCase);
85+ void AddClickListener(UIView* view, std::function<bool(UIView&, const ClickEvent&)> fn);
86+ 
87+ struct ListenerEntry {
88+ UIView* view;
89+ RmClickListener* listener;
90+ };
91+ static constexpr uint8_t MAX_LISTENERS = 8;
92+ 
93+ const SliderRmCase* case_;
94+ UIViewGroup* container_;
95+ UISlider* slider_;
96+ UILabel* valueLabel_;
97+ SliderRmValueListener* valueListener_;
98+ ListenerEntry listeners_[MAX_LISTENERS];
99+ uint8_t listenerCount_;
100+};
101+ 
102+#endif // GRAPHIC_ENABLE_SLIDER_FLAG
103+} // namespace OHOS
104+#endif // SLIDER_RM_CASE_VIEW_H
@@ -0,0 +1,25 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#include "slider_rm_test_slice.h"
17+ 
18+#if GRAPHIC_ENABLE_SLIDER_FLAG
19+namespace OHOS {
20+REGISTER_AS(SliderRmTestSlice)
21+ 
22+SliderRmTestSlice::SliderRmTestSlice() : RmTestSliceBase("Slider RM验收") {}
23+ 
24+} // namespace OHOS
25+#endif // GRAPHIC_ENABLE_SLIDER_FLAG
@@ -0,0 +1,31 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#ifndef SLIDER_RM_TEST_SLICE_H
17+#define SLIDER_RM_TEST_SLICE_H
18+ 
19+#include "rm_test_slice_base.h"
20+#include "slider_rm_case_view.h"
21+ 
22+#if GRAPHIC_ENABLE_SLIDER_FLAG
23+namespace OHOS {
24+class SliderRmTestSlice : public RmTestSliceBase<SliderRmCaseRunner, SliderRmCase,
25+ g_sliderRmCases, g_sliderRmCaseNum> {
26+public:
27+ SliderRmTestSlice();
28+};
29+} // namespace OHOS
30+#endif // GRAPHIC_ENABLE_SLIDER_FLAG
31+#endif // SLIDER_RM_TEST_SLICE_H
@@ -0,0 +1,693 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#include "switch_rm_case_view.h"
17+ 
18+#if GRAPHIC_ENABLE_SWITCH_FLAG
19+#include <cstdio>
20+#include <new>
21+#include "components/ui_view_group.h"
22+#include "events/click_event.h"
23+#include "graphic_utils.h"
24+ 
25+namespace OHOS {
26+ 
27+const SwitchRmCase g_switchRmCases[] = {
28+ { "SW-001", "默认创建与状态切换", "不调新增API: 默认轨道/滑块/边框显示不变,状态切换正常",
29+ SWITCH_CASE_DEMO, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false },
30+ { "SW-002", "on/off滑块尺寸独立配置", "SELECTED用on=10,UNSELECTED用off=8,两态互不覆盖",
31+ SWITCH_CASE_DEMO, true, 10, true, 8, false, 0, false, 0, false, 0, false, 0, false },
32+ { "SW-003", "on/off滑块颜色独立配置", "选中态滑块白,非选中态灰,随状态切换",
33+ SWITCH_CASE_DEMO, false, 0, false, 0, true, 0xFFFFFF, true, 0x808080, false, 0, false, 0, false },
34+ { "SW-004", "on/off边框颜色配置", "选中态绿边框,非选中态红边框(宽1px恒不透明,代码无独立alpha)",
35+ SWITCH_CASE_DEMO, false, 0, false, 0, false, 0, false, 0, true, 0x00FF00, true, 0xFF0000, false },
36+ { "SW-005", "getter返回配置值", "6项getter逐项与setter入参比对,应全部一致",
37+ SWITCH_CASE_VERIFY_GETTER, true, 10, true, 8, true, 0xFFFFFF, true, 0x808080,
38+ true, 0x00FF00, true, 0xFF0000, false },
39+ { "SW-006", "尺寸+颜色+边框组合配置", "初始ON: 尺寸/滑块色/边框均按当前状态生效,组合无冲突",
40+ SWITCH_CASE_DEMO, true, 12, true, 8, true, 0xFFD700, true, 0x00C8C8,
41+ true, 0x00FF00, true, 0xFF0000, true },
42+ { "SW-007", "thumb size为0", "size=0 setter直接保存,绘制阶段回默认半径;读回0",
43+ SWITCH_CASE_DEMO, true, 0, true, 12, false, 0, false, 0, false, 0, false, 0, false },
44+ { "SW-008", "thumb size超轨道圆角999", "999 setter直接保存,绘制阶段回默认半径;读回999",
45+ SWITCH_CASE_DEMO, true, 999, true, 10, false, 0, false, 0, false, 0, false, 0, false },
46+ { "SW-009", "半径<=1时边框不绘制", "drawRadius<=边框宽1px: 不画边框,仅1px实心滑块(黑边框便于辨别)",
47+ SWITCH_CASE_DEMO, true, 1, false, 0, false, 0, false, 0, true, 0x000000, false, 0, true },
48+ { "SW-010", "未配置thumb color", "只配边框: 滑块保持默认白色,边框配置仍生效",
49+ SWITCH_CASE_DEMO, false, 0, false, 0, false, 0, false, 0, true, 0x00FF00, true, 0xFF0000, false },
50+ { "SW-011", "未配置border color", "只配滑块色: 不绘制边框,滑块色按配置生效",
51+ SWITCH_CASE_DEMO, false, 0, false, 0, true, 0xFFFFFF, true, 0x808080, false, 0, false, 0, false },
52+ { "SW-012", "高频状态切换x200", "自动切换ON/OFF 200次: 回调数与切换一致,无异常日志",
53+ SWITCH_CASE_STRESS_TOGGLE, true, 12, true, 8, true, 0xFFD700, true, 0x00C8C8,
54+ true, 0x00FF00, true, 0xFF0000, false },
55+ { "SW-013", "90个Switch批量配置", " 90个各配不同尺寸/滑块色,逐项读回防串扰",
56+ SWITCH_CASE_MANY, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false },
57+ { "SW-014", "长稳循环切换校验", "自动循环切换200轮: 每轮校验GetState一致,无残留",
58+ SWITCH_CASE_STRESS_STATE, true, 12, true, 8, true, 0xFFD700, true, 0x00C8C8,
59+ true, 0x00FF00, true, 0xFF0000, false },
60+ { "SW-015", "运行时反复覆盖配置", "自动循环覆盖6项配置1000轮: 每轮读回=末次配置,设置/读回同屏对照",
61+ SWITCH_CASE_STRESS_CONFIG, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false },
62+};
63+const uint32_t g_switchRmCaseNum = sizeof(g_switchRmCases) / sizeof(g_switchRmCases[0]);
64+ 
65+namespace {
66+constexpr uint32_t STRESS_TARGET = 1000;
67+constexpr uint32_t STRESS_TOGGLE_TARGET = 200;
68+constexpr uint32_t MANY_GRID_SLOTS = 100;
69+ 
70+constexpr int16_t CONT_X = 100;
71+constexpr int16_t CONT_Y = 0;
72+constexpr int16_t CONT_W = 760;
73+constexpr int16_t CONT_H = 400;
74+constexpr uint8_t CONT_RADIUS = 16;
75+ 
76+constexpr int16_t SW_DEMO_W = 184;
77+constexpr int16_t SW_DEMO_H = 92;
78+constexpr int16_t SW_DEMO_X = (CONT_W - SW_DEMO_W) / 2;
79+constexpr int16_t SW_DEMO_Y = 56;
80+constexpr int16_t ACTION_BTN_X = 560;
81+constexpr int16_t ACTION_BTN_Y = 100;
82+constexpr int16_t ACTION_BTN_W = 130;
83+constexpr int16_t ACTION_BTN_H = 44;
84+constexpr uint8_t ACTION_BTN_FONT = 22;
85+constexpr int16_t CFG_LABEL_Y = 164;
86+constexpr int16_t READ_LABEL_Y = 196;
87+constexpr int16_t STATE_LABEL_Y = 228;
88+constexpr int16_t LABEL_LINE_H = 36;
89+constexpr int16_t MANY_GRID_X = 24;
90+constexpr int16_t MANY_GRID_Y = 88;
91+constexpr int16_t MANY_PITCH_X = 72;
92+constexpr int16_t MANY_PITCH_Y = 30;
93+constexpr int16_t MANY_BTN_W = 64;
94+constexpr int16_t MANY_BTN_H = 28;
95+constexpr uint32_t MANY_COLS = 10;
96+ 
97+constexpr int16_t INFO_X = 24;
98+constexpr int16_t INFO_W = 712;
99+constexpr uint8_t INFO_SIZE = 22;
100+constexpr uint8_t HINT_SIZE = 20;
@@ -0,0 +1,106 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#ifndef SWITCH_RM_CASE_VIEW_H
17+#define SWITCH_RM_CASE_VIEW_H
18+ 
19+#include "components/ui_label.h"
20+#include "components/ui_label_button.h"
21+#include "components/ui_toggle_button.h"
22+#include "components/ui_view_group.h"
23+#include "graphic_config.h"
24+#include "rm_test_utils.h"
25+ 
26+namespace OHOS {
27+#if GRAPHIC_ENABLE_SWITCH_FLAG
28+ 
29+enum SwitchRmCaseType : uint8_t {
30+ SWITCH_CASE_DEMO,
31+ SWITCH_CASE_VERIFY_GETTER,
32+ SWITCH_CASE_STRESS_TOGGLE,
33+ SWITCH_CASE_MANY,
34+ SWITCH_CASE_STRESS_STATE,
35+ SWITCH_CASE_STRESS_CONFIG,
36+};
37+ 
38+struct SwitchRmCase {
39+ const char* id;
40+ const char* name;
41+ const char* expect;
42+ SwitchRmCaseType type;
43+ bool setOnSize;
44+ int16_t onSize;
45+ bool setOffSize;
46+ int16_t offSize;
47+ bool setOnThumb;
48+ uint32_t onThumb;
49+ bool setOffThumb;
50+ uint32_t offThumb;
51+ bool setOnBorder;
52+ uint32_t onBorder;
53+ bool setOffBorder;
54+ uint32_t offBorder;
55+ bool initialOn;
56+};
57+ 
58+extern const SwitchRmCase g_switchRmCases[];
59+extern const uint32_t g_switchRmCaseNum;
60+ 
61+/**
62+ * @brief Switch RM 单个用例的视图构建与清理器。
63+ *
64+ * Build() 在 content 内部创建并返回用例容器;析构时先剥离监听器再删除容器子树。
65+ */
66+class SwitchRmCaseRunner {
67+public:
68+ explicit SwitchRmCaseRunner(const SwitchRmCase* testCase);
69+ ~SwitchRmCaseRunner();
70+ 
71+ UIViewGroup* Build(UIViewGroup* content);
72+ 
73+private:
74+ void ResetState();
75+ UIToggleButton* CreateDemoToggle();
76+ void ShowDemoCase();
77+ void ShowVerifyCase();
78+ void ShowStressCase();
79+ void ShowManyCase();
80+ void SetInfoText(const char* text);
81+ void AddClickListener(UIView* view, std::function<bool(UIView&, const ClickEvent&)> fn);
82+ 
83+ class SwitchStateListener;
84+ 
85+ struct ListenerEntry {
86+ UIView* view;
87+ RmClickListener* listener;
88+ };
89+ static constexpr uint8_t MAX_LISTENERS = 128;
90+ 
91+ const SwitchRmCase* case_;
92+ UIViewGroup* container_;
93+ UILabel* countLabel_;
94+ UILabel* infoLabel_;
95+ UIToggleButton* toggle_;
96+ SwitchStateListener* changeListener_;
97+ uint32_t changeCount_;
98+ uint32_t stressPassCount_;
99+ uint32_t stressFailCount_;
100+ ListenerEntry listeners_[MAX_LISTENERS];
101+ uint8_t listenerCount_;
102+};
103+ 
104+#endif // GRAPHIC_ENABLE_SWITCH_FLAG
105+} // namespace OHOS
106+#endif // SWITCH_RM_CASE_VIEW_H
@@ -0,0 +1,25 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#include "switch_rm_test_slice.h"
17+ 
18+#if GRAPHIC_ENABLE_SWITCH_FLAG
19+namespace OHOS {
20+REGISTER_AS(SwitchRmTestSlice)
21+ 
22+SwitchRmTestSlice::SwitchRmTestSlice() : RmTestSliceBase("Switch RM验收") {}
23+ 
24+} // namespace OHOS
25+#endif // GRAPHIC_ENABLE_SWITCH_FLAG
@@ -0,0 +1,31 @@
1+/*
2+ * Copyright (c) 2026 Huawei Device Co., Ltd.
3+ * Licensed under the Apache License, Version 2.0 (the "License");
4+ * you may not use this file except in compliance with the License.
5+ * You may obtain a copy of the License at
6+ *
7+ * http://www.apache.org/licenses/LICENSE-2.0
8+ *
9+ * Unless required by applicable law or agreed to in writing, software
10+ * distributed under the License is distributed on an "AS IS" BASIS,
11+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ * See the License for the specific language governing permissions and
13+ * limitations under the License.
14+ */
15+ 
16+#ifndef SWITCH_RM_TEST_SLICE_H
17+#define SWITCH_RM_TEST_SLICE_H
18+ 
19+#include "rm_test_slice_base.h"
20+#include "switch_rm_case_view.h"
21+ 
22+#if GRAPHIC_ENABLE_SWITCH_FLAG
23+namespace OHOS {
24+class SwitchRmTestSlice : public RmTestSliceBase<SwitchRmCaseRunner, SwitchRmCase,
25+ g_switchRmCases, g_switchRmCaseNum> {
26+public:
27+ SwitchRmTestSlice();
28+};
29+} // namespace OHOS
30+#endif // GRAPHIC_ENABLE_SWITCH_FLAG
31+#endif // SWITCH_RM_TEST_SLICE_H
@@ -18,9 +18,9 @@ action("talm_js_bundle") {
18 "talm/src/main/js/MainAbility/pages/gradient/gradient.hml",18 "talm/src/main/js/MainAbility/pages/gradient/gradient.hml",
19 "talm/src/main/js/MainAbility/pages/gradient/gradient.js",19 "talm/src/main/js/MainAbility/pages/gradient/gradient.js",
20 "talm/src/main/js/MainAbility/pages/gradient/gradient.css",20 "talm/src/main/js/MainAbility/pages/gradient/gradient.css",
21- "talm/src/main/js/MainAbility/pages/svg/svg.hml",21+ "talm/src/main/js/MainAbility/pages/svgPage/svgPage.hml",
22- "talm/src/main/js/MainAbility/pages/svg/svg.js",22+ "talm/src/main/js/MainAbility/pages/svgPage/svgPage.js",
23- "talm/src/main/js/MainAbility/pages/svg/svg.css",23+ "talm/src/main/js/MainAbility/pages/svgPage/svgPage.css",
24 "talm/src/main/js/MainAbility/pages/flex/flex.hml",24 "talm/src/main/js/MainAbility/pages/flex/flex.hml",
25 "talm/src/main/js/MainAbility/pages/flex/flex.js",25 "talm/src/main/js/MainAbility/pages/flex/flex.js",
26 "talm/src/main/js/MainAbility/pages/flex/flex.css",26 "talm/src/main/js/MainAbility/pages/flex/flex.css",
@@ -49,13 +49,211 @@ action("talm_js_bundle") {
49 "talm/src/main/js/MainAbility/pages/page_animation/target/target.js",49 "talm/src/main/js/MainAbility/pages/page_animation/target/target.js",
50 "talm/src/main/js/MainAbility/pages/page_animation/target/target.css",50 "talm/src/main/js/MainAbility/pages/page_animation/target/target.css",
51 "talm_build_js.py",51 "talm_build_js.py",
52+ "talm/src/main/js/MainAbility/pages/flex/rm020/rm020.js",
53+ "talm/src/main/js/MainAbility/pages/flex/rm020/rm020.css",
54+ "talm/src/main/js/MainAbility/pages/flex/rm020/rm020.hml",
55+ "talm/src/main/js/MainAbility/pages/flex/rm020-abs/rm020-abs.js",
56+ "talm/src/main/js/MainAbility/pages/flex/rm020-abs/rm020-abs.css",
57+ "talm/src/main/js/MainAbility/pages/flex/rm020-abs/rm020-abs.hml",
58+ "talm/src/main/js/MainAbility/pages/flex/rm018/rm018.css",
59+ "talm/src/main/js/MainAbility/pages/flex/rm018/rm018.hml",
60+ "talm/src/main/js/MainAbility/pages/flex/rm018/rm018.js",
61+ "talm/src/main/js/MainAbility/pages/flex/rm019-1/rm019-1.hml",
62+ "talm/src/main/js/MainAbility/pages/flex/rm019-1/rm019-1.js",
63+ "talm/src/main/js/MainAbility/pages/flex/rm019-1/rm019-1.css",
64+ "talm/src/main/js/MainAbility/pages/flex/rm019/rm019.hml",
65+ "talm/src/main/js/MainAbility/pages/flex/rm019/rm019.css",
66+ "talm/src/main/js/MainAbility/pages/flex/rm019/rm019.js",
67+ "talm/src/main/js/MainAbility/pages/flex/rm017/rm017.hml",
68+ "talm/src/main/js/MainAbility/pages/flex/rm017/rm017.css",
69+ "talm/src/main/js/MainAbility/pages/flex/rm017/rm017.js",
70+ "talm/src/main/js/MainAbility/pages/lightGraphics/lightGraphics.hml",
71+ "talm/src/main/js/MainAbility/pages/lightGraphics/lightGraphics.css",
72+ "talm/src/main/js/MainAbility/pages/lightGraphics/lightGraphics.js",
73+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/index003.hml",
74+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/index003.js",
75+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/index003.css",
76+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/basic_path/basic_path.hml",
77+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/basic_path/basic_path.css",
78+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/basic_path/basic_path.js",
79+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/basic_shape/basic_shape.css",
80+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/basic_shape/basic_shape.js",
81+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/basic_shape/basic_shape.hml",
82+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/exception_parse/exception_parse.hml",
83+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/exception_parse/exception_parse.js",
84+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/exception_parse/exception_parse.css",
85+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/basic_gradient/basic_gradient.hml",
86+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/basic_gradient/basic_gradient.css",
87+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/basic_gradient/basic_gradient.js",
88+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/boundary_shape/boundary_shape.js",
89+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/boundary_shape/boundary_shape.hml",
90+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/boundary_shape/boundary_shape.css",
91+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/basic/basic.css",
92+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/basic/basic.js",
93+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm003/basic/basic.hml",
94+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/index009.js",
95+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/index009.css",
96+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/index009.hml",
97+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/exception_anim/exception_anim.css",
98+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/exception_anim/exception_anim.js",
99+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/exception_anim/exception_anim.hml",
100+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/basic_basic/basic_basic.hml",
101+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/basic_basic/basic_basic.js",
102+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/basic_basic/basic_basic.css",
103+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/boundary_anim/boundary_anim.css",
104+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/boundary_anim/boundary_anim.js",
105+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/boundary_anim/boundary_anim.hml",
106+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/basic/basic.css",
107+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/basic/basic.js",
108+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/basic/basic.hml",
109+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/basic_bounce/basic_bounce.js",
110+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/basic_bounce/basic_bounce.css",
111+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/basic_bounce/basic_bounce.hml",
112+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/basic_combine/basic_combine.css",
113+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/basic_combine/basic_combine.hml",
114+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm009/basic_combine/basic_combine.js",
115+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/index005.hml",
116+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/index005.js",
117+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/index005.css",
118+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/basic_angle/basic_angle.hml",
119+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/basic_angle/basic_angle.css",
120+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/basic_angle/basic_angle.js",
121+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/basic_direction/basic_direction.hml",
122+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/basic_direction/basic_direction.css",
123+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/basic_direction/basic_direction.js",
124+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/basic_button/basic_button.css",
125+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/basic_button/basic_button.hml",
126+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/basic_button/basic_button.js",
127+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/exception_gradient/exception_gradient.js",
128+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/exception_gradient/exception_gradient.css",
129+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/exception_gradient/exception_gradient.hml",
130+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/boundary_gradient/boundary_gradient.css",
131+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/boundary_gradient/boundary_gradient.hml",
132+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/boundary_gradient/boundary_gradient.js",
133+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/basic_list/basic_list.hml",
134+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/basic_list/basic_list.js",
135+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/basic_list/basic_list.css",
136+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/basic/basic.css",
137+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/basic/basic.js",
138+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm005/basic/basic.hml",
139+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/index001.css",
140+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/index001.js",
141+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/index001.hml",
142+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/basic_composite/basic_composite.css",
143+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/basic_composite/basic_composite.hml",
144+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/basic_composite/basic_composite.js",
145+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/exception_parse/exception_parse.hml",
146+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/exception_parse/exception_parse.js",
147+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/exception_parse/exception_parse.css",
148+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/basic_animation/basic_animation.hml",
149+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/basic_animation/basic_animation.js",
150+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/basic_animation/basic_animation.css",
151+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/boundary_composite/boundary_composite.css",
152+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/boundary_composite/boundary_composite.hml",
153+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/boundary_composite/boundary_composite.js",
154+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/basic_text/basic_text.hml",
155+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/basic_text/basic_text.css",
156+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/basic_text/basic_text.js",
157+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/basic/basic.css",
158+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/basic/basic.js",
159+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm001/basic/basic.hml",
160+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/index008.hml",
161+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/index008.css",
162+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/index008.js",
163+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/basic_path/basic_path.hml",
164+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/basic_path/basic_path.css",
165+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/basic_path/basic_path.js",
166+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/basic_bezier/basic_bezier.css",
167+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/basic_bezier/basic_bezier.hml",
168+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/basic_bezier/basic_bezier.js",
169+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/performance/performance.hml",
170+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/performance/performance.js",
171+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/performance/performance.css",
172+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/exception_path/exception_path.css",
173+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/exception_path/exception_path.hml",
174+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/exception_path/exception_path.js",
175+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/boundary_path/boundary_path.hml",
176+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/boundary_path/boundary_path.css",
177+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/boundary_path/boundary_path.js",
178+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/perf_path/perf_path.css",
179+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/perf_path/perf_path.js",
180+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/perf_path/perf_path.hml",
181+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/basic/basic.css",
182+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/basic/basic.js",
183+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm008/basic/basic.hml",
184+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/index007.hml",
185+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/index007.js",
186+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/index007.css",
187+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/basic_delay/basic_delay.hml",
188+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/basic_delay/basic_delay.js",
189+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/basic_delay/basic_delay.css",
190+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/boundary_trans/boundary_trans.hml",
191+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/boundary_trans/boundary_trans.js",
192+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/boundary_trans/boundary_trans.css",
193+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/basic_trans/basic_trans.js",
194+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/basic_trans/basic_trans.hml",
195+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/basic_trans/basic_trans.css",
196+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/exception_trans/exception_trans.css",
197+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/exception_trans/exception_trans.hml",
198+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/exception_trans/exception_trans.js",
199+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/basic_shared/basic_shared.css",
200+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/basic_shared/basic_shared.js",
201+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/basic_shared/basic_shared.hml",
202+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/basic/basic.css",
203+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/basic/basic.js",
204+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm007/basic/basic.hml",
205+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/index002.css",
206+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/index002.hml",
207+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/index002.js",
208+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/exception_parse/exception_parse.hml",
209+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/exception_parse/exception_parse.js",
210+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/exception_parse/exception_parse.css",
211+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/basic_transform/basic_transform.js",
212+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/basic_transform/basic_transform.hml",
213+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/basic_transform/basic_transform.css",
214+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/boundary_stroke/boundary_stroke.js",
215+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/boundary_stroke/boundary_stroke.hml",
216+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/boundary_stroke/boundary_stroke.css",
217+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/basic_stroke/basic_stroke.css",
218+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/basic_stroke/basic_stroke.js",
219+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/basic_stroke/basic_stroke.hml",
220+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/basic_star/basic_star.js",
221+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/basic_star/basic_star.hml",
222+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/basic_star/basic_star.css",
223+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/basic/basic.css",
224+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/basic/basic.js",
225+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm002/basic/basic.hml",
226+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/index006.js",
227+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/index006.hml",
228+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/index006.css",
229+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/basic_direction/basic_direction.hml",
230+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/basic_direction/basic_direction.css",
231+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/basic_direction/basic_direction.js",
232+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/basic_button/basic_button.css",
233+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/basic_button/basic_button.hml",
234+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/basic_button/basic_button.js",
235+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/exception_gradient/exception_gradient.js",
236+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/exception_gradient/exception_gradient.css",
237+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/exception_gradient/exception_gradient.hml",
238+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/basic_color/basic_color.js",
239+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/basic_color/basic_color.hml",
240+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/basic_color/basic_color.css",
241+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/boundary_gradient/boundary_gradient.css",
242+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/boundary_gradient/boundary_gradient.hml",
243+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/boundary_gradient/boundary_gradient.js",
244+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/basic_list/basic_list.hml",
245+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/basic_list/basic_list.js",
246+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/basic_list/basic_list.css",
247+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/basic/basic.css",
248+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/basic/basic.js",
249+ "talm/src/main/js/MainAbility/pages/lightGraphics/rm006/basic/basic.hml",
52 ]250 ]
53 outputs = [251 outputs = [
54 "$root_out_dir/talm/assets/js/default/app.js",252 "$root_out_dir/talm/assets/js/default/app.js",
55 "$root_out_dir/talm/assets/js/default/manifest.json",253 "$root_out_dir/talm/assets/js/default/manifest.json",
56 "$root_out_dir/talm/assets/js/default/pages/index/index.js",254 "$root_out_dir/talm/assets/js/default/pages/index/index.js",
57 "$root_out_dir/talm/assets/js/default/pages/gradient/gradient.js",255 "$root_out_dir/talm/assets/js/default/pages/gradient/gradient.js",
58- "$root_out_dir/talm/assets/js/default/pages/svg/svg.js",256+ "$root_out_dir/talm/assets/js/default/pages/svgPage/svgPage.js",
59 "$root_out_dir/talm/assets/js/default/pages/flex/flex.js",257 "$root_out_dir/talm/assets/js/default/pages/flex/flex.js",
60 "$root_out_dir/talm/assets/js/default/pages/animation/animation.js",258 "$root_out_dir/talm/assets/js/default/pages/animation/animation.js",
61 "$root_out_dir/talm/assets/js/default/pages/page_animation/page_animation.js",259 "$root_out_dir/talm/assets/js/default/pages/page_animation/page_animation.js",
@@ -65,6 +263,72 @@ action("talm_js_bundle") {
65 "$root_out_dir/talm/assets/js/default/pages/page_animation/over/over.js",263 "$root_out_dir/talm/assets/js/default/pages/page_animation/over/over.js",
66 "$root_out_dir/talm/assets/js/default/pages/page_animation/edge/edge.js",264 "$root_out_dir/talm/assets/js/default/pages/page_animation/edge/edge.js",
67 "$root_out_dir/talm/assets/js/default/pages/page_animation/target/target.js",265 "$root_out_dir/talm/assets/js/default/pages/page_animation/target/target.js",
266+ "$root_out_dir/talm/assets/js/default/pages/flex/rm020/rm020.js",
267+ "$root_out_dir/talm/assets/js/default/pages/flex/rm020-abs/rm020-abs.js",
268+ "$root_out_dir/talm/assets/js/default/pages/flex/rm018/rm018.js",
269+ "$root_out_dir/talm/assets/js/default/pages/flex/rm019-1/rm019-1.js",
270+ "$root_out_dir/talm/assets/js/default/pages/flex/rm019/rm019.js",
271+ "$root_out_dir/talm/assets/js/default/pages/flex/rm017/rm017.js",
272+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/lightGraphics.js",
273+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm003/index003.js",
274+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm003/basic_path/basic_path.js",
275+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm003/basic_shape/basic_shape.js",
276+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm003/exception_parse/exception_parse.js",
277+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm003/basic_gradient/basic_gradient.js",
278+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm003/boundary_shape/boundary_shape.js",
279+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm003/basic/basic.js",
280+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm009/index009.js",
281+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm009/exception_anim/exception_anim.js",
282+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm009/basic_basic/basic_basic.js",
283+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm009/boundary_anim/boundary_anim.js",
284+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm009/basic/basic.js",
285+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm009/basic_bounce/basic_bounce.js",
286+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm009/basic_combine/basic_combine.js",
287+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm005/index005.js",
288+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm005/basic_angle/basic_angle.js",
289+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm005/basic_direction/basic_direction.js",
290+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm005/basic_button/basic_button.js",
291+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm005/exception_gradient/exception_gradient.js",
292+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm005/boundary_gradient/boundary_gradient.js",
293+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm005/basic_list/basic_list.js",
294+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm005/basic/basic.js",
295+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm001/index001.js",
296+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm001/basic_composite/basic_composite.js",
297+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm001/exception_parse/exception_parse.js",
298+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm001/basic_animation/basic_animation.js",
299+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm001/boundary_composite/boundary_composite.js",
300+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm001/basic_text/basic_text.js",
301+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm001/basic/basic.js",
302+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm008/index008.js",
303+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm008/basic_path/basic_path.js",
304+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm008/basic_bezier/basic_bezier.js",
305+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm008/performance/performance.js",
306+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm008/exception_path/exception_path.js",
307+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm008/boundary_path/boundary_path.js",
308+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm008/perf_path/perf_path.js",
309+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm008/basic/basic.js",
310+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm007/index007.js",
311+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm007/basic_delay/basic_delay.js",
312+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm007/boundary_trans/boundary_trans.js",
313+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm007/basic_trans/basic_trans.js",
314+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm007/exception_trans/exception_trans.js",
315+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm007/basic_shared/basic_shared.js",
316+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm007/basic/basic.js",
317+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm002/index002.js",
318+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm002/exception_parse/exception_parse.js",
319+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm002/basic_transform/basic_transform.js",
320+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm002/boundary_stroke/boundary_stroke.js",
321+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm002/basic_stroke/basic_stroke.js",
322+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm002/basic_star/basic_star.js",
323+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm002/basic/basic.js",
324+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm006/index006.js",
325+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm006/basic_direction/basic_direction.js",
326+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm006/basic_button/basic_button.js",
327+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm006/exception_gradient/exception_gradient.js",
328+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm006/basic_color/basic_color.js",
329+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm006/boundary_gradient/boundary_gradient.js",
330+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm006/basic_list/basic_list.js",
331+ "$root_out_dir/talm/assets/js/default/pages/lightGraphics/rm006/basic/basic.js",
68 ]332 ]
69 args = [333 args = [
70 rebase_path("talm/src/main/js/MainAbility"),334 rebase_path("talm/src/main/js/MainAbility"),
@@ -45,14 +45,80 @@
45 "pages/gradient/gradient",45 "pages/gradient/gradient",
46 "pages/flex/flex",46 "pages/flex/flex",
47 "pages/animation/animation",47 "pages/animation/animation",
48- "pages/svg/svg",48+ "pages/svgPage/svgPage",
49 "pages/page_animation/page_animation",49 "pages/page_animation/page_animation",
50 "pages/page_animation/fade/fade",50 "pages/page_animation/fade/fade",
51 "pages/page_animation/scale/scale",51 "pages/page_animation/scale/scale",
52 "pages/page_animation/slide/slide",52 "pages/page_animation/slide/slide",
53 "pages/page_animation/over/over",53 "pages/page_animation/over/over",
54 "pages/page_animation/edge/edge",54 "pages/page_animation/edge/edge",
55- "pages/page_animation/target/target"55+ "pages/page_animation/target/target",
56+ "pages/flex/rm017/rm017",
57+ "pages/flex/rm018/rm018",
58+ "pages/flex/rm019/rm019",
59+ "pages/flex/rm019-1/rm019-1",
60+ "pages/flex/rm020/rm020",
61+ "pages/flex/rm020-abs/rm020-abs",
62+ "pages/lightGraphics/lightGraphics",
63+ "pages/lightGraphics/rm001/basic/basic",
64+ "pages/lightGraphics/rm001/basic_animation/basic_animation",
65+ "pages/lightGraphics/rm001/basic_composite/basic_composite",
66+ "pages/lightGraphics/rm001/basic_text/basic_text",
67+ "pages/lightGraphics/rm001/boundary_composite/boundary_composite",
68+ "pages/lightGraphics/rm001/exception_parse/exception_parse",
69+ "pages/lightGraphics/rm001/index001",
70+ "pages/lightGraphics/rm002/basic/basic",
71+ "pages/lightGraphics/rm002/basic_star/basic_star",
72+ "pages/lightGraphics/rm002/basic_stroke/basic_stroke",
73+ "pages/lightGraphics/rm002/basic_transform/basic_transform",
74+ "pages/lightGraphics/rm002/boundary_stroke/boundary_stroke",
75+ "pages/lightGraphics/rm002/exception_parse/exception_parse",
76+ "pages/lightGraphics/rm002/index002",
77+ "pages/lightGraphics/rm003/basic/basic",
78+ "pages/lightGraphics/rm003/basic_gradient/basic_gradient",
79+ "pages/lightGraphics/rm003/basic_path/basic_path",
80+ "pages/lightGraphics/rm003/basic_shape/basic_shape",
81+ "pages/lightGraphics/rm003/boundary_shape/boundary_shape",
82+ "pages/lightGraphics/rm003/exception_parse/exception_parse",
83+ "pages/lightGraphics/rm003/index003",
84+ "pages/lightGraphics/rm005/basic/basic",
85+ "pages/lightGraphics/rm005/basic_angle/basic_angle",
86+ "pages/lightGraphics/rm005/basic_button/basic_button",
87+ "pages/lightGraphics/rm005/basic_direction/basic_direction",
88+ "pages/lightGraphics/rm005/basic_list/basic_list",
89+ "pages/lightGraphics/rm005/boundary_gradient/boundary_gradient",
90+ "pages/lightGraphics/rm005/exception_gradient/exception_gradient",
91+ "pages/lightGraphics/rm005/index005",
92+ "pages/lightGraphics/rm006/basic/basic",
93+ "pages/lightGraphics/rm006/basic_button/basic_button",
94+ "pages/lightGraphics/rm006/basic_color/basic_color",
95+ "pages/lightGraphics/rm006/basic_direction/basic_direction",
96+ "pages/lightGraphics/rm006/basic_list/basic_list",
97+ "pages/lightGraphics/rm006/boundary_gradient/boundary_gradient",
98+ "pages/lightGraphics/rm006/exception_gradient/exception_gradient",
99+ "pages/lightGraphics/rm006/index006",
100+ "pages/lightGraphics/rm007/basic/basic",
101+ "pages/lightGraphics/rm007/basic_delay/basic_delay",
102+ "pages/lightGraphics/rm007/basic_shared/basic_shared",
103+ "pages/lightGraphics/rm007/basic_trans/basic_trans",
104+ "pages/lightGraphics/rm007/boundary_trans/boundary_trans",
105+ "pages/lightGraphics/rm007/exception_trans/exception_trans",
106+ "pages/lightGraphics/rm007/index007",
107+ "pages/lightGraphics/rm008/basic/basic",
108+ "pages/lightGraphics/rm008/basic_bezier/basic_bezier",
109+ "pages/lightGraphics/rm008/basic_path/basic_path",
110+ "pages/lightGraphics/rm008/boundary_path/boundary_path",
111+ "pages/lightGraphics/rm008/exception_path/exception_path",
112+ "pages/lightGraphics/rm008/index008",
113+ "pages/lightGraphics/rm008/perf_path/perf_path",
114+ "pages/lightGraphics/rm008/performance/performance",
115+ "pages/lightGraphics/rm009/basic/basic",
116+ "pages/lightGraphics/rm009/basic_basic/basic_basic",
117+ "pages/lightGraphics/rm009/basic_bounce/basic_bounce",
118+ "pages/lightGraphics/rm009/basic_combine/basic_combine",
119+ "pages/lightGraphics/rm009/boundary_anim/boundary_anim",
120+ "pages/lightGraphics/rm009/exception_anim/exception_anim",
121+ "pages/lightGraphics/rm009/index009"
56 ],122 ],
57 "name": "AceAbility"123 "name": "AceAbility"
58 }124 }
Rtalm/talm/src/main/js/MainAbility/pages/svg/svg.css→talm/talm/src/main/js/MainAbility/pages/svgPage/svgPage.css+0-0
Rtalm/talm/src/main/js/MainAbility/pages/svg/svg.hml→talm/talm/src/main/js/MainAbility/pages/svgPage/svgPage.hml+0-0
Rtalm/talm/src/main/js/MainAbility/pages/svg/svg.js→talm/talm/src/main/js/MainAbility/pages/svgPage/svgPage.js+0-0