From 6807b914ab1d94101da8e03e7a09aa749b89046b Mon Sep 17 00:00:00 2001 From: keminLuo Date: Mon, 25 Nov 2024 21:52:01 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=B8=8A=E4=BC=A0customScrollView=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=90=B8=E9=A1=B6=E7=9A=84demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: keminLuo --- ohos/scrollview_demo/README.md | 16 ++ ohos/scrollview_demo/analysis_options.yaml | 29 +++ ohos/scrollview_demo/images/1.png | Bin 0 -> 39759 bytes .../lib/extra_info_constrants.dart | 36 ++++ ohos/scrollview_demo/lib/main.dart | 124 +++++++++++++ .../lib/sliver_flexible_header.dart | 174 ++++++++++++++++++ ohos/scrollview_demo/ohos/.gitignore | 19 ++ ohos/scrollview_demo/ohos/AppScope/app.json5 | 10 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 6790 bytes ohos/scrollview_demo/ohos/build-profile.json5 | 42 +++++ ohos/scrollview_demo/ohos/entry/.gitignore | 7 + .../ohos/entry/build-profile.json5 | 29 +++ ohos/scrollview_demo/ohos/entry/hvigorfile.ts | 17 ++ .../ohos/entry/oh-package.json5 | 9 + .../main/ets/entryability/EntryAbility.ets | 24 +++ .../ohos/entry/src/main/ets/pages/Index.ets | 38 ++++ .../ets/plugins/GeneratedPluginRegistrant.ets | 24 +++ .../ohos/entry/src/main/module.json5 | 53 ++++++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 16 ++ .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../resources/base/profile/main_pages.json | 5 + .../main/resources/en_US/element/string.json | 16 ++ .../main/resources/zh_CN/element/string.json | 16 ++ .../src/ohosTest/ets/test/Ability.test.ets | 50 +++++ .../entry/src/ohosTest/ets/test/List.test.ets | 20 ++ .../ohosTest/ets/testability/TestAbility.ets | 63 +++++++ .../ohosTest/ets/testability/pages/Index.ets | 49 +++++ .../ets/testrunner/OpenHarmonyTestRunner.ts | 64 +++++++ .../ohos/entry/src/ohosTest/module.json5 | 51 +++++ .../resources/base/element/color.json | 8 + .../resources/base/element/string.json | 16 ++ .../ohosTest/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../resources/base/profile/test_pages.json | 5 + .../ohos/hvigor/hvigor-config.json5 | 20 ++ ohos/scrollview_demo/ohos/hvigorfile.ts | 21 +++ ohos/scrollview_demo/ohos/oh-package.json5 | 33 ++++ ohos/scrollview_demo/pubspec.yaml | 89 +++++++++ 39 files changed, 1209 insertions(+) create mode 100644 ohos/scrollview_demo/README.md create mode 100644 ohos/scrollview_demo/analysis_options.yaml create mode 100644 ohos/scrollview_demo/images/1.png create mode 100644 ohos/scrollview_demo/lib/extra_info_constrants.dart create mode 100644 ohos/scrollview_demo/lib/main.dart create mode 100644 ohos/scrollview_demo/lib/sliver_flexible_header.dart create mode 100644 ohos/scrollview_demo/ohos/.gitignore create mode 100644 ohos/scrollview_demo/ohos/AppScope/app.json5 create mode 100644 ohos/scrollview_demo/ohos/AppScope/resources/base/element/string.json create mode 100644 ohos/scrollview_demo/ohos/AppScope/resources/base/media/app_icon.png create mode 100644 ohos/scrollview_demo/ohos/build-profile.json5 create mode 100644 ohos/scrollview_demo/ohos/entry/.gitignore create mode 100644 ohos/scrollview_demo/ohos/entry/build-profile.json5 create mode 100644 ohos/scrollview_demo/ohos/entry/hvigorfile.ts create mode 100644 ohos/scrollview_demo/ohos/entry/oh-package.json5 create mode 100644 ohos/scrollview_demo/ohos/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 ohos/scrollview_demo/ohos/entry/src/main/ets/pages/Index.ets create mode 100644 ohos/scrollview_demo/ohos/entry/src/main/ets/plugins/GeneratedPluginRegistrant.ets create mode 100644 ohos/scrollview_demo/ohos/entry/src/main/module.json5 create mode 100644 ohos/scrollview_demo/ohos/entry/src/main/resources/base/element/color.json create mode 100644 ohos/scrollview_demo/ohos/entry/src/main/resources/base/element/string.json create mode 100644 ohos/scrollview_demo/ohos/entry/src/main/resources/base/media/icon.png create mode 100644 ohos/scrollview_demo/ohos/entry/src/main/resources/base/profile/main_pages.json create mode 100644 ohos/scrollview_demo/ohos/entry/src/main/resources/en_US/element/string.json create mode 100644 ohos/scrollview_demo/ohos/entry/src/main/resources/zh_CN/element/string.json create mode 100644 ohos/scrollview_demo/ohos/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 ohos/scrollview_demo/ohos/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 ohos/scrollview_demo/ohos/entry/src/ohosTest/ets/testability/TestAbility.ets create mode 100644 ohos/scrollview_demo/ohos/entry/src/ohosTest/ets/testability/pages/Index.ets create mode 100644 ohos/scrollview_demo/ohos/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ts create mode 100644 ohos/scrollview_demo/ohos/entry/src/ohosTest/module.json5 create mode 100644 ohos/scrollview_demo/ohos/entry/src/ohosTest/resources/base/element/color.json create mode 100644 ohos/scrollview_demo/ohos/entry/src/ohosTest/resources/base/element/string.json create mode 100644 ohos/scrollview_demo/ohos/entry/src/ohosTest/resources/base/media/icon.png create mode 100644 ohos/scrollview_demo/ohos/entry/src/ohosTest/resources/base/profile/test_pages.json create mode 100644 ohos/scrollview_demo/ohos/hvigor/hvigor-config.json5 create mode 100644 ohos/scrollview_demo/ohos/hvigorfile.ts create mode 100644 ohos/scrollview_demo/ohos/oh-package.json5 create mode 100644 ohos/scrollview_demo/pubspec.yaml diff --git a/ohos/scrollview_demo/README.md b/ohos/scrollview_demo/README.md new file mode 100644 index 00000000..2102c647 --- /dev/null +++ b/ohos/scrollview_demo/README.md @@ -0,0 +1,16 @@ +# scrollview_demo + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/ohos/scrollview_demo/analysis_options.yaml b/ohos/scrollview_demo/analysis_options.yaml new file mode 100644 index 00000000..61b6c4de --- /dev/null +++ b/ohos/scrollview_demo/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/ohos/scrollview_demo/images/1.png b/ohos/scrollview_demo/images/1.png new file mode 100644 index 0000000000000000000000000000000000000000..95051e9ccea7bc7125e2cc15815edea308e230a0 GIT binary patch literal 39759 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 X{`-D-7#JAs7#xRyu6u#Vcnbg7vFfkr literal 0 HcmV?d00001 diff --git a/ohos/scrollview_demo/lib/extra_info_constrants.dart b/ohos/scrollview_demo/lib/extra_info_constrants.dart new file mode 100644 index 00000000..8934dd39 --- /dev/null +++ b/ohos/scrollview_demo/lib/extra_info_constrants.dart @@ -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. + */ + +import 'package:flutter/widgets.dart'; + +class ExtraInfoBoxConstraints extends BoxConstraints { + ExtraInfoBoxConstraints(this.extra, BoxConstraints constraints) + : super( + minWidth: constraints.minWidth, + minHeight: constraints.minHeight, + maxWidth: constraints.maxWidth, + maxHeight: constraints.maxHeight, + ); + + final T extra; + + BoxConstraints asBoxConstraints() => copyWith(); + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + return other is ExtraInfoBoxConstraints && super == other && other.extra == extra; + } +} \ No newline at end of file diff --git a/ohos/scrollview_demo/lib/main.dart b/ohos/scrollview_demo/lib/main.dart new file mode 100644 index 00000000..0c91a9ff --- /dev/null +++ b/ohos/scrollview_demo/lib/main.dart @@ -0,0 +1,124 @@ +/* + * 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 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:scrollview_demo/sliver_flexible_header.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + // This widget is the root of your application. + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + // This is the theme of your application. + // + // Try running your application with "flutter run". You'll see the + // application has a blue toolbar. Then, without quitting the app, try + // changing the primarySwatch below to Colors.green and then invoke + // "hot reload" (press "r" in the console where you ran "flutter run", + // or simply save your changes to "hot reload" in a Flutter IDE). + // Notice that the counter didn't reset back to zero; the application + // is not restarted. + primarySwatch: Colors.blue, + ), + home: const CustomScrollViewPage(), + ); + } +} + +class CustomScrollViewPage extends StatefulWidget { + const CustomScrollViewPage({super.key}); + + @override + State createState() => _CustomScrollViewPageState(); +} + +class _CustomScrollViewPageState extends State { + Widget buildSliverList([int count = 5]) { + return SliverFixedExtentList( + itemExtent: 50, + delegate: SliverChildBuilderDelegate( + (context, index) { + return Text('$index'); + }, + childCount: count, + ), + ); + } + + bool _onNotification(ScrollUpdateNotification notification) { + print('==========dragDetail = ${notification.dragDetails} ' + '==========scrollDelta = ${notification.scrollDelta} '); + return false; + } + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return NotificationListener( + onNotification: _onNotification, + child: CustomScrollView( + // 指定widget.physics + physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()), + slivers: [ + SliverFlexibleHeader( + visibleExtent: 200, + builder: (context, availableHeight, direction) { + return GestureDetector( + onTap: () => debugPrint('tap'), + child: LayoutBuilder(builder: (context, cons) { + return Image( + image: const AssetImage("images/1.png"), + width: 50.0, + height: availableHeight, + alignment: Alignment.bottomCenter, + fit: BoxFit.cover, + ); + }), + ); + }, + ), + + SliverFixedExtentList( + itemExtent: 50.0, + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return Container( + alignment: Alignment.center, + color: Colors.lightBlue[100 * (index % 10)], + child: Text('$index'), + ); + }, + childCount: 100, + ), + ), + ], + ), + ); + } +} diff --git a/ohos/scrollview_demo/lib/sliver_flexible_header.dart b/ohos/scrollview_demo/lib/sliver_flexible_header.dart new file mode 100644 index 00000000..a3e70505 --- /dev/null +++ b/ohos/scrollview_demo/lib/sliver_flexible_header.dart @@ -0,0 +1,174 @@ +/* + * 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 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; +import 'package:scrollview_demo/extra_info_constrants.dart'; +import 'dart:math'; + +typedef SliverFlexibleHeaderBuilder = Widget Function( + BuildContext context, + double maxExtent, + ScrollDirection direction, +); + +class SliverFlexibleHeader extends StatelessWidget { + const SliverFlexibleHeader({ + Key? key, + this.visibleExtent = 0, + required this.builder, + }) : super(key: key); + + final SliverFlexibleHeaderBuilder builder; + + final double visibleExtent; + + @override + Widget build(BuildContext context) { + return _SliverFlexibleHeader( + visibleExtent: visibleExtent, + child: LayoutBuilder( + builder: (BuildContext context, BoxConstraints constraints) { + return builder( + context, + constraints.maxHeight, + (constraints as ExtraInfoBoxConstraints).extra, + ); + }, + ), + ); + } +} + +class _SliverFlexibleHeader extends SingleChildRenderObjectWidget { + const _SliverFlexibleHeader({ + Key? key, + required Widget child, + this.visibleExtent = 0, + }) : super(key: key, child: child); + + final double visibleExtent; + + @override + RenderObject createRenderObject(BuildContext context) { + return _FlexibleHeaderRenderSliver(visibleExtent); + } + + @override + void updateRenderObject(context, _FlexibleHeaderRenderSliver renderObject) { + renderObject.visibleExtent = visibleExtent; + } +} + +class _FlexibleHeaderRenderSliver extends RenderSliverSingleBoxAdapter { + _FlexibleHeaderRenderSliver(double visibleExtent) : _visibleExtent = visibleExtent; + + double _lastOverScroll = 0; + + double _lastScrollOffset = 0; + + double _visibleExtent = 0; + + ScrollDirection _direction = ScrollDirection.idle; + + bool _reported = false; + + double? _scrollOffsetCorrection; + + set visibleExtent(double value) { + if (_visibleExtent != value) { + _lastOverScroll = 0; + _reported = false; + _scrollOffsetCorrection = value - _visibleExtent; + _visibleExtent = value; + markNeedsLayout(); + } + } + + @override + void performLayout() { + if (_scrollOffsetCorrection != null) { + geometry = SliverGeometry(scrollOffsetCorrection: _scrollOffsetCorrection); + _scrollOffsetCorrection = null; + return; + } + + if (child == null) { + geometry = SliverGeometry(scrollExtent: _visibleExtent); + return; + } + + if (constraints.scrollOffset > _visibleExtent) { + geometry = SliverGeometry(scrollExtent: _visibleExtent); + + if (!_reported) { + _reported = true; + child!.layout( + ExtraInfoBoxConstraints( + _direction, + constraints.asBoxConstraints(maxExtent: 0), + ), + parentUsesSize: false, + ); + } + return; + } + + _reported = false; + + double overScroll = constraints.overlap < 0 ? constraints.overlap.abs() : 0; + + var scrollOffset = constraints.scrollOffset; + + _direction = ScrollDirection.idle; + + var distance = overScroll > 0 ? overScroll - _lastOverScroll : _lastScrollOffset - scrollOffset; + + _lastOverScroll = overScroll; + + _lastScrollOffset = scrollOffset; + + if (constraints.userScrollDirection == ScrollDirection.idle) { + _direction = ScrollDirection.idle; + _lastOverScroll = 0; + } else if (distance > 0) { + _direction = ScrollDirection.forward; + } else if (distance < 0) { + _direction = ScrollDirection.reverse; + } + + double paintExtent = _visibleExtent + overScroll - constraints.scrollOffset; + + paintExtent = min(paintExtent, constraints.remainingPaintExtent); + + child!.layout( + ExtraInfoBoxConstraints( + _direction, + constraints.asBoxConstraints(maxExtent: paintExtent), + ), + parentUsesSize: false, + ); + + double layoutExtent = min(_visibleExtent, paintExtent); + + geometry = SliverGeometry( + scrollExtent: _visibleExtent, + paintOrigin: -overScroll, + paintExtent: paintExtent, + maxPaintExtent: paintExtent, + layoutExtent: layoutExtent, + ); + } +} \ No newline at end of file diff --git a/ohos/scrollview_demo/ohos/.gitignore b/ohos/scrollview_demo/ohos/.gitignore new file mode 100644 index 00000000..6ca13b31 --- /dev/null +++ b/ohos/scrollview_demo/ohos/.gitignore @@ -0,0 +1,19 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test +*.har +**/BuildProfile.ets +**/oh-package-lock.json5 + +**/src/main/resources/rawfile/flutter_assets/ +**/libs/arm64-v8a/libapp.so +**/libs/arm64-v8a/libflutter.so +**/libs/arm64-v8a/libvmservice_snapshot.so diff --git a/ohos/scrollview_demo/ohos/AppScope/app.json5 b/ohos/scrollview_demo/ohos/AppScope/app.json5 new file mode 100644 index 00000000..e392e90f --- /dev/null +++ b/ohos/scrollview_demo/ohos/AppScope/app.json5 @@ -0,0 +1,10 @@ +{ + "app": { + "bundleName": "com.example.scrollview_demo", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/ohos/scrollview_demo/ohos/AppScope/resources/base/element/string.json b/ohos/scrollview_demo/ohos/AppScope/resources/base/element/string.json new file mode 100644 index 00000000..e05ba891 --- /dev/null +++ b/ohos/scrollview_demo/ohos/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "scrollview_demo" + } + ] +} diff --git a/ohos/scrollview_demo/ohos/AppScope/resources/base/media/app_icon.png b/ohos/scrollview_demo/ohos/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 { + 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() { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageDestroy'); + } + + onForeground() { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onForeground'); + } + + onBackground() { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onBackground'); + } +} \ No newline at end of file diff --git a/ohos/scrollview_demo/ohos/entry/src/ohosTest/ets/testability/pages/Index.ets b/ohos/scrollview_demo/ohos/entry/src/ohosTest/ets/testability/pages/Index.ets new file mode 100644 index 00000000..cef0447c --- /dev/null +++ b/ohos/scrollview_demo/ohos/entry/src/ohosTest/ets/testability/pages/Index.ets @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2023 Hunan OpenValley Digital Industry Development 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 '@ohos.hilog'; + +@Entry +@Component +struct Index { + aboutToAppear() { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility index aboutToAppear'); + } + @State message: string = 'Hello World' + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + Button() { + Text('next page') + .fontSize(20) + .fontWeight(FontWeight.Bold) + }.type(ButtonType.Capsule) + .margin({ + top: 20 + }) + .backgroundColor('#0D9FFB') + .width('35%') + .height('5%') + .onClick(()=>{ + }) + } + .width('100%') + } + .height('100%') + } + } \ No newline at end of file diff --git a/ohos/scrollview_demo/ohos/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ts b/ohos/scrollview_demo/ohos/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ts new file mode 100644 index 00000000..1def08f2 --- /dev/null +++ b/ohos/scrollview_demo/ohos/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ts @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2023 Hunan OpenValley Digital Industry Development 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 '@ohos.hilog'; +import TestRunner from '@ohos.application.testRunner'; +import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; + +var abilityDelegator = undefined +var abilityDelegatorArguments = undefined + +async function onAbilityCreateCallback() { + hilog.info(0x0000, 'testTag', '%{public}s', 'onAbilityCreateCallback'); +} + +async function addAbilityMonitorCallback(err: any) { + hilog.info(0x0000, 'testTag', 'addAbilityMonitorCallback : %{public}s', JSON.stringify(err) ?? ''); +} + +export default class OpenHarmonyTestRunner implements TestRunner { + constructor() { + } + + onPrepare() { + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner OnPrepare '); + } + + async onRun() { + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner onRun run'); + abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments() + abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator() + var testAbilityName = abilityDelegatorArguments.bundleName + '.TestAbility' + let lMonitor = { + abilityName: testAbilityName, + onAbilityCreate: onAbilityCreateCallback, + }; + abilityDelegator.addAbilityMonitor(lMonitor, addAbilityMonitorCallback) + var cmd = 'aa start -d 0 -a TestAbility' + ' -b ' + abilityDelegatorArguments.bundleName + var debug = abilityDelegatorArguments.parameters['-D'] + if (debug == 'true') + { + cmd += ' -D' + } + hilog.info(0x0000, 'testTag', 'cmd : %{public}s', cmd); + abilityDelegator.executeShellCommand(cmd, + (err: any, d: any) => { + hilog.info(0x0000, 'testTag', 'executeShellCommand : err : %{public}s', JSON.stringify(err) ?? ''); + hilog.info(0x0000, 'testTag', 'executeShellCommand : data : %{public}s', d.stdResult ?? ''); + hilog.info(0x0000, 'testTag', 'executeShellCommand : data : %{public}s', d.exitCode ?? ''); + }) + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner onRun end'); + } +} \ No newline at end of file diff --git a/ohos/scrollview_demo/ohos/entry/src/ohosTest/module.json5 b/ohos/scrollview_demo/ohos/entry/src/ohosTest/module.json5 new file mode 100644 index 00000000..fab77ce2 --- /dev/null +++ b/ohos/scrollview_demo/ohos/entry/src/ohosTest/module.json5 @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2023 Hunan OpenValley Digital Industry Development 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. +*/ + +{ + "module": { + "name": "entry_test", + "type": "feature", + "description": "$string:module_test_desc", + "mainElement": "TestAbility", + "deviceTypes": [ + "phone" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:test_pages", + "abilities": [ + { + "name": "TestAbility", + "srcEntry": "./ets/testability/TestAbility.ets", + "description": "$string:TestAbility_desc", + "icon": "$media:icon", + "label": "$string:TestAbility_label", + "exported": true, + "startWindowIcon": "$media:icon", + "startWindowBackground": "$color:start_window_background", + "skills": [ + { + "actions": [ + "action.system.home" + ], + "entities": [ + "entity.system.home" + ] + } + ] + } + ] + } +} diff --git a/ohos/scrollview_demo/ohos/entry/src/ohosTest/resources/base/element/color.json b/ohos/scrollview_demo/ohos/entry/src/ohosTest/resources/base/element/color.json new file mode 100644 index 00000000..3c712962 --- /dev/null +++ b/ohos/scrollview_demo/ohos/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/ohos/scrollview_demo/ohos/entry/src/ohosTest/resources/base/element/string.json b/ohos/scrollview_demo/ohos/entry/src/ohosTest/resources/base/element/string.json new file mode 100644 index 00000000..65d8fa5a --- /dev/null +++ b/ohos/scrollview_demo/ohos/entry/src/ohosTest/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_test_desc", + "value": "test ability description" + }, + { + "name": "TestAbility_desc", + "value": "the test ability" + }, + { + "name": "TestAbility_label", + "value": "test label" + } + ] +} \ No newline at end of file diff --git a/ohos/scrollview_demo/ohos/entry/src/ohosTest/resources/base/media/icon.png b/ohos/scrollview_demo/ohos/entry/src/ohosTest/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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.19.6 <3.0.0' + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.2 + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^2.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + assets: + - images/1.png + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages -- Gitee From 0ac9d8f0aeb960be0a851d1919134358f916c0d2 Mon Sep 17 00:00:00 2001 From: keminLuo Date: Tue, 26 Nov 2024 09:20:52 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E8=A1=A5=E5=85=85=E7=89=88=E6=9D=83?= =?UTF-8?q?=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: keminLuo --- .../ets/plugins/GeneratedPluginRegistrant.ets | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ohos/scrollview_demo/ohos/entry/src/main/ets/plugins/GeneratedPluginRegistrant.ets b/ohos/scrollview_demo/ohos/entry/src/main/ets/plugins/GeneratedPluginRegistrant.ets index f28ced70..ee53fcd5 100644 --- a/ohos/scrollview_demo/ohos/entry/src/main/ets/plugins/GeneratedPluginRegistrant.ets +++ b/ohos/scrollview_demo/ohos/entry/src/main/ets/plugins/GeneratedPluginRegistrant.ets @@ -1,3 +1,18 @@ +/* + * 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 { FlutterEngine, Log } from '@ohos/flutter_ohos'; /** -- Gitee