From ae354fb8770ad9a038cb7e0a77eb9a660cc279e3 Mon Sep 17 00:00:00 2001 From: kelinyang Date: Mon, 25 Aug 2025 14:59:20 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: kelinyang --- ArkGraphics2D/DisplaySoloist/.gitignore | 13 + .../DisplaySoloist/AppScope/app.json5 | 24 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes ArkGraphics2D/DisplaySoloist/README.md | 83 +++ .../DisplaySoloist/build-profile.json5 | 58 +++ .../DisplaySoloist/code-linter.json5 | 34 ++ ArkGraphics2D/DisplaySoloist/entry/.gitignore | 7 + .../DisplaySoloist/entry/build-profile.json5 | 53 ++ .../DisplaySoloist/entry/hvigorfile.ts | 20 + .../entry/obfuscation-rules.txt | 23 + .../DisplaySoloist/entry/oh-package.json5 | 25 + .../entry/src/main/cpp/CMakeLists.txt | 23 + .../entry/src/main/cpp/common/log_common.h | 26 + .../entry/src/main/cpp/napi_init.cpp | 39 ++ .../src/main/cpp/plugin/plugin_manager.cpp | 122 +++++ .../src/main/cpp/plugin/plugin_manager.h | 41 ++ .../main/cpp/samples/sample_xcomponent.cpp | 473 ++++++++++++++++++ .../src/main/cpp/samples/sample_xcomponent.h | 87 ++++ .../src/main/cpp/types/libentry/index.d.ts | 16 + .../main/cpp/types/libentry/oh-package.json5 | 20 + .../main/ets/entryability/EntryAbility.ets | 55 ++ .../entrybackupability/EntryBackupAbility.ets | 26 + .../main/ets/interface/XComponentContext.ts | 23 + .../entry/src/main/ets/pages/Index.ets | 133 +++++ .../entry/src/main/ets/utils/Logger.ets | 44 ++ .../entry/src/main/module.json5 | 65 +++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 16 + .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 6 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 5 + .../main/resources/en_US/element/string.json | 16 + .../main/resources/zh_CN/element/string.json | 16 + .../entry/src/mock/Libentry.mock.ets | 21 + .../entry/src/mock/mock-config.json5 | 19 + .../src/ohosTest/ets/test/Ability.test.ets | 76 +++ .../entry/src/ohosTest/ets/test/List.test.ets | 19 + .../entry/src/ohosTest/ets/utils/Logger.ets | 44 ++ .../entry/src/ohosTest/module.json5 | 26 + .../entry/src/test/List.test.ets | 19 + .../entry/src/test/LocalUnit.test.ets | 47 ++ .../DisplaySoloist/hvigor/hvigor-config.json5 | 36 ++ ArkGraphics2D/DisplaySoloist/hvigorfile.ts | 20 + ArkGraphics2D/DisplaySoloist/oh-package.json5 | 24 + ArkGraphics2D/DisplaySoloist/ohosTest.md | 13 + .../screenshots/device/index.png | Bin 0 -> 28693 bytes ArkGraphics2D/DisplaySync/.gitignore | 13 + ArkGraphics2D/DisplaySync/AppScope/app.json5 | 24 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes ArkGraphics2D/DisplaySync/README.md | 112 +++++ ArkGraphics2D/DisplaySync/build-profile.json5 | 58 +++ ArkGraphics2D/DisplaySync/code-linter.json5 | 34 ++ ArkGraphics2D/DisplaySync/entry/.gitignore | 6 + .../DisplaySync/entry/build-profile.json5 | 47 ++ ArkGraphics2D/DisplaySync/entry/hvigorfile.ts | 20 + .../DisplaySync/entry/obfuscation-rules.txt | 23 + .../DisplaySync/entry/oh-package.json5 | 24 + .../entry/src/main/cpp/CMakeLists.txt | 20 + .../entry/src/main/cpp/common/log_common.h | 26 + .../entry/src/main/cpp/napi_init.cpp | 44 ++ .../src/main/cpp/plugin/plugin_manager.cpp | 120 +++++ .../src/main/cpp/plugin/plugin_manager.h | 39 ++ .../main/cpp/samples/sample_xcomponent.cpp | 436 ++++++++++++++++ .../src/main/cpp/samples/sample_xcomponent.h | 85 ++++ .../src/main/cpp/types/libentry/index.d.ts | 16 + .../main/cpp/types/libentry/oh-package.json5 | 20 + .../ets/DispalySync/CustomDrawDisplaySync.ets | 202 ++++++++ .../PropertyAnimationDisplaySync.ets | 163 ++++++ .../ets/DispalySync/XComponentDisplaySync.ets | 134 +++++ .../main/ets/entryability/EntryAbility.ets | 55 ++ .../entrybackupability/EntryBackupAbility.ets | 26 + .../main/ets/interface/XComponentContext.ts | 21 + .../entry/src/main/ets/pages/Index.ets | 89 ++++ .../entry/src/main/ets/utils/Logger.ets | 44 ++ .../DisplaySync/entry/src/main/module.json5 | 65 +++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 16 + .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 6 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 8 + .../main/resources/en_US/element/string.json | 16 + .../main/resources/zh_CN/element/string.json | 16 + .../entry/src/mock/mock-config.json5 | 16 + .../src/ohosTest/ets/test/Ability.test.ets | 171 +++++++ .../entry/src/ohosTest/ets/test/List.test.ets | 19 + .../entry/src/ohosTest/ets/utils/Logger.ets | 45 ++ .../entry/src/ohosTest/module.json5 | 26 + .../DisplaySync/entry/src/test/List.test.ets | 19 + .../entry/src/test/LocalUnit.test.ets | 47 ++ .../DisplaySync/hvigor/hvigor-config.json5 | 36 ++ ArkGraphics2D/DisplaySync/hvigorfile.ts | 20 + ArkGraphics2D/DisplaySync/oh-package.json5 | 24 + ArkGraphics2D/DisplaySync/ohosTest.md | 19 + .../DisplaySync/screenshots/device/UI.png | Bin 0 -> 12543 bytes .../screenshots/device/XComponent.png | Bin 0 -> 12483 bytes .../screenshots/device/animation.png | Bin 0 -> 12407 bytes .../DisplaySync/screenshots/device/index.png | Bin 0 -> 13346 bytes 105 files changed, 4464 insertions(+) create mode 100644 ArkGraphics2D/DisplaySoloist/.gitignore create mode 100644 ArkGraphics2D/DisplaySoloist/AppScope/app.json5 create mode 100644 ArkGraphics2D/DisplaySoloist/AppScope/resources/base/element/string.json create mode 100644 ArkGraphics2D/DisplaySoloist/AppScope/resources/base/media/app_icon.png create mode 100644 ArkGraphics2D/DisplaySoloist/README.md create mode 100644 ArkGraphics2D/DisplaySoloist/build-profile.json5 create mode 100644 ArkGraphics2D/DisplaySoloist/code-linter.json5 create mode 100644 ArkGraphics2D/DisplaySoloist/entry/.gitignore create mode 100644 ArkGraphics2D/DisplaySoloist/entry/build-profile.json5 create mode 100644 ArkGraphics2D/DisplaySoloist/entry/hvigorfile.ts create mode 100644 ArkGraphics2D/DisplaySoloist/entry/obfuscation-rules.txt create mode 100644 ArkGraphics2D/DisplaySoloist/entry/oh-package.json5 create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/CMakeLists.txt create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/common/log_common.h create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/napi_init.cpp create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/plugin/plugin_manager.cpp create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/plugin/plugin_manager.h create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/samples/sample_xcomponent.cpp create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/samples/sample_xcomponent.h create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/ets/interface/XComponentContext.ts create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/ets/pages/Index.ets create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/ets/utils/Logger.ets create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/module.json5 create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/element/color.json create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/element/string.json create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/media/background.png create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/media/foreground.png create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/media/layered_image.json create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/media/startIcon.png create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/profile/backup_config.json create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/profile/main_pages.json create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/resources/en_US/element/string.json create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/main/resources/zh_CN/element/string.json create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/mock/Libentry.mock.ets create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/mock/mock-config.json5 create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/utils/Logger.ets create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/module.json5 create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/test/List.test.ets create mode 100644 ArkGraphics2D/DisplaySoloist/entry/src/test/LocalUnit.test.ets create mode 100644 ArkGraphics2D/DisplaySoloist/hvigor/hvigor-config.json5 create mode 100644 ArkGraphics2D/DisplaySoloist/hvigorfile.ts create mode 100644 ArkGraphics2D/DisplaySoloist/oh-package.json5 create mode 100644 ArkGraphics2D/DisplaySoloist/ohosTest.md create mode 100644 ArkGraphics2D/DisplaySoloist/screenshots/device/index.png create mode 100644 ArkGraphics2D/DisplaySync/.gitignore create mode 100644 ArkGraphics2D/DisplaySync/AppScope/app.json5 create mode 100644 ArkGraphics2D/DisplaySync/AppScope/resources/base/element/string.json create mode 100644 ArkGraphics2D/DisplaySync/AppScope/resources/base/media/app_icon.png create mode 100644 ArkGraphics2D/DisplaySync/README.md create mode 100644 ArkGraphics2D/DisplaySync/build-profile.json5 create mode 100644 ArkGraphics2D/DisplaySync/code-linter.json5 create mode 100644 ArkGraphics2D/DisplaySync/entry/.gitignore create mode 100644 ArkGraphics2D/DisplaySync/entry/build-profile.json5 create mode 100644 ArkGraphics2D/DisplaySync/entry/hvigorfile.ts create mode 100644 ArkGraphics2D/DisplaySync/entry/obfuscation-rules.txt create mode 100644 ArkGraphics2D/DisplaySync/entry/oh-package.json5 create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/cpp/CMakeLists.txt create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/cpp/common/log_common.h create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/cpp/napi_init.cpp create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/cpp/plugin/plugin_manager.cpp create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/cpp/plugin/plugin_manager.h create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/cpp/samples/sample_xcomponent.cpp create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/cpp/samples/sample_xcomponent.h create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/CustomDrawDisplaySync.ets create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/PropertyAnimationDisplaySync.ets create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/XComponentDisplaySync.ets create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/ets/interface/XComponentContext.ts create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/ets/pages/Index.ets create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/ets/utils/Logger.ets create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/module.json5 create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/resources/base/element/color.json create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/resources/base/element/string.json create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/resources/base/media/background.png create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/resources/base/media/foreground.png create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/resources/base/media/layered_image.json create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/resources/base/media/startIcon.png create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/resources/base/profile/backup_config.json create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/resources/base/profile/main_pages.json create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/resources/en_US/element/string.json create mode 100644 ArkGraphics2D/DisplaySync/entry/src/main/resources/zh_CN/element/string.json create mode 100644 ArkGraphics2D/DisplaySync/entry/src/mock/mock-config.json5 create mode 100644 ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/utils/Logger.ets create mode 100644 ArkGraphics2D/DisplaySync/entry/src/ohosTest/module.json5 create mode 100644 ArkGraphics2D/DisplaySync/entry/src/test/List.test.ets create mode 100644 ArkGraphics2D/DisplaySync/entry/src/test/LocalUnit.test.ets create mode 100644 ArkGraphics2D/DisplaySync/hvigor/hvigor-config.json5 create mode 100644 ArkGraphics2D/DisplaySync/hvigorfile.ts create mode 100644 ArkGraphics2D/DisplaySync/oh-package.json5 create mode 100644 ArkGraphics2D/DisplaySync/ohosTest.md create mode 100644 ArkGraphics2D/DisplaySync/screenshots/device/UI.png create mode 100644 ArkGraphics2D/DisplaySync/screenshots/device/XComponent.png create mode 100644 ArkGraphics2D/DisplaySync/screenshots/device/animation.png create mode 100644 ArkGraphics2D/DisplaySync/screenshots/device/index.png diff --git a/ArkGraphics2D/DisplaySoloist/.gitignore b/ArkGraphics2D/DisplaySoloist/.gitignore new file mode 100644 index 000000000..ea27eaff8 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/.gitignore @@ -0,0 +1,13 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test +/.appanalyzer +oh-package-lock.json5 \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/AppScope/app.json5 b/ArkGraphics2D/DisplaySoloist/AppScope/app.json5 new file mode 100644 index 000000000..4059b8b3a --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/AppScope/app.json5 @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +{ + "app": { + "bundleName": "com.samples.Displaysoloist", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/ArkGraphics2D/DisplaySoloist/AppScope/resources/base/element/string.json b/ArkGraphics2D/DisplaySoloist/AppScope/resources/base/element/string.json new file mode 100644 index 000000000..8f27bbd63 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "DisplaySoloist" + } + ] +} diff --git a/ArkGraphics2D/DisplaySoloist/AppScope/resources/base/media/app_icon.png b/ArkGraphics2D/DisplaySoloist/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a39445dc87828b76fed6d2ec470dd455c45319e3 GIT binary patch literal 2777 zcmV;~3MTc5P)9*YHQQH znh@I(s7WDIN`nJ+5@|<)iZcg=qN74U#DNnD1Se7u4fs(|1ivr?9ayP|B3iYCD$mfQ zCQ{S1n2)}^yxe#1J=_0pt-a1UPwQ^Z*?X_`Uu*sM+8<}X+baE^a`3seUF}?bEaiMO zrD`Qrd5@qw^epHZ>Df|p-qKBUEB%*?!m0{PHC6j|RplEgR~PkM5a^}N)Sfwi>W;Uz zdhwo_4HXBU%kRl^w@&7iKPx$e-n9%#IU!&oMI~iNsw0n19qSX;dS>I`G_G=WdcN9r z;_Rtv9XC<7kbL+HHxJ782T~pg05t)tf^>2vNJqfYt{YmqQDoBxkv+ra*BxxhcuK2v zm5%@Y)biQz)R8O%e=o%n${;ojY;EUP>`Qj6Cq)7GHm)C%2%^+hI;Z4T#a|oKIvshv z5H%!I+|I4PEXaXj04%ybsVolr%vhKnW7AEhC?eP!o1{y;8m2R#;}{6VZPc!+)ou0C zVWz$|1#2(|L5z%EYRxOzP+uLB>qYGuajX-<#^u;Kw&2uh&93)h>nHaFA%{&2PW=Nn zr?*a;gk3xvRhQIRa1de-!r(ss&?tRmZ=L2FMkhxI3lK6Jn<>5c*ID|@KU#^MCIo6> zpFA{|R(4fsBwHIW z9v!7G|7enadv4}~*8q_h%tD^j$7=PCnn0=dR0GKA(fgb9`2IRg6ksBIo+Gdw#|-3eSe=3tmDe zIqVN)tScM`0W#Z>2wc>~2Uv=3L)~D4gXqZtPQ8rifbYJqwkG>bv}95G7+};9Br?hF zWSa3b)X}z#79W9kukM%6-b_54WDJm~Ub=gsrJ0lz-8&lrQ7zfK1qzuZQkZvcE3|~S zZWmk0ETaNIHnMALn>akuvHLf5c4`y%!f+u>ZGp%@q_;T!`76_snc_?K;Wx%YpF;5K zw^F+BCYUPy`fpRif@5O@Im5cf?evD$>KlAgX;D0*HiO0`Yg3j;R4jT(9h(L_TsY6yxk*@ZBe%+dMqY=cB5oGs{D$QwOFbH)G$iVf<3Olcd7^#fr- zM{!ILWt#coT)s9ySkwDCPHv0oww8g8K%Yr{aR}msELVX(}JQr%F4Q8=KKn*OjSO*uSp;JK%GwhRF_K??vGC$ZqmJX z@+}8sQ)9Z}3*DiWl+L_7OXn_^{SW~2&C*b^;%IP!j$lkre7H&bMR1}7aTT*G8P}|G zHM1)hZDe{r_E3{{Y=d}}_PxJO_w4MaE4)$<<3JwzPdwPzfNemK(-X;{UCzmVr0zu5 zEnT}fzx)oVd!*W77`1Ig`DFcZ6TkPaI$hO1+`cGb$({ukz&{p4Ic-Xnwrg-KEkDqW zW3l$7Q`V$!1T(=QL1jgjIachdr75>-8>1A^h+;rTrD^nnwf?bw(Rang!*16Odj$Pn z@)JN5&5w~}ae6d};oa|&G>sT!)ixE#5;QW(u(=bqYHXcOflE%@t4A?n5fTUm0F~8_ zwpoz9rrU`@G=vsNjDRY(CrF(jIjqg8bd|CP02>eFag7T?u;C^ir+Z7YKmBYw;%%XdT2T}a$X4yR7EI;zaof3a)5Z;`OwVi%D?gbkBj!{;z2tOBSFk&E1DeiZXD**uvNqL}+|pO{ ztO$}2NMRit2ddU?)7Prq&*&H3X>&=E{-+j4iUz zrvL;?0$^@lyl=LHz9G^$SJV6ID__@7z->Bh>Vm=6AK&5bP%@heveHja5F@agGgUsY z@L@W2+^*NVoId0!kS~4XkWb%y;f}XBf>S+NIw9aHK;vN+4mJ|em)_QjIVfb2$;bwv zDKmoq6AThgKydS6Hs+UpKPWq|UA}s=UOEBZNM3oNT5qTAabY)X>L6jxfGDuu7&GD_ z=@@m?sJ-o2GS}&hNRW}-zHkr>o4&138@a8IC-FjSBxzjx?(*3@YmdmWGAd%0QvXzS zJ53JpX%Fp!=>v&`Hd7F@+Atw2vx9%^2M-APg0Jd|ePsRn3*B$#9Z5hCou4fo7W#SN z#}-@-N=##yQDh26pNzr9f*Q88krhI5@DHcf{dU-~PLSs}MvI4s1i|<=qxD~9`7>*~ znlw5lr$_6mTG4XbBNF_79BzvZ!TeIP)exdk3)kSHjYdW1P10ZJ_NCJSlrCuIU#gqw f88(SSw!Z%ZUzhC#9QlKF00000NkvXXu0mjfG$}gK literal 0 HcmV?d00001 diff --git a/ArkGraphics2D/DisplaySoloist/README.md b/ArkGraphics2D/DisplaySoloist/README.md new file mode 100644 index 000000000..6cc4eb090 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/README.md @@ -0,0 +1,83 @@ +# DisplaySoloist分级管控 + +### 介绍 + +本示例通过 DisplaySoloist 系列功能,使用 UI 外的线程对 XComponent 的绘制内容,设置开发者所期望的帧率。使用 [NativeDisplaySoloist](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/graphics/displaysoloist-native-guidelines.md) 和 [Drawing](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/graphics/drawing-guidelines.md) 来实现图像绘制和显示。 + +### 效果预览 + +| XComponent | +| :------------------------------------------------------: | +| | + +使用说明 + +1.进入 XComponent 页面,依次点击“**Start**”,三个方块分别按照 30Hz、60Hz、120Hz 移动;点击“**Stop**”动画停止。 + +### 工程目录 + +``` +├──entry/src/main +│ ├──cpp // C++代码区 +│ │ ├──CMakeLists.txt // CMake配置文件 +│ │ ├──napi_init.cpp // Napi模块注册 +│ │ ├──common +│ │ │ └──log_common.h // 日志封装定义文件 +│ │ ├──plugin // 生命周期管理模块 +│ │ │ ├──plugin_manager.cpp +│ │ │ └──plugin_manager.h +│ │ ├──samples // samples渲染模块 +│ │ │ ├──sample_xcomponent.cpp +│ │ │ └──sample_xcomponent.h +│ ├──ets // ets代码区 +│ │ ├──entryability +│ │ │ ├──EntryAbility.ts // 程序入口类 +| | | └──EntryAbility.ets +| | ├──interface +│ │ │ └──XComponentContext.ts // XComponentContext +│ │ ├──pages // 页面文件 +│ │ | └──Index.ets // XComponent页面 +│ │ ├──utils // 工具类 +| ├──resources // 资源文件目录 +``` + +### 具体实现 + +* XComponent:通过在 IDE 中的 Native C++ 工程,在 TS 侧中声明对外接口为 register、unregister 以及 destroy;在 C++ 侧调用 NativeDisplaySoloist 分级管控接口,并在使用 drawing 来绘制期望帧率图像。 + + | 接口名 | 描述 | + | ------------------------------------------- | --------------------------------------------------- | + | OH_DisplaySoloist_Create | 创建一个OH_DisplaySoloist实例 | + | OH_DisplaySoloist_Destroy | 销毁一个OH_DisplaySoloist实例 | + | OH_DisplaySoloist_Start | 设置每帧回调函数,每次vsync信号到来时启动每帧回调 | + | OH_DisplaySoloist_Stop | 停止请求下一次vsync信号,并停止调用回调函数callback | + | OH_DisplaySoloist_SetExpectedFrameRateRange | 设置期望帧率范围 | + + +### 相关权限 + +不涉及。 + +### 依赖 + +不涉及。 + +### 约束与限制 + +1.本示例仅支持在标准系统上运行; + +2.本示例为 Stage 模型,已适配 API version 14 版本 SDK,SDK 版本号(API Version 14 5.0.2.57); + +3.本示例需要使用 DevEco Studio 版本号(5.0.5.306)及以上版本才可编译运行。 + +### 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo code/DocsSample/graphic/DisplaySoloist/ > .git/info/sparse-checkout +git remote add origin https://gitee.com/openharmony/applications_app_samples.git +git pull origin master +``` \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/build-profile.json5 b/ArkGraphics2D/DisplaySoloist/build-profile.json5 new file mode 100644 index 000000000..de594a6c8 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/build-profile.json5 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +{ + "app": { + "products": [ + { + "name": "default", + "signingConfig": "default", + "compileSdkVersion": 14, + "compatibleSdkVersion": 14, + "runtimeOS": "OpenHarmony", + "buildOption": { + "externalNativeOptions": { + "abiFilters": [ + "arm64-v8a", + "x86_64", + "armeabi-v7a" + ] + } + } + } + ], + "buildModeSet": [ + { + "name": "debug" + }, + { + "name": "release" + } + ], + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/code-linter.json5 b/ArkGraphics2D/DisplaySoloist/code-linter.json5 new file mode 100644 index 000000000..3311c9280 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/code-linter.json5 @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/.gitignore b/ArkGraphics2D/DisplaySoloist/entry/.gitignore new file mode 100644 index 000000000..eadab4e15 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/.gitignore @@ -0,0 +1,7 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test +/oh-package-lock.json5 \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/build-profile.json5 b/ArkGraphics2D/DisplaySoloist/entry/build-profile.json5 new file mode 100644 index 000000000..13781d517 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/build-profile.json5 @@ -0,0 +1,53 @@ +/* + * 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. + */ +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/hvigorfile.ts b/ArkGraphics2D/DisplaySoloist/entry/hvigorfile.ts new file mode 100644 index 000000000..037010409 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/hvigorfile.ts @@ -0,0 +1,20 @@ +/* + * 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 { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins: [] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/ArkGraphics2D/DisplaySoloist/entry/obfuscation-rules.txt b/ArkGraphics2D/DisplaySoloist/entry/obfuscation-rules.txt new file mode 100644 index 000000000..272efb6ca --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/obfuscation-rules.txt @@ -0,0 +1,23 @@ +# Define project specific obfuscation rules here. +# You can include the obfuscation configuration files in the current module's build-profile.json5. +# +# For more details, see +# https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/source-obfuscation-V5 + +# Obfuscation options: +# -disable-obfuscation: disable all obfuscations +# -enable-property-obfuscation: obfuscate the property names +# -enable-toplevel-obfuscation: obfuscate the names in the global scope +# -compact: remove unnecessary blank spaces and all line feeds +# -remove-log: remove all console.* statements +# -print-namecache: print the name cache that contains the mapping from the old names to new names +# -apply-namecache: reuse the given cache file + +# Keep options: +# -keep-property-name: specifies property names that you want to keep +# -keep-global-name: specifies names that you want to keep in the global scope + +-enable-property-obfuscation +-enable-toplevel-obfuscation +-enable-filename-obfuscation +-enable-export-obfuscation \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/oh-package.json5 b/ArkGraphics2D/DisplaySoloist/entry/oh-package.json5 new file mode 100644 index 000000000..1182eecc3 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/oh-package.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + "libentry.so": "file:./src/main/cpp/types/libentry" + } +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/CMakeLists.txt b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 000000000..0e5253594 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,23 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(drawing_test) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED + napi_init.cpp + samples/sample_xcomponent.cpp + plugin/plugin_manager.cpp +) +find_library( + # Sets the name of the path variable. + hilog-lib + # Specifies the name of the NDK library that + # you want CMake to locate. + hilog_ndk.z +) +target_link_libraries(entry PUBLIC ${hilog-lib}) +target_link_libraries(entry PUBLIC libace_napi.z.so libnative_drawing.so libnative_window.so libace_ndk.z.so libnative_display_soloist.so) \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/common/log_common.h b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/common/log_common.h new file mode 100644 index 000000000..fb896663b --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/common/log_common.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef LOG_COMMON_H +#define LOG_COMMON_H +#include +#define LOG_PRINT_DOMAIN 0xFF00 +#define APP_LOG_DOMAIN 0x0001 +constexpr const char *APP_LOG_TAG = "DisplaySoloistSample"; +#define SAMPLE_LOGI(...) ((void)OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, APP_LOG_TAG, __VA_ARGS__)) +#define SAMPLE_LOGD(...) ((void)OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_DOMAIN, APP_LOG_TAG, __VA_ARGS__)) +#define SAMPLE_LOGW(...) ((void)OH_LOG_Print(LOG_APP, LOG_WARN, LOG_DOMAIN, APP_LOG_TAG, __VA_ARGS__)) +#define SAMPLE_LOGE(...) ((void)OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_DOMAIN, APP_LOG_TAG, __VA_ARGS__)) + +#endif // LOG_COMMON_H diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/napi_init.cpp b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 000000000..8e3c41842 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include "napi/native_api.h" +#include "common/log_common.h" +#include "plugin/plugin_manager.h" + +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + SAMPLE_LOGI("napi init"); + PluginManager::GetInstance()->Export(env, exports); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void *)0), + .reserved = {0}, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); } diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/plugin/plugin_manager.cpp b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/plugin/plugin_manager.cpp new file mode 100644 index 000000000..3e27aa378 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/plugin/plugin_manager.cpp @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include "common/log_common.h" +#include "plugin_manager.h" + +PluginManager *PluginManager::GetInstance() +{ + static PluginManager pluginManager; + return &pluginManager; +} + +PluginManager::~PluginManager() +{ + SAMPLE_LOGI("~PluginManager"); + for (auto iter = nativeXComponentMap_.begin(); iter != nativeXComponentMap_.end(); ++iter) { + if (iter->second != nullptr) { + delete iter->second; + iter->second = nullptr; + } + } + nativeXComponentMap_.clear(); + + for (auto iter = pluginRenderMap_.begin(); iter != pluginRenderMap_.end(); ++iter) { + if (iter->second != nullptr) { + delete iter->second; + iter->second = nullptr; + } + } + pluginRenderMap_.clear(); +} + +// [Start display_soloist_export_api] +void PluginManager::Export(napi_env env, napi_value exports) +{ + nativeXComponentMap_.clear(); + pluginRenderMap_.clear(); + if ((env == nullptr) || (exports == nullptr)) { + SAMPLE_LOGE("Export: env or exports is null"); + return; + } + + napi_value exportInstance = nullptr; + if (napi_get_named_property(env, exports, OH_NATIVE_XCOMPONENT_OBJ, &exportInstance) != napi_ok) { + SAMPLE_LOGE("Export: napi_get_named_property fail"); + return; + } + + OH_NativeXComponent *nativeXComponent = nullptr; + if (napi_unwrap(env, exportInstance, reinterpret_cast(&nativeXComponent)) != napi_ok) { + SAMPLE_LOGE("Export: napi_unwrap fail"); + return; + } + + char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {'\0'}; + uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1; + if (OH_NativeXComponent_GetXComponentId(nativeXComponent, idStr, &idSize) != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) { + SAMPLE_LOGE("Export: OH_NativeXComponent_GetXComponentId fail"); + return; + } + + std::string id(idStr); + auto context = PluginManager::GetInstance(); + if ((context != nullptr) && (nativeXComponent != nullptr)) { + context->SetNativeXComponent(id, nativeXComponent); + auto render = context->GetRender(id); + if (render != nullptr) { + render->RegisterCallback(nativeXComponent); + render->Export(env, exports); + } else { + SAMPLE_LOGE("render is nullptr"); + } + } +} +// [End display_soloist_export_api] + +void PluginManager::SetNativeXComponent(std::string &id, OH_NativeXComponent *nativeXComponent) +{ + SAMPLE_LOGI("set native xComponent, ID = %{public}s.", id.c_str()); + if (nativeXComponent == nullptr) { + SAMPLE_LOGE("xcomponent null"); + return; + } + + if (nativeXComponentMap_.find(id) == nativeXComponentMap_.end()) { + nativeXComponentMap_[id] = nativeXComponent; + return; + } + + if (nativeXComponentMap_[id] != nativeXComponent) { + OH_NativeXComponent *tmp = nativeXComponentMap_[id]; + delete tmp; + tmp = nullptr; + nativeXComponentMap_[id] = nativeXComponent; + } +} + +SampleXComponent *PluginManager::GetRender(std::string &id) +{ + if (pluginRenderMap_.find(id) == pluginRenderMap_.end()) { + SampleXComponent *instance = SampleXComponent::GetInstance(id); + pluginRenderMap_[id] = instance; + return instance; + } + return pluginRenderMap_[id]; +} diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/plugin/plugin_manager.h b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/plugin/plugin_manager.h new file mode 100644 index 000000000..a590755fb --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/plugin/plugin_manager.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef PLUGIN_MANAGER_H +#define PLUGIN_MANAGER_H + +#include +#include +#include +#include +#include +#include "samples/sample_xcomponent.h" + +// [Start display_soloist_create_plugin_manager] +class PluginManager { +public: + ~PluginManager(); + + static PluginManager *GetInstance(); + + void SetNativeXComponent(std::string &id, OH_NativeXComponent *nativeXComponent); + SampleXComponent *GetRender(std::string &id); + void Export(napi_env env, napi_value exports); + +private: + std::unordered_map nativeXComponentMap_; + std::unordered_map pluginRenderMap_; +}; +// [End display_soloist_create_plugin_manager] +#endif // PLUGIN_MANAGER_H diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/samples/sample_xcomponent.cpp b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/samples/sample_xcomponent.cpp new file mode 100644 index 000000000..6d536b715 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/samples/sample_xcomponent.cpp @@ -0,0 +1,473 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include "common/log_common.h" +#include "sample_xcomponent.h" + +static std::unordered_map g_displaySync; + +static void OnSurfaceCreatedCB(OH_NativeXComponent *component, void *window) +{ + SAMPLE_LOGI("OnSurfaceCreatedCB"); + if ((component == nullptr) || (window == nullptr)) { + SAMPLE_LOGE("OnSurfaceCreatedCB: component or window is null"); + return; + } + char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {'\0'}; + uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1; + if (OH_NativeXComponent_GetXComponentId(component, idStr, &idSize) != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) { + SAMPLE_LOGE("OnSurfaceCreatedCB: Unable to get XComponent id"); + return; + } + std::string id(idStr); + auto render = SampleXComponent::GetInstance(id); + OHNativeWindow *nativeWindow = static_cast(window); + render->SetNativeWindow(nativeWindow); + + uint64_t width; + uint64_t height; + int32_t xSize = OH_NativeXComponent_GetXComponentSize(component, window, &width, &height); + if ((xSize == OH_NATIVEXCOMPONENT_RESULT_SUCCESS) && (render != nullptr)) { + render->SetHeight(height); + render->SetWidth(width); + SAMPLE_LOGI("xComponent width = %{public}llu, height = %{public}llu", width, height); + } +} + +static void OnSurfaceDestroyedCB(OH_NativeXComponent *component, void *window) +{ + SAMPLE_LOGI("OnSurfaceDestroyedCB"); + if ((component == nullptr) || (window == nullptr)) { + SAMPLE_LOGE("OnSurfaceDestroyedCB: component or window is null"); + return; + } + char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {'\0'}; + uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1; + if (OH_NativeXComponent_GetXComponentId(component, idStr, &idSize) != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) { + SAMPLE_LOGE("OnSurfaceDestroyedCB: Unable to get XComponent id"); + return; + } + std::string id(idStr); + SampleXComponent::Release(id); +} + +// [Start display_soloist_frame_rate_setting_and_subscription_function_registration] +static void TestCallback(long long timestamp, long long targetTimestamp, void *data) +{ + SAMPLE_LOGI("test callback timestamp = %{public}llu, ", timestamp); + OH_NativeXComponent *component = nullptr; + component = static_cast(data); + if (component == nullptr) { + SAMPLE_LOGE("TestCallback: component is null"); + return; + } + + char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {'\0'}; + uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1; + if (OH_NativeXComponent_GetXComponentId(component, idStr, &idSize) != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) { + SAMPLE_LOGE("TestCallback: Unable to get XComponent id"); + return; + } + + std::string id(idStr); + auto render = SampleXComponent::GetInstance(id); + OHNativeWindow *nativeWindow = render->GetNativeWindow(); + uint64_t width; + uint64_t height; + + int32_t xSize = OH_NativeXComponent_GetXComponentSize(component, nativeWindow, &width, &height); + if ((xSize == OH_NATIVEXCOMPONENT_RESULT_SUCCESS) && (render != nullptr)) { + render->Prepare(); + render->Create(); + if (id == "xcomponentId_30") { + int offset = 16; + render->ConstructPath(offset, offset, render->defaultOffsetY); + } + if (id == "xcomponentId_120") { + int offset = 4; + render->ConstructPath(offset, offset, render->defaultOffsetY); + } + render->SetPenAndBrush(); + render->DrawPath(); + render->DisPlay(); + render->Destroy(); + } +} +// [End display_soloist_frame_rate_setting_and_subscription_function_registration] + +static std::unordered_map g_instance; + +void SampleXComponent::SetWidth(uint64_t width) { width_ = width; } + +void SampleXComponent::SetHeight(uint64_t height) { height_ = height; } + +void SampleXComponent::SetNativeWindow(OHNativeWindow *nativeWindow) { nativeWindow_ = nativeWindow; } + +OHNativeWindow *SampleXComponent::GetNativeWindow() { return nativeWindow_; } + +void SampleXComponent::Prepare() +{ + if (nativeWindow_ == nullptr) { + SAMPLE_LOGE("nativeWindow_ is nullptr"); + return; + } + int ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow_, &buffer_, &fenceFd_); + SAMPLE_LOGI("request buffer ret = %{public}d", ret); + bufferHandle_ = OH_NativeWindow_GetBufferHandleFromNative(buffer_); + mappedAddr_ = static_cast( + mmap(bufferHandle_->virAddr, bufferHandle_->size, PROT_READ | PROT_WRITE, MAP_SHARED, bufferHandle_->fd, 0)); + if (mappedAddr_ == MAP_FAILED) { + SAMPLE_LOGE("mmap failed"); + } +} + +void SampleXComponent::DisPlay() +{ + void *bitmapAddr = OH_Drawing_BitmapGetPixels(cBitmap_); + uint32_t *value = static_cast(bitmapAddr); + + uint32_t *pixel = static_cast(mappedAddr_); + if (pixel == nullptr) { + SAMPLE_LOGE("pixel is null"); + return; + } + if (value == nullptr) { + SAMPLE_LOGE("value is null"); + return; + } + for (uint32_t x = 0; x < width_; x++) { + for (uint32_t y = 0; y < height_; y++) { + *pixel++ = *value++; + } + } + Region region{nullptr, 0}; + OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow_, buffer_, fenceFd_, region); + int result = munmap(mappedAddr_, bufferHandle_->size); + if (result == -1) { + SAMPLE_LOGE("munmap failed!"); + } +} + +void SampleXComponent::Create() +{ + uint32_t width = static_cast(bufferHandle_->stride / 4); + cBitmap_ = OH_Drawing_BitmapCreate(); + OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE}; + OH_Drawing_BitmapBuild(cBitmap_, width, height_, &cFormat); + + cCanvas_ = OH_Drawing_CanvasCreate(); + OH_Drawing_CanvasBind(cCanvas_, cBitmap_); + OH_Drawing_CanvasClear(cCanvas_, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0xFF, 0xFF)); +} + +void SampleXComponent::ConstructPath(int x, int y, int offsetY) +{ + float offsetOfAy = 100.0; + float offsetOfCy = 200.0; + + aY = offsetOfAy + offsetY; + cY = offsetOfCy + offsetY; + + if (desc) { + float offset = 1.0; + aX -= x * offset; + bX -= x * offset; + } else { + float offset = 1.0; + aX += x * offset; + bX += x * offset; + } + + if (bX >= width_) { + desc = true; + } + + if (aX <= 0) { + desc = false; + } + + float bY = aY; + float cX = bX; + float dX = aX; + float dY = cY; + + cPath_ = OH_Drawing_PathCreate(); + OH_Drawing_PathMoveTo(cPath_, aX, aY); + OH_Drawing_PathLineTo(cPath_, bX, bY); + OH_Drawing_PathLineTo(cPath_, cX, cY); + OH_Drawing_PathLineTo(cPath_, dX, dY); + + OH_Drawing_PathClose(cPath_); +} + +void SampleXComponent::SetPenAndBrush() +{ + constexpr float penWidth = 10.0f; // pen width 10 + cPen_ = OH_Drawing_PenCreate(); + OH_Drawing_PenSetAntiAlias(cPen_, true); + OH_Drawing_PenSetColor(cPen_, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0x00, 0x00)); + OH_Drawing_PenSetWidth(cPen_, penWidth); + OH_Drawing_PenSetJoin(cPen_, LINE_ROUND_JOIN); + OH_Drawing_CanvasAttachPen(cCanvas_, cPen_); + + cBrush_ = OH_Drawing_BrushCreate(); + OH_Drawing_BrushSetColor(cBrush_, OH_Drawing_ColorSetArgb(0xFF, 0x00, 0xFF, 0x00)); + + OH_Drawing_CanvasAttachBrush(cCanvas_, cBrush_); +} + +void SampleXComponent::DrawPath() +{ + OH_Drawing_CanvasDrawPath(cCanvas_, cPath_); +} + +void ExecuteDisplaySoloist(std::string id, DisplaySoloist_ExpectedRateRange range, bool useExclusiveThread, + OH_NativeXComponent *nativeXComponent) +{ + OH_DisplaySoloist *nativeDisplaySoloist = nullptr; + if (g_displaySync.find(id) == g_displaySync.end()) { + g_displaySync[id] = OH_DisplaySoloist_Create(useExclusiveThread); + } + nativeDisplaySoloist = g_displaySync[id]; + OH_DisplaySoloist_SetExpectedFrameRateRange(nativeDisplaySoloist, &range); + OH_DisplaySoloist_Start(nativeDisplaySoloist, TestCallback, nativeXComponent); +} + +// [Start display_soloist_napi_register] +napi_value SampleXComponent::NapiRegister(napi_env env, napi_callback_info info) +{ + SAMPLE_LOGI("NapiRegister"); + if ((env == nullptr) || (info == nullptr)) { + SAMPLE_LOGE("NapiRegister: env or info is null"); + return nullptr; + } + + napi_value thisArg; + if (napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, nullptr) != napi_ok) { + SAMPLE_LOGE("NapiRegister: napi_get_cb_info fail"); + return nullptr; + } + + napi_value exportInstance; + if (napi_get_named_property(env, thisArg, OH_NATIVE_XCOMPONENT_OBJ, &exportInstance) != napi_ok) { + SAMPLE_LOGE("NapiRegister: napi_get_named_property fail"); + return nullptr; + } + + OH_NativeXComponent *nativeXComponent = nullptr; + if (napi_unwrap(env, exportInstance, reinterpret_cast(&nativeXComponent)) != napi_ok) { + SAMPLE_LOGE("NapiRegister: napi_unwrap fail"); + return nullptr; + } + + char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {'\0'}; + uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1; + if (OH_NativeXComponent_GetXComponentId(nativeXComponent, idStr, &idSize) != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) { + SAMPLE_LOGE("NapiRegister: Unable to get XComponent id"); + return nullptr; + } + SAMPLE_LOGI("RegisterID = %{public}s", idStr); + std::string id(idStr); + SampleXComponent *render = SampleXComponent().GetInstance(id); + if (render != nullptr) { + DisplaySoloist_ExpectedRateRange range; + bool useExclusiveThread = false; + if (id == "xcomponentId30") { + range = {30, 120, 30}; + } + + if (id == "xcomponentId120") { + range = {30, 120, 120}; + } + ExecuteDisplaySoloist(id, range, useExclusiveThread, nativeXComponent); + } + return nullptr; +} +// [End display_soloist_napi_register] + +napi_value SampleXComponent::NapiUnregister(napi_env env, napi_callback_info info) +{ + SAMPLE_LOGI("NapiUnregister"); + if ((env == nullptr) || (info == nullptr)) { + SAMPLE_LOGE("NapiUnregister: env or info is null"); + return nullptr; + } + + napi_value thisArg; + if (napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, nullptr) != napi_ok) { + SAMPLE_LOGE("NapiUnregister: napi_get_cb_info fail"); + return nullptr; + } + + napi_value exportInstance; + if (napi_get_named_property(env, thisArg, OH_NATIVE_XCOMPONENT_OBJ, &exportInstance) != napi_ok) { + SAMPLE_LOGE("NapiUnregister: napi_get_named_property fail"); + return nullptr; + } + + OH_NativeXComponent *nativeXComponent = nullptr; + if (napi_unwrap(env, exportInstance, reinterpret_cast(&nativeXComponent)) != napi_ok) { + SAMPLE_LOGE("NapiUnregister: napi_unwrap fail"); + return nullptr; + } + + char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {'\0'}; + uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1; + if (OH_NativeXComponent_GetXComponentId(nativeXComponent, idStr, &idSize) != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) { + SAMPLE_LOGE("NapiUnregister: Unable to get XComponent id"); + return nullptr; + } + SAMPLE_LOGI("ID = %{public}s", idStr); + std::string id(idStr); + SampleXComponent *render = SampleXComponent().GetInstance(id); + if (render != nullptr) { + OH_DisplaySoloist_Stop(g_displaySync[id]); + SAMPLE_LOGI("NapiUnregister executed"); + } else { + SAMPLE_LOGE("render is nullptr"); + } + return nullptr; +} + +napi_value SampleXComponent::NapiDestroy(napi_env env, napi_callback_info info) +{ + SAMPLE_LOGI("NapiUnregister"); + if ((env == nullptr) || (info == nullptr)) { + SAMPLE_LOGE("NapiDestroy: env or info is null"); + return nullptr; + } + + napi_value thisArg; + if (napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, nullptr) != napi_ok) { + SAMPLE_LOGE("NapiDestroy: napi_get_cb_info fail"); + return nullptr; + } + + napi_value exportInstance; + if (napi_get_named_property(env, thisArg, OH_NATIVE_XCOMPONENT_OBJ, &exportInstance) != napi_ok) { + SAMPLE_LOGE("NapiDestroy: napi_get_named_property fail"); + return nullptr; + } + + OH_NativeXComponent *nativeXComponent = nullptr; + if (napi_unwrap(env, exportInstance, reinterpret_cast(&nativeXComponent)) != napi_ok) { + SAMPLE_LOGE("NapiDestroy: napi_unwrap fail"); + return nullptr; + } + + char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {'\0'}; + uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1; + if (OH_NativeXComponent_GetXComponentId(nativeXComponent, idStr, &idSize) != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) { + SAMPLE_LOGE("NapiDestroy: Unable to get XComponent id"); + return nullptr; + } + SAMPLE_LOGI("ID = %{public}s", idStr); + std::string id(idStr); + SampleXComponent *render = SampleXComponent().GetInstance(id); + if (render != nullptr) { + OH_DisplaySoloist_Destroy(g_displaySync[id]); + g_displaySync.erase(id); + SAMPLE_LOGI("NapiUnregister executed"); + } else { + SAMPLE_LOGE("render is nullptr"); + } + return nullptr; +} + +SampleXComponent::~SampleXComponent() +{ + OH_Drawing_BrushDestroy(cBrush_); + cBrush_ = nullptr; + OH_Drawing_PenDestroy(cPen_); + cPen_ = nullptr; + OH_Drawing_PathDestroy(cPath_); + cPath_ = nullptr; + OH_Drawing_CanvasDestroy(cCanvas_); + cCanvas_ = nullptr; + OH_Drawing_BitmapDestroy(cBitmap_); + cBitmap_ = nullptr; + + buffer_ = nullptr; + bufferHandle_ = nullptr; + nativeWindow_ = nullptr; + mappedAddr_ = nullptr; +} + +void SampleXComponent::Destroy() +{ + OH_Drawing_BrushDestroy(cBrush_); + cBrush_ = nullptr; + OH_Drawing_PenDestroy(cPen_); + cPen_ = nullptr; + OH_Drawing_PathDestroy(cPath_); + cPath_ = nullptr; + OH_Drawing_CanvasDestroy(cCanvas_); + cCanvas_ = nullptr; + OH_Drawing_BitmapDestroy(cBitmap_); + cBitmap_ = nullptr; +} + +void SampleXComponent::Release(std::string &id) +{ + SampleXComponent *render = SampleXComponent::GetInstance(id); + if (render != nullptr) { + delete render; + render = nullptr; + g_instance.erase(g_instance.find(id)); + } +} + +void SampleXComponent::Export(napi_env env, napi_value exports) +{ + if ((env == nullptr) || (exports == nullptr)) { + SAMPLE_LOGE("Export: env or exports is null"); + return; + } + napi_property_descriptor desc[] = { + {"register", nullptr, SampleXComponent::NapiRegister, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"unregister", nullptr, SampleXComponent::NapiUnregister, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"destroy", nullptr, SampleXComponent::NapiDestroy, nullptr, nullptr, nullptr, napi_default, nullptr}}; + + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + if (napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc) != napi_ok) { + SAMPLE_LOGE("Export: napi_define_properties failed"); + } +} + +void SampleXComponent::RegisterCallback(OH_NativeXComponent *nativeXComponent) +{ + SAMPLE_LOGI("register callback"); + renderCallback_.OnSurfaceCreated = OnSurfaceCreatedCB; + renderCallback_.OnSurfaceDestroyed = OnSurfaceDestroyedCB; + // Callback must be initialized + renderCallback_.DispatchTouchEvent = nullptr; + renderCallback_.OnSurfaceChanged = nullptr; + OH_NativeXComponent_RegisterCallback(nativeXComponent, &renderCallback_); +} + +SampleXComponent *SampleXComponent::GetInstance(std::string &id) +{ + if (g_instance.find(id) == g_instance.end()) { + SampleXComponent *render = new SampleXComponent(id); + g_instance[id] = render; + return render; + } else { + return g_instance[id]; + } +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/samples/sample_xcomponent.h b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/samples/sample_xcomponent.h new file mode 100644 index 000000000..926d45738 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/samples/sample_xcomponent.h @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef SAMPLE_XCOMPONENT_H +#define SAMPLE_XCOMPONENT_H +// [Start display_soloist_import_module] +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "napi/native_api.h" +// [End display_soloist_import_module] + +class SampleXComponent { +public: + SampleXComponent() = default; + ~SampleXComponent(); + explicit SampleXComponent(std::string id) : id_(id) {} + static napi_value NapiRegister(napi_env env, napi_callback_info info); + static napi_value NapiUnregister(napi_env env, napi_callback_info info); + static napi_value NapiDestroy(napi_env env, napi_callback_info info); + static void Release(std::string &id); + void DrawPath(); + void SetWidth(uint64_t width); + void SetHeight(uint64_t height); + void SetNativeWindow(OHNativeWindow *nativeWindow); + OHNativeWindow *GetNativeWindow(); + + void Prepare(); + void Create(); + void DisPlay(); + void ConstructPath(int x, int y, int offsetY); + void SetPenAndBrush(); + void Export(napi_env env, napi_value exports); + void RegisterCallback(OH_NativeXComponent *nativeXComponent); + void Destroy(); + static SampleXComponent *GetInstance(std::string &id); + std::string id_; + int defaultOffsetY = 100; + +private: + OH_NativeXComponent_Callback renderCallback_; + + uint64_t width_ = 0; + uint64_t height_ = 0; + + float aX = 0.0; + float aY = 0.0; + float bX = 80.0; + float cY = 0.0; + bool desc = false; + + OH_Drawing_Bitmap *cBitmap_ = nullptr; + OH_Drawing_Canvas *cCanvas_ = nullptr; + + OH_Drawing_Path *cPath_ = nullptr; + OH_Drawing_Brush *cBrush_ = nullptr; + OH_Drawing_Pen *cPen_ = nullptr; + OHNativeWindow *nativeWindow_ = nullptr; + uint32_t *mappedAddr_ = nullptr; + BufferHandle *bufferHandle_ = nullptr; + struct NativeWindowBuffer *buffer_ = nullptr; + int fenceFd_ = 0; +}; + +#endif diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/types/libentry/index.d.ts b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/types/libentry/index.d.ts new file mode 100644 index 000000000..72ce2401d --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/types/libentry/index.d.ts @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const add: (a: number, b: number) => number; \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/types/libentry/oh-package.json5 b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 000000000..8170db317 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,20 @@ +/* + * 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. + */ +{ + "name": "libentry.so", + "types": "./index.d.ts", + "version": "", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/entryability/EntryAbility.ets b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 000000000..1f6370af7 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +}; diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 000000000..be794f48c --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/interface/XComponentContext.ts b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/interface/XComponentContext.ts new file mode 100644 index 000000000..02bc5d0d3 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/interface/XComponentContext.ts @@ -0,0 +1,23 @@ +/* + * 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. + */ +// [Start display_soloist_export_interface_xcomponent_context] +export default interface XComponentContext { + register(): void; + + unregister(): void; + + destroy(): void; +}; +// [End display_soloist_export_interface_xcomponent_context] diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/pages/Index.ets b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/pages/Index.ets new file mode 100644 index 000000000..6d29fe87e --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,133 @@ +/* + * 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. + */ +// [Start display_soloist_create_xcomponent] +import XComponentContext from '../interface/XComponentContext'; +import Logger from '../utils/Logger'; + +const TAG = '[XComponentDisplaySoloist]'; + +@Entry +@Component +struct Index { + private xComponentContext1: XComponentContext | undefined = undefined; + private xComponentContext2: XComponentContext | undefined = undefined; + + // [StartExclude display_soloist_create_xcomponent] + // [Start display_soloist_disappear] + aboutToDisappear(): void { + Logger.info(TAG, 'aboutToDisappear'); + if (this.xComponentContext1) { + this.xComponentContext1.unregister(); + this.xComponentContext1.destroy(); + } + if (this.xComponentContext2) { + this.xComponentContext2.unregister(); + this.xComponentContext2.destroy(); + } + } + // [End display_soloist_disappear] + // [EndExclude display_soloist_create_xcomponent] + + build() { + Column() { + Row() { + // [StartExclude display_soloist_create_xcomponent] + Text('30fps') + .fontWeight(FontWeight.Bold) + .fontSize(12) + .fontColor(Color.Red) + .textAlign(TextAlign.End) + .width(40) + .height(30) + // [EndExclude display_soloist_create_xcomponent] + + XComponent({ + id: 'xcomponentId_30', + type: XComponentType.SURFACE, + libraryname: 'entry' + }) + .onLoad((xComponentContext) => { + this.xComponentContext1 = xComponentContext as XComponentContext; + }).width('640px') + .backgroundColor(Color.White) + }.height('40%') + + Row() { + // [StartExclude display_soloist_create_xcomponent] + Text('120fps') + .fontWeight(FontWeight.Bold) + .fontSize(12) + .fontColor(Color.Red) + .textAlign(TextAlign.End) + .width(40) + .height(30) + // [EndExclude display_soloist_create_xcomponent] + + XComponent({ + id: 'xcomponentId_120', + type: XComponentType.SURFACE, + libraryname: 'entry' + }) + .onLoad((xComponentContext) => { + this.xComponentContext2 = xComponentContext as XComponentContext; + }).width('640px') + .backgroundColor(Color.White) + }.height('40%') + // [End display_soloist_create_xcomponent] + + // [Start display_soloist_start_and_stop] + Row() { + Button('Start') + .id('Start') + .fontSize(14) + .fontWeight(500) + .margin({ bottom: 20, right: 6, left: 6 }) + .onClick(() => { + if (this.xComponentContext1) { + this.xComponentContext1.register(); + } + if (this.xComponentContext2) { + this.xComponentContext2.register(); + } + }) + .width('30%') + .height(40) + .shadow(ShadowStyle.OUTER_DEFAULT_LG) + + Button('Stop') + .id('Stop') + .fontSize(14) + .fontWeight(500) + .margin({ bottom: 20, left: 6 }) + .onClick(() => { + if (this.xComponentContext1) { + this.xComponentContext1.unregister(); + } + if (this.xComponentContext2) { + this.xComponentContext2.unregister(); + } + }) + .width('30%') + .height(40) + .shadow(ShadowStyle.OUTER_DEFAULT_LG) + + } + .justifyContent(FlexAlign.SpaceEvenly) + .width('100%') + .height('20%') + // [End display_soloist_start_and_stop] + } + } +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/utils/Logger.ets b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/utils/Logger.ets new file mode 100644 index 000000000..985faa3be --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/utils/Logger.ets @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import hilog from '@ohos.hilog'; + +class Logger { + private domain: number; + private prefix: string; + private format: string = '%{public}s, %{public}s'; + + constructor(prefix: string) { + this.prefix = prefix; + this.domain = 0xFF00; + } + + debug(...args: string[]) { + hilog.debug(this.domain, this.prefix, this.format, args); + } + + info(...args: string[]) { + hilog.info(this.domain, this.prefix, this.format, args); + } + + warn(...args: string[]) { + hilog.warn(this.domain, this.prefix, this.format, args); + } + + error(...args: string[]) { + hilog.error(this.domain, this.prefix, this.format, args); + } +} + +export default new Logger('[Sample_DisplaySoloist]'); \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/module.json5 b/ArkGraphics2D/DisplaySoloist/entry/src/main/module.json5 new file mode 100644 index 000000000..ca3c9ba31 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/module.json5 @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/element/color.json b/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/element/color.json new file mode 100644 index 000000000..3c712962d --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/element/string.json b/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/element/string.json new file mode 100644 index 000000000..7d5308ce7 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "Sample_DisplaySoloist" + } + ] +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/media/background.png b/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/media/foreground.png b/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 zcmeHuS6EX)+pUO#NL3(IK|}&d7YKwF5CM@UBE5tjTBw4Q5KwvxB2pw25vBJIB27p@ zOaSQt5eZd#CxmkF|4+F-=Q)?(#XNgvmzlk1)~tDFz3+~Fs;5bRo%8yoOPA=i9zS|^ z=@P~5f9V?4rAwDs!Yjfq4p(5Rx~i8hRVUG&*j~LT%Q>2AIqB+Nx_^yhg70E+c&i!%2~zqE0}mxIX= zz1$7|sWj&3yL#7D|4uLjQqV+x(Rz4WC{A9|^m@1A6`BNi38Cf3B^aJyqxF{TjS&2q=3$BC zB1Fu04C;%o9V_Yg;Ed;xpmge>%b<|5q52W_pTd9o;Qty2mQ+-Peu)^(K)RH^d5byH z>AGB-I7$|~9l)J0H_LPDsUUL#brIHpjO1>dJ9@_5&W zLV)s!AVn7*Hy{o<1zLA_Ky-TWzJ_^1=W=Gfyc#1ssqeY_2ww>;ANX%JT)(9uNHOtU zeqU2_{Wu6pLvCMBLgy+dx=13ZG-+cMrBf;#8KezD^}_F2x>_Nob0^iXEv>aML;8RQ@@sN(#bq~VsOa>) zW9RDe#_!zLkj)PyQ<05AjbPk5yJ^|B6q=sMX2L0JE|(P%=v2$6+4QL)cu$c*yt`EC z?)p#@xE12zK?QF2u^(xb0>KieYWS%DH`?=eOiFd!6)WRmCo6Joq6}7e=Nl_;oNJ{1 zu&szm^c0s*wAxfHSlk^+hb)aB<&B?9+_YvxC1LEy$(dDJ8J)d!>rwz?q zGTpJ5&uVwR#t4%B`T{*~RAd_Unnf&`*9c^zbZfsVc;v*@=BHOCX7VbyhnS5G*Pik} z@`U!W&dq$A-&GCYAWg@rG3W6ANL_2a)|;&HJSig{zyfyO87W{;ej&@-)yx~eu|G6S zO)U5U?QD)!ey@XcxEKX?m{R4VZN!*V9gT}6_lv@YD^}}y4OM(*#%kMMBij<9x4*by zCkGRQ3vqoZ)HvQ4oY~=kh{c09u`@Lzqk8)3R+$+hcYuhqajQqgq8qWy8X_QMy@1+T z0&yU)D$XzuW+GZpAB%%|^3*{x!r`8nOWhu6>t(2mvERH# zwD(@F(UyHL)A@d0q#?|SOaIrK7`~^_KhtD69y6E{G70hSpvkOuvhEmR1(|2efAmi@Xw9*}m%vZb>kVqe?t6*aL%179k2-;CD<(T2&{-rQ;%g&4b= zStwf@&UH8&T6lBt>jybuLy}~>HTF7(kmQuR6(8*l&xSQq79o~y=t@1Z0aSiA&-LWp z0NQ{@*q$n1m#1Z}?sFj0=6jxX!@eHh_D<=qD}vOG`kCQ^44In=iDu`srXYt8{4c&) z7G9;S9(*ydG({X#u#N%3l}&Yaq*lzrY-E%htNRQTrjCrX1NMi~a!soU$|=0*dXokbDxSFnm6OHLV@%5(K&ZQB%e+ZFne-TrP|veCOrVj;0pG zdbMMl{Z%MBfVA6b>SKLi zXyRQXFc}Krl(owbvDh?Um&9l0#P)rbdiZxK)8=RY8XvSG1@0=@vGxtW|3E{`T&9Zk zC0==A6=d?8`t>?}z3d12SZ$YU4KZHQPf~|w zJD7n^6bjSS+&0Kq6nxhj*9}9qDZC~A`nzEz{<+9lxx)v#qaCsGWko<{ahFVncU-R|715> z33|Jp;8Iq?Z)NXe;h$K{z8#lRB#JC*XUod!9+#hCfkg#-^FD5Jq@>Dt!SzYr@q0(& z;I!1>qg(PU*HMX7>G-#T5V;IOw~4L@XQ&5le>B4Va!sx0P1pm1PMa!%L##WB{CukUKwQLR#mw_r{d1DneIIJT(j#O#-det^FD zbdwZ-8R%84+Bo+g5iyd(a6x;*5F0xuclibP*ff{7PNPESiBNJu^Q2?h!4}38?XKcb z1cb%?RlBpM10D9~`7(D`#uzQxY}K)shcU_}%#WJZ`~FU)C1j&^b5i=Wc7uJW8^-NB z(rs3^Wms@#S~)+us~_(~uocjV^vU^euJHB^upc~CY%6gqBXHR3{FJ}D^V0uB8xrdo z%j>^}CvVUV6jaGJf5i$e;gXng&>{)uK?nWhEUaVrv+x8njtfCz>cqP8uUTn1`McQ;CD+jm zGle#Cefq~0!!v@W2XnNsA~8j@Gaaj+fT)QzP<&gR$L=bGEJ8^z*tHxS)sZ=vZPV!4 zw*)4rK3To_7<;de8PvEPu4Q5d;D=g00$bPnaG|sEP6(kDsxwc2+y=l@=8Gy3^DW?X z$=3@Y|B6^8mUadWxX-6z(Oh@9|3%Nv*Hz=bA3)}AiK3MrA@eOvp)YSd(Nf|v;6dz-v zI5xYnKImXz)PTM}jxK=GJh_OrE2HXqKgh*KB!U~;4W!DpXN6A98^kNt%~i7+I+`g5 zW}~Qod0A;Lw*Q@m73+!Rfuir!WXqcTd5mXE^DWV3AUSVk>5EA&b6Svd&!yh*!z+6( zh^>CvoV~2?y`UJ#Jho<+PlUEw=Y?Hyd8C#Oj$c!5d!Du*w4OQ9G&OxhDmQ=)tzD()srM-?#=f>aw-$x}3Z?qLOIJ{gnZu zd`Y3Pu@-6CD7)$*a6189&`vfy%c7^DmCj90Mw>5FgU_yh15-*dsMPOLpn%G&Gbq@c z)NN;i4jF!g3-}@w-}i(YUbp4WY;xYi8`sa3ep2V_UXf_!7A{;Fhp25CGF=6{xLd&d z!Mvrklt74KI=0hsCRMYBXM0Z?v1sDfN=Y&W2dW!hUyqiiU@A}R-XCxbIudes32?<&DQ!Hr>qn`aYQ?jSq?4X|x(CCDAB;b=wcWVCH1CfwqU1di z!|LlwpE@R5*{9XlM;`OM$(VZBN$c{`%$ZT3S3aYJwVO}kw)@4_EyP4SXgXkd)Q z7PtWeexnE98(N{TMKt-aG+YpQs`a~e_Y;}upm;CRXlTWI->sMI?cj%D`$7K@mQ<-e z6c3=23v>}kQ!+Z{G2&KQ99s+el!e053~lQJc`8%`$;xt_RQ&16M-jjl$HK)VZG-0esPL)%m(*xgTxhvj>YKkE?dOv3G%g-W9;dgR&pG1FoW|wrm7v|b_Y-VU zKV&S7NcSkHSjm4nrPIy#Wvwp8(lbN>^x7o60ICQ5m?QwOuUY9q(q~<6`0+a7 z_`Zhdli4>YUiT%XT1&z74m|S7pZ;||I*2@$Zd5=|9{V~xFLGS|sAE`ZQ=toXwPUzSz%(Ar!@#M}4%I2r*Ca<9 ze?7@cjo0^QC6zocYls~PXjm{I-w|^|?Hpmvl_!6;&?vERiS^(A2e-)2qxQ#IfuJ_M zgEhyUo8K;fE}w8OE$6nq26w$M-YgMyeYnhwguXF-@5ca=0xYn%I)Rl=_lZaUn5tgl zq{GPw`_E=ilA8s)Jy=%ks{*^ijmr0SqHYg5D%zYfzlqy~#fp6GHI7wm_SN!mo*B=(4jED535Cy$0WQgpMk_!VjQ zhjwgVnse1csNUVP_rkF)3q*bk`=D| zRm=kyT3qxBA7a}d4b433h)JR1r_zBVy6)DMRyM?5%=@^}YMnjurETi?w8)8Y2lox+B2Mc9(WcW709kmg&QO^PydT;QZ_K7tmYO8aA8M?Y);N zSn^>S4^jpy!tF}ZAn_;hcCNY$eyakky`&>*Nh{Yf8H17GR#{9&%f^ps6IAlo`0a7| z-5WT~hwWze!uONxb4D$Was0UyM#f|Al`@rMWg(+oyWOL{(2>P6$`ht&d;q3uD6W+D zQQKN!nzWpx$Ya8CUKa3dgn={(ad!Lm7qDcu`SB#dKHvAM#GW}Z>EZmS6yG22dWcVi zef}3H%>*xQE6XidovM|h{PD;~31ijm0ia9g=-tnlFk!0PDn12luSSt7gWP{nbUK-G z_;*xp66cFpR2OkYg+1wGZF$3SCHuNOh~T{QxmE}&DI?a%s+Q&BqRkJ^37TgbKmAKA z-lXW9)FAv@J#Z=C2lSk4@W5q7S0~BpAs>m(p{^)b2MCFka=_0~yTtPvSKJEH%6&GW zKv;f{iTBYXA0^wmTAmssRXI(3556s-FYRfgXSs2F7D?)Muw3X(n96>Fe~#_y!;5dQ zdOQ?Kp<{m8r8ee4PPIETr3Sr=L{BgNp=Hl~>nSiYS!vY-rs7>zJE&K9>k00!&bs>P zD`CMT*(GNFuh#^fdZE?R`V};&3K^rq3z5UT^^KE~V+Yq@nxU<{+Ug^t(FEIk@f~5* zgnEN(6_Zcdmg55!i|T1Xn2NBcinnnFghvgYxT5oG<#r&$ky|k5SaFs(+Vr@W6W!wc zhr8=;xACvw0kVQ6m+uK@w0M_|3*`l1D1SbQ1B%k-HMIa!=~kGkCfuQ8^C^ZQ&7xn%?zUs@ zJv~f?$}gE-(aEgrt|vKx z;}Q@0S-w8jTszP4_+Em>MvCg@+IT%eNk_MIr)gA`;*lhuP%vm}{=>pIah-$r^3{Da zp;l8BZIY#N3v`sN%POMh>Q=e-o^BM2OK_7-ztamrbZ{m49XWXIgg1Gqa+C!XfX?gxVvl@Yc z?lm`jKKariU3($HdVP4LPtp4+4mV=+tw*rjI~_q%R6DfIW|6`<`}My)W_VK!6c^i* zIvi5RI=c%+#{fOc1^%pnKBkmGk{n2 zC<)woa7^dmGd|$2v77jNVg{v9cP;?R<5Hz&w)i1YTrbpNc6%p0{Khx8hi!J94klTx zC9LuDS+2u)()U%ug}~voR<>Cq}#OQfXF2)TCm)4nk4dkJK<{Ji<% zcP30SBMi`eN&Lves%5zi8b`z0j<83Tc~cBqc7F%;N9zZcNAe!JR3!n;@j1h z1lCS;R&Xw6EFbwYNCw_`r4_DiPb}ogRDYy^watxfz7Xy(zQ=RKaRMV#RY}`WgLrrF zVY?S>T2T_0_gmfEc1P>euBpQk$h-TAw(GijhS$+YK=Tg$zQ6?>D}F1vFkHMoukc{a zEy_ED8Uf0r#&yr0HH7|2|B-{vV9-6x6%+AEp3Hd}4fvb`f5|t#1a^r!L``xWv0pYp zK_sWYo?M7Ka~?Ti?_2#VSWzD;+NOTq_0`+=>-+<27aH>r;wtxc2mAJdsVzr(62hGT z)&mW2D1I;#ot)2O9iIWid6J}Na=-qm<@K(sk9ppYVwcO*IkP(P8P9ER7!PsMfNBn& za^K3zdtRPHN^c^l9lmBs5m>rjxgOV7Io|5p!v}X)j;Ax&u7K?;q%XjX_~o%@lPr_8 z*9Uqq$6~D2?gL>l^=mP&+~8z3yT!99Io|+z9QCQwYR2S? z(t}t86UG(B`86l3E&Y`O1p($K!sj_~Szh|(peg0h(+?ymZ?)sk6C*iUD89q@SVAIS z4_&>H|FtF3pZ<_*-;w|rv%!y93`xISUXVWp-T~!8n*#@16?Q}v>{P^~9I69_ z%n*6qXY%Yy!%fWkW5OADjlkEKjP5d$8>`wRrhp=ra6@iEL)prjHQ=o3@+N$WN7maZarII1Zz-rqUrBVRY znukG8!4Q$))$$`IcgoPA;izr~)m2%Wl&%&EHeRmOXUJsiSwge{CQ5;l6K*f{(Y$dK zr+Ms$jZr918R?`Rysv0Z+#6wT~L%t0b;+Q^{rT$Y_J%=|3^Wd zt6$*epNax{<>cRLLyEm2t&MjM8j1U)pYxwc-MDWDwN~$V|G#;ney}e?-YB~f0-n-M zw?G0{JBvufZPvKoY*5O85X8y3)1IFwLkMFr+5G1knQdDje8Y{BGoelP12*9EUN%KY zxk|^L1xHs)rNCp_@p0*`=#9{%r)_7IsX3T&x{b&X;mgnjUOMtgKs#ylC}%kSdtkjl z8!FE;zg-elNMzzYzDjZ0)^Ieq?HW_G)|Sg=4mBA1EloCGZTG(+tr)OPwRZ{J7OY5O z-u^rg$|QACu3Cq*Al+><3gPrW!35XM#YAriTfXw+!m_NkpMN$HY+wKfNr4L9PYUX6 zzlS_jplR*TFaNt8ide7lbsipOGdSE!+zhi$@D8y%FCwjQ$r9L{z>FOk9`c^?Kjmj` zMuYzJ3lU=4n6Q;tr@a$L?%8~af{fraE2*s=hn>Cp;YCQ#>re~C6xoCO7}(mj#Xh*k zba*^&l5yo%qnHQd!W*<-IXZ+8vnMb>c^cM={07F5{v1ulw!aVecf>C42Ir44Vz);s zT-%=b<-{YEZ*nD{U;m4uIi#wyf4G^ggB0@5%#DRIbN7hz&!Bb!hl?A6#(~|dZ%%iN z%o^Sc0oq?wn5_;1HQ*s%km5+`HK!Bq9^dL$ZL7!o2j@&piKs-)bi>dGD9BCC4PSIk zrGJIk0P-Fv?{`4G0`eU>*i`V_XN2xXw%*xTUlVENh%_|iZDkl5p@Y866#=@Xg{cbE zjZtS75AB(^xEogv2B)1x^m!0XZdCqOZ~=~2%7kuI!6E74!u_j2iau*{do^aD^2Vk^O2eW~KSv(BzRD>xw` z&*Gb6ksujl^_Fg<9{Nxn%B8jSv6jcmU+Kw5-Q&psk7EU|G|_)%rogKwNzemwy6QX^ z@ujX`ZkT$alQ%3oWJ2VOJGz{G(ukN|LF&Ga)nKml$M>IY@1F)}2mL&m6~?A)CN|YS zLi^lZj;aN$DQnmlc~AgqcDB7)?<<0=D*JMD zM3%;`BX_AsO%3+;YjwAbOnkT+m^;*q5X>@S2hO@Aa1J zJCCx~6B|ewT}HQECVls)>JqY95!(x8tJTl^D9t}c_G8p6;&167Z{2*+*qbjZdPBKR zwYTwFdQwnL?Q_fZ1S5+O2`Bi&@(s_P_cQY7?>NOU&FL}U5YmlM6yw@TASK}~;pon& z&{?aE)kw+rf)rVR1R!KIA&R@6^&5tt+oJ8h+P)7GWpbZ0xhG1hCCSz8pFjdYT5mJUum4y`e6ST z&@%+@8U+Bx-^#X6vpu~G2`=~;;97zryltTvX_;q&`r%A)oV7(xhxX1-Obw!r%_aBq zXumue@LLi`iFY=9t~-zHYJC&!zW;W6TKK3YgAe-4E5@wu_HwjtlH4Ep5vqLS-2C5$ zSxHdkc#a7g$_vSgCJ_dxxPL&~SeaPflc=j>z18KsBxhHfhSRvim6wzyuJBI@*m2g@ zc2$Hh#1|Nide`x;s zFEY{lfS)AO1(&M2`md$eil6mNBxu2_M(#la)vUt>ub2uO+!3=jb#6Ic2xq$*jBF`n z%L9sP{NK&^17myQl!*yca`I%e*{%{^D5ld#5&5Dbmw2He%xl{Z?Bv@+UmIbjXEHB5 zH5Sh@UPidw19)2ZMmXkn`O@)IsF`Fbj+RLtb$qTJ#B-vXrZ?7??}cA6N56t|TzFj4 z=rAukcL+Zk?vE$J3_QP=HeaZiJ>sPUrar&8Ao}%X-FpDz+o?UsRbtr6!(ES)@vCo94^P>R%u%q(-9wy%Duenrn)jXuW z+2hV;WWLbrH-awRI4^BBwkb{USY=a|U+=L6IJbHc+!%aSb|KB}H$ z?;wmaMfCf`2o^LLsVRHayM++C2aVlLWRbMjawRSh!|`u4I8tjLx>H>?ZR&ba(LJXj z?DRP5gyUNUnznwc)C%qsQ!aTlw6i(@viQ+~|0fLN?FR=&Mz z!m?8%ms9Zm`@?A{S+a>p-JQ}TICnZa{gktp_;s>#3Wv_=7#GC;f$M! z&TRADKS2F7Grq42P=N2(^g3PHSv9Sr5khe~OZap~yE3UUWM-{Fh{H-BGK9MOV3L#y zw*TZQX^enrYRj7iXkEaCLTZF5z%T)MU*{_RxA-*;G{sl{7ry_e1h+X~HM>NyBnnV6 zzcFEEZvv5PId&nY^VG0nqu!l%4Ln9L8OVmkfQi1}=-j_u=t%I1_~|`SZ_zv+SV@2>e1;w+Y$vY75F((`NKQU2vax&tTw!~HE>c2M3z3d>g zk@W;ee$-qtx3IgJ&cQ;-5AmGPIIdtV0YQvcV7G)N!(PWkx#qq=;AiOzb$C@x+Z zu##CR=Q`hVF-LGTr?w9-umq+&6PrkTr)T1CJ!@XV9i+em9sS#E=UO}BNMwuBrCayH zAub{V#`%5ecrycz1$eSV8<2Ikv6CQ5E=h^K%3m6h74APzqFYP{oejD^Y7o_E2b3p| zeA*LbkS?zNs8`f>wX`CuZF=Vcnc?D9l|P;QF8KedIQiHkm!f>Y3}# zl9AL|w=FC#e&CG1Vj1SX@K&6z&wEdwI}i+9}=0 zD)hP8t2qSqGq-zz1>nRbHpsOX+Ou&rc&B>1K5Z`l|60?OVRG!%y@dyXhC`Y)1x&pBnbuTa%|7f^nM;OIHu%(W6&Ci`84e(2e5z z*ThM)rgG_sjP#cQ+Xs8;_5jS%p3?)1Cd0epUI+qH6)RAoaWyIr#O{wWN#wI+_de=e zPHAv`+(8DcYwZezvF?o<#{{xGw05-!dGx*J-i6B-YsG?>W6ke;g4Hg#P+$=@?s0UEI-*Bw6RE<{1I7> zjBlz61z%K{w(Fbs@*+5i`|zyRlh@qP_iu#(*1Wcpz$is&$q|YHc+dRFT7N)#@B@znBGn$2wXOi+ggc5BJ<+2( zlI3ksg*I$2(gaUp4h9pJY${1?hgh6#mU-3e=N{4cTb2V_4R`HbSASd)X&1AJD{hd8 z^}36_R=S?hhh>k{b|Q{V4g^$!<)__{4ZCIAOzE}*nn%8FpA_Bmaub%88)q94qdSj& zU&K}EwoAH(N;V`V{ZfKgP}7P8xX{2STb>)D)y3#SF&&=+6Jz=_o8pqGbBI1lUdL(1 zD2L567hm`YXfrYLV3fz4yv?7yE!3uaicqZ7ufRny<0U&B6qh8bcqsL`r9)-JOxkXy z+l@a1(ptpJ`{M2l$g!g@DX;KZcoPP93JT=vi}|dQ!tn5*k@U)brT5a*!NEAJ2Apj0 z3jNsKvYjiiy-sUG06+A3T)f+N_X|`ZAX$1+M8W1ZaK3Nm6Dd}Xw#CnL+A?Xi*n>}B z+g^J-yeBCQ;(6yjA1~5bLwIzXXp>6syw2d^&DXBrf$G@}~y*QOne;u_UdZD^Cl zXxza$QKpgXzp22W4GZI|8N{0M2?78Z`$wi+S>waN@uSr9`u5+ghvrjfhcjQNuoDp; zk9szfi0j_VBAd2M+55}LBoF!BASF5?QV6q5zf94lQ$2goh8#I@&N4tiMK&5WOgt0H zRiGPL-7G)N zj%2#teK$kweDwBL1+DK?B#>r?tjR02JIr zUq=)|zME?3CA9?-DRGfqM+;h7w&xgGmLjhTAOdy`b%#?iM;>=l7v)^GADOA64 zy}x#1eDIpJ^iQ-mHzp5#R2_{6(~wo;npi>z4tuCy@Z6Ovw1EGFOaCWi{Qog*{?+*F cSLciz6AsI{U0tD9;7S&f z3`9H(<`G*WCN>bN493AFOi{!!!L|afI7%o`6&6lXK&2`L1YumJiZTQ+5doQ^Fu|gz zI6Nvw1cME>!8`;4iI*N+z3;u_gZtzG5&vyF~^*1 z?S1yyXYbweAFzGO*PdLxe&gE9j&{c{J=rY}9i1#6cCzdq+ASx~UzXhiC(H6orN{Ar zj;qq$yDTU7NWP@ws1J2_*G}Ykx7%{iE$G@-7-eF^Y3#}`(v#ySiIZdTj}`y+a>=Im9Vq=f1W5yxR*!@kj+Rxz&v=+4_?qb>2v z^P8^zTt$BB=j8B|JpIS7`QY>Jz4z#w<>ZT>lB09T6nS2-t-LNa`Yg!ixr}^gvZsB` z{B;rQ@uVEqwOt7oA8%Sn=e2VBs;^`dNc~|xx$^LKH+*6BuO8<1`K9&UDuw8t_%!FY zoV0NZ!^eH~qhBH?uakr4K4~ZC5VHnAA|L9#J5r^|-)7;Y zUl$mM>pDMqeipwr+7#N+YO&F-3t!twD#tH9_S*S{wQ+C`@f*(uNuw}s=xXMh&DI;Q z;_u$0c(3`5*FEq(O?pz@6#ee_pZMDAFS)(D{hdnlGw+UhHaZ&vMC3y~_HorR=oT!) zD&Jv0*w5!@vBS?MX~$>r(d*!xjZ=9%U3__Gl0?W|%cDAF&TIVSk@)+3cqc!3boGhhYzil=`)k_5%wL2pqQz`Ju@50G)sNfVj zoXGZ|Q(f3+@xx0`O2~K<`L6lJ-SXStp$#*Nk@$Du%RKJ9@n>4_fX zCq4RXG{SB86?4nquk-Hy-E#B;AN86?zpBs|J16`d(I5ZXNB^!~KL7eV0uKN-_1L$Q zfhXMkzP+y=*8|%=cJL*vJ8JS$i*h!V@e z?gp)OZL3q^qPRQ$mTS*l z!1Lo9sgwA)pzOQd7ry0nSAP)8dF^z>J#;@|{wb*sK5UU+HV4!!`0VEJLKou6^E1;q z{-F(t{g8gMTs+F%4CL8B(dE++Be1u} zQa1d_@^?2B{4?(K#G2gBZ2YKxYj^wS1vv8wb2h-K`rtLS+C4j5oS5zZQT6pjk(( zJ4B5)x)C<~DS-Jn#3lX27u>p0yp_M+jn)mGYaUy>+T%Nnb1#0!>tbyAQ%)nklRSgJ z&7=Ic?ks-hoA@5fJ^x~JiY`PYkDmW0C(plGd!Q$Ex;t|N@d~qieC9rdJUa(Jbmg%% zxJoLcUW^RY7oUugb$iXkOVyLI8AJG+ zNchYly!4G7Y^6~5nrXo&e$8p}lUVB0m<1UOEOBY-ht5+)-??6hPx|GZjRV(b``>-$ zM|{PjUt-09)0*964ZWy4qG3A!iZuCL5J4vSq$?ol?wO2=1e&!;9t z{HK#&d2T{`aKZSSV$8nw`5IF+b?d?_&_RB2Nn@S=KEJHRZ&{wfFD-HANt+d!8=g@V${FeVy<@Q=p|RCl}k1iW;RIY+rXYw+ro1J ztScYrS3bq4R+FlcH(!!*-yB2t`NcV#59x0CP?FiqC-VdG1vMIuAg3o=Td=#P|3Z0B%|-@17rLGk-6p<6~!$6~POh1kU3(XXZO`=|>$d z!lw$=5_RyEi#Jr~RP#^%iC^4A^2m;K+VClBHe2;z6Z14*Mk&|$%X0f<_lmdugY8>E zPThfcKaZ0b)2b2Pn1`Dkmvb_pUZ*zC08jjo)ep|hccB`;;R{6kL;Ts-DL%Zk@M}Ec zYe??S-~5VIlRb~$9A!25WQb$>P5#6re$4=RZ7!m^$ICJHQwLq8^3qO zSIW*0ziJfhY2#Np#+5qaD29V6USiSHHu0r%dVQte1>d!Te30L9h<8T(gM1~;2HMmK zAIaG=K2h~u$+A`Ao#yL~^C@rnmi3*Dn>*0%_Q|VFij#Is9D-CUfq|-t52LPSO>Mf;|h8QzG9r>i*kxj)D&%wf12-@hxpQE(boL;`OLW% z&4ra*97R9KXL{m{MVR>LH~jeO-Z?hkb&`yq#K-O6lT$@0DD?-g)^Uzc7T&5n8gw__ z0DpXP`45D@vQE5>CYLA9MXJba02$ioVhjTWVS5bZ6(4zN`ENe`p5>!H^k})NKh(Lb zKhik@lUA-Xx~smjY)TJqEB4J>%kshNC(AGX&hhfC|NQ3id+))>f~iYr%eBS5L6diS z0c(T7VNUk2yzB*+mM{H`dzO#=6GzJf`m=$1G@nblG}%hD(09V$W~@UCQLSS;5BqEV zWae*vfSYo>EH@?Gc;aOFp#GTWmw)f}@_j#ZYkBJ*Le`;RxE%9>G%3oHFxKHSfF_;E zFF&fw_1jO}dg1SWTfI@g(_fZ9_1ee&mj2x4J1a|pX>wLqgaW;Whu>GnNZR9Y^4s;%W zx4i1NzvUU8TZ6Uq$a?oX>%J5^9jAU9em|0;-_C;e(1}uEYG}e zr$t+qTP`-spu!U-M~AgevS79|o^g>`wAc>y@e7Vk`?z91a^qxq>GOBXzxbc8ET8gX z-7Xxv6CigTGJZUUv*`9=vmA1gzg4h49N+Y^ODZ8#@KI9`q-_X zaPu5;fuSS!*@le$mhP;#HK&jK(B1NbUvXvmPhY0_kiYDk{5AHRoIkT@vw@Z8z;F1q z7l7fCCi(MA@@nf@5q}|i{jv8-IsM&M6%o3LI{BfEQREKp4HG$@wUJ1eYx}Q!%BAIh z`K$LWk8838tEq&7|H$p$UeKq__MwZg*U!9Rnw3=(J#1>imzU))z3%$*uKvrZuZ{Wd>ES!5dgNmrfBPTZ zSl;rks&UNFhD?$g9J)KT33%MPXFTyAfBeSP=e+&fch`Iedi2_(FPHhgB&G`tFhZFY^iGZTPO8%A6S;JedWE&6Z7VgKJMLTtbV@Au;oe}a$|fo@8QFpeTE;~ z=(!{4cwATZ_x+vv)3p?oK6COMai}`b-FNw9`G;R}pRW2^Ajgt*_)SjojgA<};ZV-D zH)q&q4iEL*eWU|BFmM=S?>NY;&)5I;`<6?(5sl{jyXGx}^8>dxQX%Vtv5PEo8w6JK zToHH6efQkYp6Q3Mqvhz+s$i(tXF7XpLn?CV%Z6Oqu_p_+nw!5{zT;K*3%heMNzF;f zzun5oTzGVll(CU?9of+U+nP1y(OpU zvv~w9Sr;nLG5?3p<|70ueyyDbUY}Yd!E0=`V+1F2S@%7DUU z!+3G5v_Yp@FhhD(9o{OXys6YM@?dLP0LotS!( zZ~o{ThY!62s*m!Sg&e-XdU0#<$S=0*Pb|w{eYqaXoLkS+K6Rp~Y^EN+{G*Qi6P;tq z8XuKI#YV0>%Nz^2?6yhv9fh2b=evx?JV#`6&=bQOMZM+dz(~P{OOO4g=JV%2_LA3t zIWdLGe~6_L*6U?ZoidN$t=;E~mp$XEY0L*5)a)#9%C_**_ejXj1}SaGL~lF&7ro-L z5_Il{V)fCw*fu?YZqYMj%cgB7z3S~eAahn{_@cQMlFic3)%3UY#Noj!JH4cEvRr#S z^9EDCiHH1&FTSjo9Q4r{^K&2ha-QnFK^=vKuFYqvdxW=7K2uz)M)&XO4}*2S)oU;32*?s`tzhPoNdy zMK~{~T*=4;PVlC()T`0MfB8pTs;kbv+GgKHr(Rq!;3+S|5(B&y+n5*@z^5dLrcGjDVs3` zF=w9B8T=Q$;LA>~9`X4+qVFJ-liI=f8qb5;adlP9$i*t%;M>z~dBL;M7jh(|v1O@a za}jzx7Y{1+b#a=fVe#WfJ$C)~F&^GD!hg8&3xD97hwY{wLOxnA2;wJqo|?br07>n| zdc9}P-SQkmio~mhtX%z&MJycY7!O^|^}~~L*w+vLY!DscBm0>6jPaAr#6u#lPtl}a zn^g8A4RF_SY<9BpclX?P?PZtsH(oFGD^X@u>A2cxb^Xba#{f#>E7Bp? ztFxkR`P@dmpq)Vyx9`@uFnA8e#&tpr-DGb_G^IYIlqLQGW*i-bW1&6e29O6Y4AR#5 zvw3QcRQo|aIrZklmvExE$M4X$oUyA07_9mhM=sXuWE_~5;nT=?xmN7c}VZTZ(}?rL~jVuDCHDd zW0I>4RkJL)P{rpZ{mdS{51lA{3Pf+T`jPlbs|k>vbZN6ZbRkPI+fmPp0DeI6t7Nc~ z$NhZ%nT)>k;6(Zz50&~yf1iG^fs4sKviK#}-Dl{r>Bu~hY2DR;F}T*pmL9|4wUTbw z@xnlPQdFhr&E%R&<~6QfTI+#VgCJrYF+`(acGqTfD_@rASLH)IiT<#`a<+xCqjpL` z>#D>_%Q%UnL=``~nBcrnhfBLfp$0UGM~}`pY-%%xL2Su?1!0>O+=jhV^Q|SHHsi~S zD~0ov1zlYjfNIlt^GFNNb-;qpg1EPAM(ME^ps)?4i@M~QXic5q&!wGA8~zyJ#}kr& z^`4JJ%2R4dCKVL9!V%6$c5)Gv^*q_xt7|K06))bGDUPP7^FtSfX;?h<0|XKb062A zIY|b0!pj0C)Y$7;i^P=d-~9Mh&zQKh^`h&1%>hsw!5hUsnpx4t z<}nU3;cAnu{B7X&Vn5^sgN95?k&<*Nw-dMSz$p_Pc^$xvIFk*X^*T}DEO_*uml7(B z&nEcAJ#m?Xu}#P#5u(vuOElFSM`G;J(?_?d0s0skGYz4+p=0BMwY@=f?C04B`6n16 z7Y+?9wH$J zAxS-==YiY@80*`{n1+s)KEk056AV77g?$%2H0xq(Q))9XS&VWbRL_G=l_J9>UJl0D zL}N3`NDj2QCw^L+J)AKpGPZ04N*&EdoH2o<_uVvg5ExqK?h8cD!pAn(v{$fP*#~QU zh>wrmGmlPAjvv4qPUcCCWLhX|Ka2&~1>W*WY1;yK(tBoXnGCEf#s(&kaR8=O7&`Rb z4)NokexjR!kF~8MOFmU5aQ$lW3aOlWOo#8pn)8ot^lQLVQZO5XoZ}x``u%x;$Cmjs zwt{}jE1RV@QuzczTVvNF(%{QMY#aX3$pievr_W(l1ZA{3C6z9Llh!WOKW`#3*AYhq z-tucRhL5MYjUq^yq;P4yz(j=;Uhu<*6tg}0;12PFp$~4~hxPm_+Zg8Ct>f7*BneZNsSb8?%&Jh@KlZTTrOg zc*d4a&)A=--&QSt^&=aCKtMfi2RM(tjY0_3lN)$zC%(pMOo(G{xaW#VQD)ml*8}*( zn%f398D{+~2NGYgRbLr0gOY-ta%{uQ8}bVGoMs=E!xb*`2zR1d+}H1qgGY~B`-@YJ z>*a;j$od&444i_t&M>U#WibY2>CmtI+6%Qc>JFq&fKMxFac!J|LFhSyp@oAfvh|$Q!ky#K zhS(4BtuuI=bE{5uez>A2b4!3M+hm`g$1$&w|CB6iS~rUj(~}eO8bJK3dJ?_67ebx{ zSHS|R%y8%`=YQMnAR>?_}JgGOix59Mum~lwBBOj7l{Dr%(^B9~CeuB#Ukb0`^qvuU*Y(62BICR)&Tg!A&&-M+!2eTcS zQp|kcb?_I5@TRuW`$zm0SeN?*o>tHfJx!tLIT3p}glz!EcCx$YvH;wLhF24aiOPLh zoyM4vMhXD7pn%KA%I|SJ3pjFVbc&HshPKa%R-zM#w$p3fhA+q*C$x=DN^`o8SMD%{ zlYy6XyKVf(AvWYbX0=U|B7A&%L$qy^lSpgCbq?mNVK#inCYah3&VIO?=1DXw=#`qC zbt3TAho;;JwjNhLV1kW_T;f+5&f5zw$zb{>8{!V`+%h~%KVy-DqlO+=H=VZ=FkY%TPJGOKbO-eUMZb@k`Qw5*kXQI4 zNn-VY-V}k{dvi=NgDj)aFv2b;9&Lhj62jH0Xgt5%4NV`a$nS9VFeZ8jwL3ZT-35mn zvUwAUQ9a=cgBJ%U^%9B`*>UXEt~NPJ9a#K=jILPgIq5_LF4);`bivL2J}%hVmz_pI z&(zfWn4ASNsVrtA?CTky6@SLgnCP>dnQ&s$k2bCduV@v=0M<$2v&?X_w&f?0 zdVL4q!ob4O|06wo;ixOrj>l#y;~Gg=-=WAx*pV-hTSqte=+)3!U&FCJJ(R7IGj_tH zSk_m_@)csRD}7KQl3@|As*N?`C_c!U@vo=O(oUUM9HYTXr$fev>%5uanu%NzjR zCb4pse%58Ff_FbT99ZTs=22SCWBp8Il>D>{j4u>gKeWxhWg0&$HJ{gkdPXCf61P@& ztiI#OvjYd~D)hvhL4pdPanYqKH?T(AS0xsJjcpoa4(T1TJw`VIoTCqRpI?P*;>dsN z5f0BOf=znyxkaZ2tJWn8N$N>lK}c;lWS?W5vOBR=JKko}KC|$3Z%PH$J5|jKJ-NqE z_ZknrZ7W~D$^f(y8P~onU3Oty2J4NY*@llDx%i|JpU9&wHDK(xtG@VU#^kYat*h>i zdSLC^jL7(-#cz$a=M=p%&kPDtW4)wR`B-^()-G4{E(m^LY+5LRq%6%7l<6vOPNhVCyvY=4yUI zIx&MxLE28(nmXlm7viLOLSs$b4|GCD7I{^>sJ)bo<7qB^r=YAS^^JFY6;xwEh zZpDM~;ZEeb0~BvkTQTEG0U3VZL5j9H_mXvxdHwoPMGk8H%GZ$DSUoG};o!Bp*+kXX z`qy7&0LlzDGC5UnIv&!hC5g%LKEG*AaEI$`J|`zF9*~_UC6v2ef%Yt=w?iGS=`x{m`*tc1v}Pz zf~slY{K=p-7He#u7L@_cNMwKhd*f^(-Vaneam*r{gTf>LelwEqaEL>^IXTI3UTi}^ zZkltHCYX)!fRgkGlZFWF0F?CZ*bebcbNh5(fov2_4=P{4lkUMPb=`l~2uhFxu>7&DseW}mFpI(L7m<98w3m<&s^gYwzKLS`@ ziH2UU5yjHI=Sa0E5;z6n)mm>R$Iaaa0HpF2H=cyKrST)6aY5j>Y2EFa4KyaOJpi`Y z0cR0NFVNX;eH&s&2RLs_Wk`!X1Ktl5EXMuVY^M5^Na4ay{PgzMr(hU*GqwVm<`|tx zHqpMHc}$IYj}CnPhO8RSa9ryZ-xY7p0CWe2u`wOua|f#J0CPySsjO015zUoj^|=$R z&P!8a>m2?Q`plg2TfXWox!mch;lqB)b!%4}(i&%-8hjt^C)?8v8krgXwGp&JSbXUmUuKNKj;seLQ@+i{*gD4%I@RALNg?5Nv zHQN3d?-dcg{ZuEQo!};N-E}JHlr|#Z=D+=Y^?ah~?(8cL)5{VsbD?G)a@Zyct*NHxP>~FNNVt39Nz-u{udkt;$vC~g<^Q~(o z@!$ErW946qkAsrqYR=YH5b{$F!kam>41*1>C($G?Qu;QuA8=!KcHIVdWNDr-8-7uK zNuNiULdrZEx{d!~v71dXW?a|C=vhDe#uyuYWb4hW)6k0ypF8ER{BAwTAx;YE-wb!) zU;16Was^(;$OUp5dXvkJY0hDAS|8fn=gyP6&xSuan8cZ0vW)z(=x@DiJPDG%HphC= z- zpYdSh-(EFF=R=BYI@>x#_%jYWdLEjhM|USaBzVpNLG3+y_(R$BD_RmMas$MWs~oG^0ClV~+&9ED$w?cD|Yz+=nu2k$xd2U}uu6PP0V zCo+iBf#`{lqWxs#{-;()(J&9)cV& z*MIxg+j{>(@hd`~jcXbH;1z zth?n%0u(-3tD58KJI#tQPuPp_{T#@NnLsv#(utmIWON>=r)G}FN{F5lNBD@6U;Bn9 z>MqnKn+0+&Jbe!0Sg#XY1|IL>WT_VXUT;oA+Kv6ir{@DlMjpC8`1rDX*N^ifn3Oa- zP>v=r{|3wSjsMrp<+?rvZ1#&IQ%o*?Q%fUy9{OfIvd7w82leqs-`IVe19y5!^8?p+ z%lE(O);9mymq@O`lr{MH-Gap%a!lvK(+9_5!wv_d}s`<0wzR2F;-6sG^f)1 zfAhBE<$Hhn)^a}|--)B-fGBwkg|A}DfUPxB;ADB-k7x(+!4Wu(Z^V|l+qB6&n>1q*9dcD_jHBlT z*vR|+hTp{?KmT(AyX9Nn__#hpI{B~9Yw%ik6(uW2wP}cuI}>`1H0k-6=fBTqX`C$v zyXpzH+GeRX%|8xjW>_S<&=S+Pnr``~H$Jia)W5&2PruNUE@20Cie;tIvIjt59r&b0 zjV=c|+__#ALk??qI+k=+1B_gv^QeSsUl&j? z;p|tZ|KgJ`FMscq_bfcG=0&dhz{tYj7c4!e`8Av9+C(?nNM0J_+A`~hL2+5Y%lGV- zcj`{^cVGXwo}+cX;<;dQvT7u2?0R+qYFq{XM198e*L=}E%d_>lL3~zo=0om&Voy%^ z%h9>f^lD0ytPpr zg~{1jZAiO~^T97J@yeh09w`1xwSh24F`NSEhCjRLSXJn`%mH@4#+$x@;up2ebwIl&_3snm%EJ(YEoj{-clclgY{Q#$UL- z{G^^VuQM1Gu)n(U2vif97a;}2J2D&cm4Ei0<mZtf?9#n|`tkjxXn6KX&EI1=R@*$+Kyw>;|^ zN6TfsKa#H^pu#R*_}$O*#n-X_6q!ggu8IzGT!q@a0d4&GoYsxW{s08 zxcb6`!zl91*VjDiv#}r4pKJ1goci!UFDRc`2%OJ$tT_0@2dCnL<$j-qr9L&M`lL5D z(Jg%h*(2AFmk(S^Onhux>cB?H;>YJE=cKZwR~3}pmJcYob}zo~KupBx=(Nh~M4*nz zFreXsw&7fy?>G)Rb7uLh_>fd0az4fHf;q3Jlg~yVw=Ucr;=5V{Uqw2b-#L3OowL9U z9j+Ix`1q<;8v}WtQ-xXig+I)9(3;nXc|pGNB1^pvR0~0A$kl-?YrweTR}h1GVi

c)ijgxDm}8EsRXFt3h@+Ufr7@DN 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 literal 0 HcmV?d00001 diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/profile/backup_config.json b/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 000000000..78f40ae7c --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/profile/main_pages.json b/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 000000000..1898d94f5 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/Index" + ] +} diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/en_US/element/string.json b/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/en_US/element/string.json new file mode 100644 index 000000000..7d5308ce7 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/en_US/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "Sample_DisplaySoloist" + } + ] +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/zh_CN/element/string.json b/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/zh_CN/element/string.json new file mode 100644 index 000000000..314e0029f --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "模块描述" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "Sample_DisplaySoloist" + } + ] +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/mock/Libentry.mock.ets b/ArkGraphics2D/DisplaySoloist/entry/src/mock/Libentry.mock.ets new file mode 100644 index 000000000..44d5c9630 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/mock/Libentry.mock.ets @@ -0,0 +1,21 @@ +/* + * 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. + */ +const nativeMock: Record = { + 'add': (a: number, b: number) => { + return a + b; + }, +}; + +export default nativeMock; \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/mock/mock-config.json5 b/ArkGraphics2D/DisplaySoloist/entry/src/mock/mock-config.json5 new file mode 100644 index 000000000..a1e6f06e0 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/mock/mock-config.json5 @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +{ + "libentry.so": { + "source": "src/mock/Libentry.mock.ets" + } +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/test/Ability.test.ets b/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 000000000..8648e182a --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,76 @@ +/* + * 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 { beforeAll, describe, expect, it } from '@ohos/hypium'; +import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import Logger from '../utils/Logger'; + +const TAG = '[Sample_DisplaySoloist]'; +const BUNDLE = 'MyApp_' +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; +const DELAYMS_1S = 1000; +const DELAYMS_5S = 5000; + +export default function abilityTest() { + describe('AbilityTest', () => { + beforeAll(async (done: Function) => { + Logger.info(TAG, BUNDLE + 'StartAbility_001, begin'); + let abilityDelegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); + try { + await abilityDelegator.startAbility({ + bundleName: bundleName, + abilityName: 'EntryAbility' + }); + } catch (err) { + Logger.info(TAG, `beforeAll exception = ${JSON.stringify(err)}`); + } + + Logger.info(TAG, BUNDLE + 'StartAbility_001, end'); + done(); + }); + + /** + * @tc.number:SUB_GRAPHIC_2D_HGM_DISPLAYSOLOIST_0100 + * @tc.name:DisplaySoloist_001 + * @tc.desc:DisplaySoloist + * @tc.size:MediumTest + * @tc.type:Function + * @tc.level:Level 1 + */ + it(BUNDLE + 'DisplaySoloist_001', 0, async (done: Function) => { + try { + Logger.info(TAG, BUNDLE + 'DisplaySoloist_001 begin'); + + let driver = Driver.create(); + await driver.delayMs(DELAYMS_1S); + + await driver.assertComponentExist(ON.id('Start')); + let startButton = await driver.findComponent(ON.id('Start')); + await startButton.click(); + await driver.delayMs(DELAYMS_5S); + + await driver.assertComponentExist(ON.id('Stop')); + let stopButton = await driver.findComponent(ON.id('Stop')); + await stopButton.click(); + await driver.delayMs(DELAYMS_1S); + + Logger.info(TAG, BUNDLE + 'DisplaySoloist_001 end'); + done(); + } catch (error) { + Logger.info(TAG, `DisplaySoloist_001 exception = ${JSON.stringify(error)}`); + expect().assertFail(); + } + }); + }) +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/test/List.test.ets b/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 000000000..3be234233 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import abilityTest from './Ability.test'; + +export default function testsuite() { + abilityTest(); +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/utils/Logger.ets b/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/utils/Logger.ets new file mode 100644 index 000000000..01dc553e4 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/utils/Logger.ets @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import hilog from '@ohos.hilog'; + +class Logger { + private domain: number = 0xF811; + private prefix: string = ''; + private format: string = '%{public}s, %{public}s'; + + constructor(prefix: string) { + this.prefix = prefix; + this.domain = 0xF811; + } + + debug(...args: string[]): void { + hilog.debug(this.domain, this.prefix, this.format, args); + } + + info(...args: string[]): void { + hilog.info(this.domain, this.prefix, this.format, args); + } + + warn(...args: string[]): void { + hilog.warn(this.domain, this.prefix, this.format, args); + } + + error(...args: string[]): void { + hilog.error(this.domain, this.prefix, this.format, args); + } +} + +export default new Logger('[Sample_DisplaySoloist]'); \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/module.json5 b/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/module.json5 new file mode 100644 index 000000000..944ed9985 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/module.json5 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/test/List.test.ets b/ArkGraphics2D/DisplaySoloist/entry/src/test/List.test.ets new file mode 100644 index 000000000..3bc7c739d --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/test/List.test.ets @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/test/LocalUnit.test.ets b/ArkGraphics2D/DisplaySoloist/entry/src/test/LocalUnit.test.ets new file mode 100644 index 000000000..1d9c6cdcc --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,47 @@ +/* + * 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 { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/hvigor/hvigor-config.json5 b/ArkGraphics2D/DisplaySoloist/hvigor/hvigor-config.json5 new file mode 100644 index 000000000..87990affc --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/hvigor/hvigor-config.json5 @@ -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. + */ +{ + "modelVersion": "5.0.0", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/ArkGraphics2D/DisplaySoloist/hvigorfile.ts b/ArkGraphics2D/DisplaySoloist/hvigorfile.ts new file mode 100644 index 000000000..b74abd874 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/hvigorfile.ts @@ -0,0 +1,20 @@ +/* + * 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 { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins: [] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/ArkGraphics2D/DisplaySoloist/oh-package.json5 b/ArkGraphics2D/DisplaySoloist/oh-package.json5 new file mode 100644 index 000000000..7a7fe7781 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/oh-package.json5 @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +{ + "modelVersion": "5.0.0", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/ArkGraphics2D/DisplaySoloist/ohosTest.md b/ArkGraphics2D/DisplaySoloist/ohosTest.md new file mode 100644 index 000000000..0f0434f97 --- /dev/null +++ b/ArkGraphics2D/DisplaySoloist/ohosTest.md @@ -0,0 +1,13 @@ +# DisplaySoloist测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +|------|--------|-------------------|------------------------------|------|------| +| 拉起应用 | 设备正常运行 | | 成功拉起应用 | 是 | Pass | +| 按钮点击 | 位于主页 | 点击 30hz 右侧 Start | 方块按照 30hz 频率移动,同时按钮显示为 Stop | 是 | Pass | +| 按钮点击 | 位于主页 | 点击 30hz 右侧 Stop | 方块停止移动,同时按钮显示为 Start | 是 | Pass | +| 按钮点击 | 位于主页 | 点击 60hz 右侧 Start | 方块按照 60hz 频率移动,同时按钮显示为 Stop | 是 | Pass | +| 按钮点击 | 位于主页 | 点击 60hz 右侧 Stop | 方块停止移动,同时按钮显示为 Start | 是 | Pass | +| 按钮点击 | 位于主页 | 点击 120hz 右侧 Start | 方块按照 120hz 频率移动,同时按钮显示为 Stop | 是 | Pass | +| 按钮点击 | 位于主页 | 点击 120hz 右侧 Stop | 方块停止移动,同时按钮显示为 Start | 是 | Pass | \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySoloist/screenshots/device/index.png b/ArkGraphics2D/DisplaySoloist/screenshots/device/index.png new file mode 100644 index 0000000000000000000000000000000000000000..1eacc005d89abe95a1f1e3faee98196afd3e94ff GIT binary patch literal 28693 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

psDupC#E$v0q9E6Db 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 rWOK=IaKI*$R8+6kJ*s@dZw)B9*YHQQH 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 literal 0 HcmV?d00001 diff --git a/ArkGraphics2D/DisplaySync/README.md b/ArkGraphics2D/DisplaySync/README.md new file mode 100644 index 000000000..d6d57281b --- /dev/null +++ b/ArkGraphics2D/DisplaySync/README.md @@ -0,0 +1,112 @@ +# DisplaySync + +### 介绍 + +本示例通过 DisplaySync 系列功能,对请求动画绘制帧率、请求 UI 绘制帧率和请求自绘制内容绘制帧率设置开发者所期望的帧率。 + +本示例主要展示了 DisplaySync 系列能力,使用 [ExpectedFrameRateRange](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-explicit-animation.md#expectedframeraterange11) 属性来配置显性动画和属性动画的帧率;利用 [@ohos.graphics.displaySync](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkgraphics2d/js-apis-graphics-displaySync.md) 方法来为独立的帧率绘制、更新操作UI界面;采用 [XComponent](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/ui/napi-xcomponent-guidelines.md) 组件进行开发,从而可以请求独立的绘制帧率进行内容开发。 + +### 效果预览 + +| 初始页 | 请求动画绘制帧率 | 请求 UI 绘制帧率 | 请求自绘制内容绘制帧率 | +|:--------------------------------------------------------:|:------------------------------------------------------------:|:----------------------------------------------------:|:-------------------------------------------------------------:| +| | | | | + +使用说明 + +1.在初始页面点击“**Requesting Frame Rates for Animations**”,进入请求动画绘制帧率页面,点击“**Start**”,三个方块分别按照30Hz、40Hz、60Hz移动;点击“**Back**”返回初始页面。 + +2.在初始页面点击“**Requesting Frame Rates for UI Components**”,进入请求 UI 绘制帧率页面,点击“**Start**”,数字“**30**”按照30Hz帧率放大缩小,数字“**60**”按照60Hz帧率放大缩小;点击“**Stop**”绘制停止;点击“**Back**”返回初始页面。 + +3.在初始页面点击“**Requesting Frame Rates for Custom Content**”,进入请求自绘制内容绘制帧率页面,点击“**Start**”,两个方块分别按照30Hz、120Hz移动;点击“**Stop**”动画停止;点击“**Back**”返回初始页面。 + +### 工程目录 + +``` +├──entry/src/main +│ ├──cpp // C++代码区 +│ │ ├──CMakeLists.txt // CMake配置文件 +│ │ ├──napi_init.cpp // Napi模块注册 +│ │ ├──common +│ │ │ └──log_common.h // 日志封装定义文件 +│ │ ├──plugin // 生命周期管理模块 +│ │ │ ├──plugin_manager.cpp +│ │ │ └──plugin_manager.h +│ │ ├──samples // samples渲染模块 +│ │ │ ├──sample_xcomponent.cpp +│ │ │ └──sample_xcomponent.h +│ ├──ets // ets代码区 +│ │ ├──entryability +│ │ │ ├──EntryAbility.ts // 程序入口类 +| | | └──EntryAbility.ets +| | ├──interface +│ │ │ └──XComponentContext.ts // XComponentContext +│ │ ├──DispalySync // 业务页面目录 +│ │ | ├──PropertyAnimationDisplaySync.ets // 属性动画页面 +│ │ | ├──CustomDrawDisplaySync.ets // 自绘制页面 +│ │ | ├──XComponentDisplaySync.ets // XComponent页面 +│ │ ├──pages // 页面文件 +│ │ | ├──Index.ets // 初始页面 +│ │ ├──utils // 工具类 +| ├──resources // 资源文件目录 +``` + +### 具体实现 + +* 请求动画绘制帧率:通过 animation 和 animateTo 接口的参数——expectedFrameRateRange,来设置动画刷新率区间、预期刷新率。其作为动画的属性之一,主要作用于动画场景。 + + * 涉及到的相关接口: + + | 新增动画属性 | 描述 | + | :--------------------: | :----------------------------------------------------------: | + | expectedFrameRateRange | animation和animateTo接口的动画属性参数中可选配置expectedFrameRateRange参数 | +* 请求 UI 绘制帧率:通过调用 [@ohos.graphics.displaySync ](https://docs.openharmony.cn/pages/v4.1/zh-cn/application-dev/reference/apis-arkgraphics2d/js-apis-graphics-displaySync.md)接口,来注册回调和设置刷新区间并控制回调周期。 + + * 涉及到的相关接口: + + 通过 `import displaySync from '@ohos.graphics.displaySync` 表达式引入, + + | 接口名 | 描述 | + | ------------------------------------------------------------ | -------------------------- | + | Create(): DisplaySync | 创建一个DisplaySync实例 | + | setExpectedFrameRateRange(rateRange: ExpectedFrameRateRange): void | 设置期望帧率 | + | on(type: 'frame', callback: Callback): void | 设置自定义绘制内容回调函数 | + | off(type: 'frame', callback?: Callback): void | 清除自定义绘制内容回调函数 | + | start(): void | DisplaySync使能 | + | stop(): void | DisplaySync失能 | + +* 请求自绘制内容绘制帧率:通过在 IDE 中的 Native c++ 工程,在 c++ 代码中定义对外接口为 register 和 unregister,并调用新增的 CAPI 接口,可在页面上使用 drawing 根据设定的期望帧率来绘制。 + + | 接口名 | 描述 | + | --------------------------------------------- | ---------------- | + | OH_NativeXComponent_SetExpectedFrameRateRange | 设置期望帧率范围 | + | OH_NativeXComponent_RegisterOnFrameCallback | 注册更新回调 | + | OH_NativeXComponent_UnregisterOnFrameCallback | 取消更新回调 | + +### 相关权限 + +不涉及。 + +### 依赖 + +不涉及。 + +### 约束与限制 + +1.本示例仅支持在标准系统上运行; + +2.本示例为 Stage 模型,已适配 API version 14 版本 SDK,SDK 版本号(API Version 14 5.0.2.57); + +3.本示例需要使用 DevEco Studio 版本号(5.0.5.306)及以上版本才可编译运行。 + +### 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo code/DocsSample/graphic/DisplaySync/ > .git/info/sparse-checkout +git remote add origin https://gitee.com/openharmony/applications_app_samples.git +git pull origin master +``` \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/build-profile.json5 b/ArkGraphics2D/DisplaySync/build-profile.json5 new file mode 100644 index 000000000..de594a6c8 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/build-profile.json5 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +{ + "app": { + "products": [ + { + "name": "default", + "signingConfig": "default", + "compileSdkVersion": 14, + "compatibleSdkVersion": 14, + "runtimeOS": "OpenHarmony", + "buildOption": { + "externalNativeOptions": { + "abiFilters": [ + "arm64-v8a", + "x86_64", + "armeabi-v7a" + ] + } + } + } + ], + "buildModeSet": [ + { + "name": "debug" + }, + { + "name": "release" + } + ], + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/code-linter.json5 b/ArkGraphics2D/DisplaySync/code-linter.json5 new file mode 100644 index 000000000..3311c9280 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/code-linter.json5 @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/.gitignore b/ArkGraphics2D/DisplaySync/entry/.gitignore new file mode 100644 index 000000000..e2713a277 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/build-profile.json5 b/ArkGraphics2D/DisplaySync/entry/build-profile.json5 new file mode 100644 index 000000000..9e8e21e08 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/build-profile.json5 @@ -0,0 +1,47 @@ +/* + * 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. + */ +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/hvigorfile.ts b/ArkGraphics2D/DisplaySync/entry/hvigorfile.ts new file mode 100644 index 000000000..037010409 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/hvigorfile.ts @@ -0,0 +1,20 @@ +/* + * 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 { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins: [] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/ArkGraphics2D/DisplaySync/entry/obfuscation-rules.txt b/ArkGraphics2D/DisplaySync/entry/obfuscation-rules.txt new file mode 100644 index 000000000..272efb6ca --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/obfuscation-rules.txt @@ -0,0 +1,23 @@ +# Define project specific obfuscation rules here. +# You can include the obfuscation configuration files in the current module's build-profile.json5. +# +# For more details, see +# https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/source-obfuscation-V5 + +# Obfuscation options: +# -disable-obfuscation: disable all obfuscations +# -enable-property-obfuscation: obfuscate the property names +# -enable-toplevel-obfuscation: obfuscate the names in the global scope +# -compact: remove unnecessary blank spaces and all line feeds +# -remove-log: remove all console.* statements +# -print-namecache: print the name cache that contains the mapping from the old names to new names +# -apply-namecache: reuse the given cache file + +# Keep options: +# -keep-property-name: specifies property names that you want to keep +# -keep-global-name: specifies names that you want to keep in the global scope + +-enable-property-obfuscation +-enable-toplevel-obfuscation +-enable-filename-obfuscation +-enable-export-obfuscation \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/oh-package.json5 b/ArkGraphics2D/DisplaySync/entry/oh-package.json5 new file mode 100644 index 000000000..c29643810 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/oh-package.json5 @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": {} +} + diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/CMakeLists.txt b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 000000000..cd73ec36d --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,20 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.4.1) +project(drawing_test) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED + napi_init.cpp + samples/sample_xcomponent.cpp + plugin/plugin_manager.cpp +) +find_library( + hilog-lib + hilog_ndk.z +) +target_link_libraries(entry PUBLIC ${hilog-lib}) +target_link_libraries(entry PUBLIC libace_napi.z.so libnative_drawing.so libnative_window.so libace_ndk.z.so) \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/common/log_common.h b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/common/log_common.h new file mode 100644 index 000000000..ab802e81d --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/common/log_common.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef LOG_COMMON_H +#define LOG_COMMON_H +#include +#define LOG_PRINT_DOMAIN 0xFF00 +#define APP_LOG_DOMAIN 0x0001 +constexpr const char *APP_LOG_TAG = "DisplaySyncSample"; +#define SAMPLE_LOGI(...) ((void)OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, APP_LOG_TAG, __VA_ARGS__)) +#define SAMPLE_LOGD(...) ((void)OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_DOMAIN, APP_LOG_TAG, __VA_ARGS__)) +#define SAMPLE_LOGW(...) ((void)OH_LOG_Print(LOG_APP, LOG_WARN, LOG_DOMAIN, APP_LOG_TAG, __VA_ARGS__)) +#define SAMPLE_LOGE(...) ((void)OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_DOMAIN, APP_LOG_TAG, __VA_ARGS__)) + +#endif // LOG_COMMON_H diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/napi_init.cpp b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 000000000..dc7146d14 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "napi/native_api.h" +#include "plugin/plugin_manager.h" + +#undef LOG_DOMIN +#undef LOG_TAG +#define LOG_DOMIN 0X0000 +#define LOG_TAG "NAPI_INIT" + +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + PluginManager::GetInstance()->Export(env, exports); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void *)0), + .reserved = {0}, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) +{ + napi_module_register(&demoModule); +} diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/plugin/plugin_manager.cpp b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/plugin/plugin_manager.cpp new file mode 100644 index 000000000..d0f274144 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/plugin/plugin_manager.cpp @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include +#include +#include +#include "common/log_common.h" +#include "plugin_manager.h" + +PluginManager *PluginManager::GetInstance() +{ + static PluginManager pluginManager; + return &pluginManager; +} + +PluginManager::~PluginManager() +{ + SAMPLE_LOGI("~PluginManager"); + for (auto iter = nativeXComponentMap_.begin(); iter != nativeXComponentMap_.end(); ++iter) { + if (iter->second != nullptr) { + delete iter->second; + iter->second = nullptr; + } + } + nativeXComponentMap_.clear(); + + for (auto iter = pluginRenderMap_.begin(); iter != pluginRenderMap_.end(); ++iter) { + if (iter->second != nullptr) { + delete iter->second; + iter->second = nullptr; + } + } + pluginRenderMap_.clear(); +} + +void PluginManager::Export(napi_env env, napi_value exports) +{ + nativeXComponentMap_.clear(); + pluginRenderMap_.clear(); + if ((env == nullptr) || (exports == nullptr)) { + SAMPLE_LOGE("Export: env or exports is null"); + return; + } + + napi_value exportInstance = nullptr; + if (napi_get_named_property(env, exports, OH_NATIVE_XCOMPONENT_OBJ, &exportInstance) != napi_ok) { + SAMPLE_LOGE("Export: napi_get_named_property fail"); + return; + } + + OH_NativeXComponent *nativeXComponent = nullptr; + if (napi_unwrap(env, exportInstance, reinterpret_cast(&nativeXComponent)) != napi_ok) { + SAMPLE_LOGE("Export: napi_unwrap fail"); + return; + } + + char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {'\0'}; + uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1; + if (OH_NativeXComponent_GetXComponentId(nativeXComponent, idStr, &idSize) != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) { + SAMPLE_LOGE("Export: OH_NativeXComponent_GetXComponentId fail"); + return; + } + + std::string id(idStr); + auto context = PluginManager::GetInstance(); + if ((context != nullptr) && (nativeXComponent != nullptr)) { + context->SetNativeXComponent(id, nativeXComponent); + auto render = context->GetRender(id); + if (render != nullptr) { + render->RegisterCallback(nativeXComponent); + render->Export(env, exports); + } else { + SAMPLE_LOGE("render is nullptr"); + } + } +} + +void PluginManager::SetNativeXComponent(std::string &id, OH_NativeXComponent *nativeXComponent) +{ + SAMPLE_LOGI("set native xComponent, ID = %{public}s.", id.c_str()); + if (nativeXComponent == nullptr) { + SAMPLE_LOGE("xcomponent null"); + return; + } + + if (nativeXComponentMap_.find(id) == nativeXComponentMap_.end()) { + nativeXComponentMap_[id] = nativeXComponent; + return; + } + + if (nativeXComponentMap_[id] != nativeXComponent) { + OH_NativeXComponent *tmp = nativeXComponentMap_[id]; + delete tmp; + tmp = nullptr; + nativeXComponentMap_[id] = nativeXComponent; + } +} + +SampleXComponent *PluginManager::GetRender(std::string &id) +{ + if (pluginRenderMap_.find(id) == pluginRenderMap_.end()) { + SampleXComponent *instance = SampleXComponent::GetInstance(id); + pluginRenderMap_[id] = instance; + return instance; + } + return pluginRenderMap_[id]; +} + diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/plugin/plugin_manager.h b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/plugin/plugin_manager.h new file mode 100644 index 000000000..37f2a91ac --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/plugin/plugin_manager.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef PLUGIN_MANAGER_H +#define PLUGIN_MANAGER_H + +#include +#include +#include +#include +#include +#include "samples/sample_xcomponent.h" + +class PluginManager { +public: + ~PluginManager(); + + static PluginManager *GetInstance(); + + void SetNativeXComponent(std::string &id, OH_NativeXComponent *nativeXComponent); + SampleXComponent *GetRender(std::string &id); + void Export(napi_env env, napi_value exports); + +private: + std::unordered_map nativeXComponentMap_; + std::unordered_map pluginRenderMap_; +}; +#endif // PLUGIN_MANAGER_H diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/samples/sample_xcomponent.cpp b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/samples/sample_xcomponent.cpp new file mode 100644 index 000000000..0dbd2cffa --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/samples/sample_xcomponent.cpp @@ -0,0 +1,436 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include +#include +#include "common/log_common.h" +#include "sample_xcomponent.h" + +static void OnSurfaceCreatedCB(OH_NativeXComponent *component, void *window) +{ + SAMPLE_LOGI("OnSurfaceCreatedCB"); + if ((component == nullptr) || (window == nullptr)) { + SAMPLE_LOGE("OnSurfaceCreatedCB: component or window is null"); + return; + } + char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {'\0'}; + uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1; + if (OH_NativeXComponent_GetXComponentId(component, idStr, &idSize) != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) { + SAMPLE_LOGE("OnSurfaceCreatedCB: Unable to get XComponent id"); + return; + } + std::string id(idStr); + auto render = SampleXComponent::GetInstance(id); + OHNativeWindow *nativeWindow = static_cast(window); + render->SetNativeWindow(nativeWindow); + + uint64_t width; + uint64_t height; + int32_t xSize = OH_NativeXComponent_GetXComponentSize(component, window, &width, &height); + if ((xSize == OH_NATIVEXCOMPONENT_RESULT_SUCCESS) && (render != nullptr)) { + render->SetHeight(height); + render->SetWidth(width); + SAMPLE_LOGI("xComponent width = %{public}lu, height = %{public}llu", width, height); + } +} + +static void OnSurfaceDestroyedCB(OH_NativeXComponent *component, void *window) +{ + SAMPLE_LOGI("OnSurfaceDestroyedCB"); + if ((component == nullptr) || (window == nullptr)) { + SAMPLE_LOGE("OnSurfaceDestroyedCB: component or window is null"); + return; + } + char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {'\0'}; + uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1; + if (OH_NativeXComponent_GetXComponentId(component, idStr, &idSize) != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) { + SAMPLE_LOGE("OnSurfaceDestroyedCB: Unable to get XComponent id"); + return; + } + std::string id(idStr); + SampleXComponent::Release(id); +} + +// Start display_sync_napi_frame_rate_setting_and_subscription_function_registration] +static void TestCallback(OH_NativeXComponent *component, uint64_t timestamp, uint64_t targetTimestamp) +{ + SAMPLE_LOGI("test callback timestamp = %{public}llu, targetTimestamp = %{public}llu", timestamp, targetTimestamp); + if (component == nullptr) { + SAMPLE_LOGE("TestCallback: component is null"); + return; + } + + char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {'\0'}; + uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1; + if (OH_NativeXComponent_GetXComponentId(component, idStr, &idSize) != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) { + SAMPLE_LOGE("TestCallback: Unable to get XComponent id"); + return; + } + + std::string id(idStr); + auto render = SampleXComponent::GetInstance(id); + OHNativeWindow *nativeWindow = render->GetNativeWindow(); + uint64_t width; + uint64_t height; + + int32_t xSize = OH_NativeXComponent_GetXComponentSize(component, nativeWindow, &width, &height); + if ((xSize == OH_NATIVEXCOMPONENT_RESULT_SUCCESS) && (render != nullptr)) { + render->Prepare(); + render->Create(); + if (id == "xcomponentId_30") { + int offset = 16; + render->ConstructPath(offset, offset, render->defaultOffsetY); + } + if (id == "xcomponentId_120") { + int offset = 4; + render->ConstructPath(offset, offset, render->defaultOffsetY); + } + render->SetPenAndBrush(); + render->DrawPath(); + render->DisPlay(); + render->Destroy(); + } +} +// End display_sync_napi_frame_rate_setting_and_subscription_function_registration] + +static std::unordered_map g_instance; + +void SampleXComponent::SetWidth(uint64_t width) +{ + width_ = width; +} + +void SampleXComponent::SetHeight(uint64_t height) +{ + height_ = height; +} + +void SampleXComponent::SetNativeWindow(OHNativeWindow *nativeWindow) +{ + nativeWindow_ = nativeWindow; +} + +OHNativeWindow *SampleXComponent::GetNativeWindow() +{ + return nativeWindow_; +} + +void SampleXComponent::Prepare() +{ + if (nativeWindow_ == nullptr) { + SAMPLE_LOGE("nativeWindow_ is nullptr"); + return; + } + int ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow_, &buffer_, &fenceFd_); + SAMPLE_LOGI("request buffer ret = %{public}d", ret); + bufferHandle_ = OH_NativeWindow_GetBufferHandleFromNative(buffer_); + mappedAddr_ = static_cast( + mmap(bufferHandle_->virAddr, bufferHandle_->size, PROT_READ | PROT_WRITE, MAP_SHARED, bufferHandle_->fd, 0)); + if (mappedAddr_ == MAP_FAILED) { + SAMPLE_LOGE("mmap failed"); + } +} + +void SampleXComponent::DisPlay() +{ + void *bitmapAddr = OH_Drawing_BitmapGetPixels(cBitmap_); + uint32_t *value = static_cast(bitmapAddr); + + uint32_t *pixel = static_cast(mappedAddr_); + if (pixel == nullptr) { + SAMPLE_LOGE("pixel is null"); + return; + } + if (value == nullptr) { + SAMPLE_LOGE("value is null"); + return; + } + for (uint32_t x = 0; x < width_; x++) { + for (uint32_t y = 0; y < height_; y++) { + *pixel++ = *value++; + } + } + Region region {nullptr, 0}; + OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow_, buffer_, fenceFd_, region); + int result = munmap(mappedAddr_, bufferHandle_->size); + if (result == -1) { + SAMPLE_LOGE("munmap failed!"); + } +} + +void SampleXComponent::Create() +{ + uint32_t width = static_cast(bufferHandle_->stride / 4); + cBitmap_ = OH_Drawing_BitmapCreate(); + OH_Drawing_BitmapFormat cFormat {COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE}; + OH_Drawing_BitmapBuild(cBitmap_, width, height_, &cFormat); + + cCanvas_ = OH_Drawing_CanvasCreate(); + OH_Drawing_CanvasBind(cCanvas_, cBitmap_); + OH_Drawing_CanvasClear(cCanvas_, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0xFF, 0xFF)); +} + +void SampleXComponent::ConstructPath(int x, int y, int offsetY) +{ + float offsetOfAy = 100.0; + float offsetOfCy = 200.0; + float offsetOfX = 1.0; + + aY = offsetOfAy + offsetY; + cY = offsetOfCy + offsetY; + + if (desc) { + aX -= x * offsetOfX; + bX -= x * offsetOfX; + } else { + aX += x * offsetOfX; + bX += x * offsetOfX; + } + + if (bX >= width_) { + desc = true; + } + + if (aX <= 0) { + desc = false; + } + + float bY = aY; + float cX = bX; + float dX = aX; + float dY = cY; + + cPath_ = OH_Drawing_PathCreate(); + OH_Drawing_PathMoveTo(cPath_, aX, aY); + OH_Drawing_PathLineTo(cPath_, bX, bY); + OH_Drawing_PathLineTo(cPath_, cX, cY); + OH_Drawing_PathLineTo(cPath_, dX, dY); + + OH_Drawing_PathClose(cPath_); +} + +void SampleXComponent::SetPenAndBrush() +{ + constexpr float penWidth = 10.0f; + cPen_ = OH_Drawing_PenCreate(); + OH_Drawing_PenSetAntiAlias(cPen_, true); + OH_Drawing_PenSetColor(cPen_, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0x00, 0x00)); + OH_Drawing_PenSetWidth(cPen_, penWidth); + OH_Drawing_PenSetJoin(cPen_, LINE_ROUND_JOIN); + OH_Drawing_CanvasAttachPen(cCanvas_, cPen_); + + cBrush_ = OH_Drawing_BrushCreate(); + OH_Drawing_BrushSetColor(cBrush_, OH_Drawing_ColorSetArgb(0xFF, 0x00, 0xFF, 0x00)); + + OH_Drawing_CanvasAttachBrush(cCanvas_, cBrush_); +} + +void SampleXComponent::DrawPath() +{ + OH_Drawing_CanvasDrawPath(cCanvas_, cPath_); +} + +// [Start display_sync_napi_register] +napi_value SampleXComponent::NapiRegister(napi_env env, napi_callback_info info) +{ + // [StartExclude display_sync_napi_register] + SAMPLE_LOGI("NapiRegister"); + if ((env == nullptr) || (info == nullptr)) { + SAMPLE_LOGE("NapiRegister: env or info is null"); + return nullptr; + } + + napi_value thisArg; + if (napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, nullptr) != napi_ok) { + SAMPLE_LOGE("NapiRegister: napi_get_cb_info fail"); + return nullptr; + } + + napi_value exportInstance; + if (napi_get_named_property(env, thisArg, OH_NATIVE_XCOMPONENT_OBJ, &exportInstance) != napi_ok) { + SAMPLE_LOGE("NapiRegister: napi_get_named_property fail"); + return nullptr; + } + + OH_NativeXComponent *nativeXComponent = nullptr; + if (napi_unwrap(env, exportInstance, reinterpret_cast(&nativeXComponent)) != napi_ok) { + SAMPLE_LOGE("NapiRegister: napi_unwrap fail"); + return nullptr; + } + + char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {'\0'}; + uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1; + if (OH_NativeXComponent_GetXComponentId(nativeXComponent, idStr, &idSize) != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) { + SAMPLE_LOGE("NapiRegister: Unable to get XComponent id"); + return nullptr; + } + SAMPLE_LOGI("RegisterID = %{public}s", idStr); + std::string id(idStr); + SampleXComponent *render = SampleXComponent().GetInstance(id); + if (render != nullptr) { + if (id == "xcomponentId_30") { + OH_NativeXComponent_ExpectedRateRange range = {30, 120, 30}; + OH_NativeXComponent_SetExpectedFrameRateRange(nativeXComponent, &range); + } + + if (id == "xcomponentId_120") { + OH_NativeXComponent_ExpectedRateRange range = {30, 120, 120}; + OH_NativeXComponent_SetExpectedFrameRateRange(nativeXComponent, &range); + } + // [EndExclude display_sync_napi_register] + render->RegisterOnFrameCallback(nativeXComponent); + // [StartExclude display_sync_napi_register] + } + return nullptr; + // [EndExclude display_sync_napi_register] +} +// [End display_sync_napi_register] + +// [Start display_sync_napi_unregister] +napi_value SampleXComponent::NapiUnregister(napi_env env, napi_callback_info info) +{ + // [StartExclude display_sync_napi_unregister] + SAMPLE_LOGI("NapiUnregister"); + if ((env == nullptr) || (info == nullptr)) { + SAMPLE_LOGE("NapiUnregister: env or info is null"); + return nullptr; + } + + napi_value thisArg; + if (napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, nullptr) != napi_ok) { + SAMPLE_LOGE("NapiUnregister: napi_get_cb_info fail"); + return nullptr; + } + + napi_value exportInstance; + if (napi_get_named_property(env, thisArg, OH_NATIVE_XCOMPONENT_OBJ, &exportInstance) != napi_ok) { + SAMPLE_LOGE("NapiUnregister: napi_get_named_property fail"); + return nullptr; + } + + OH_NativeXComponent *nativeXComponent = nullptr; + if (napi_unwrap(env, exportInstance, reinterpret_cast(&nativeXComponent)) != napi_ok) { + SAMPLE_LOGE("NapiUnregister: napi_unwrap fail"); + return nullptr; + } + + char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {'\0'}; + uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1; + if (OH_NativeXComponent_GetXComponentId(nativeXComponent, idStr, &idSize) != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) { + SAMPLE_LOGE("NapiUnregister: Unable to get XComponent id"); + return nullptr; + } + SAMPLE_LOGI("ID = %{public}s", idStr); + std::string id(idStr); + SampleXComponent *render = SampleXComponent().GetInstance(id); + if (render != nullptr) { + // [EndExclude display_sync_napi_unregister] + OH_NativeXComponent_UnregisterOnFrameCallback(nativeXComponent); + // [StartExclude display_sync_napi_unregister] + SAMPLE_LOGI("NapiUnregister executed"); + } else { + SAMPLE_LOGE("render is nullptr"); + } + return nullptr; + // [EndExclude display_sync_napi_unregister] +} +// [End display_sync_napi_unregister] + +SampleXComponent::~SampleXComponent() +{ + OH_Drawing_BrushDestroy(cBrush_); + cBrush_ = nullptr; + OH_Drawing_PenDestroy(cPen_); + cPen_ = nullptr; + OH_Drawing_PathDestroy(cPath_); + cPath_ = nullptr; + OH_Drawing_CanvasDestroy(cCanvas_); + cCanvas_ = nullptr; + OH_Drawing_BitmapDestroy(cBitmap_); + cBitmap_ = nullptr; + + buffer_ = nullptr; + bufferHandle_ = nullptr; + nativeWindow_ = nullptr; + mappedAddr_ = nullptr; +} + +void SampleXComponent::Destroy() +{ + OH_Drawing_BrushDestroy(cBrush_); + cBrush_ = nullptr; + OH_Drawing_PenDestroy(cPen_); + cPen_ = nullptr; + OH_Drawing_PathDestroy(cPath_); + cPath_ = nullptr; + OH_Drawing_CanvasDestroy(cCanvas_); + cCanvas_ = nullptr; + OH_Drawing_BitmapDestroy(cBitmap_); + cBitmap_ = nullptr; +} + +void SampleXComponent::Release(std::string &id) +{ + SampleXComponent *render = SampleXComponent::GetInstance(id); + if (render != nullptr) { + delete render; + render = nullptr; + g_instance.erase(g_instance.find(id)); + } +} + +void SampleXComponent::Export(napi_env env, napi_value exports) +{ + if ((env == nullptr) || (exports == nullptr)) { + SAMPLE_LOGE("Export: env or exports is null"); + return; + } + napi_property_descriptor desc[] = { + {"register", nullptr, SampleXComponent::NapiRegister, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"unregister", nullptr, SampleXComponent::NapiUnregister, nullptr, nullptr, nullptr, napi_default, nullptr}}; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + if (napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc) != napi_ok) { + SAMPLE_LOGE("Export: napi_define_properties failed"); + } +} + +void SampleXComponent::RegisterCallback(OH_NativeXComponent *nativeXComponent) +{ + SAMPLE_LOGI("register callback"); + renderCallback_.OnSurfaceCreated = OnSurfaceCreatedCB; + renderCallback_.OnSurfaceDestroyed = OnSurfaceDestroyedCB; + renderCallback_.DispatchTouchEvent = nullptr; + renderCallback_.OnSurfaceChanged = nullptr; + OH_NativeXComponent_RegisterCallback(nativeXComponent, &renderCallback_); +} + +// [Start display_sync_register_on_frame_callback] +void SampleXComponent::RegisterOnFrameCallback(OH_NativeXComponent *nativeXComponent) +{ + SAMPLE_LOGI("register onFrameCallback"); + OH_NativeXComponent_RegisterOnFrameCallback(nativeXComponent, TestCallback); +} +// [End display_sync_register_on_frame_callback] + +SampleXComponent *SampleXComponent::GetInstance(std::string &id) +{ + if (g_instance.find(id) == g_instance.end()) { + SampleXComponent *render = new SampleXComponent(id); + g_instance[id] = render; + return render; + } else { + return g_instance[id]; + } +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/samples/sample_xcomponent.h b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/samples/sample_xcomponent.h new file mode 100644 index 000000000..c58375197 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/samples/sample_xcomponent.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef SAMPLE_XCOMPONENT_H +#define SAMPLE_XCOMPONENT_H +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "napi/native_api.h" + +class SampleXComponent { +public: + SampleXComponent() = default; + ~SampleXComponent(); + explicit SampleXComponent(std::string id) : id_(id) {} + static napi_value NapiRegister(napi_env env, napi_callback_info info); + static napi_value NapiUnregister(napi_env env, napi_callback_info info); + static void Release(std::string &id); + void DrawPath(); + void SetWidth(uint64_t width); + void SetHeight(uint64_t height); + void SetNativeWindow(OHNativeWindow *nativeWindow); + OHNativeWindow *GetNativeWindow(); + + void Prepare(); + void Create(); + void DisPlay(); + void ConstructPath(int x, int y, int offsetY); + void SetPenAndBrush(); + void Export(napi_env env, napi_value exports); + void RegisterCallback(OH_NativeXComponent *nativeXComponent); + void RegisterOnFrameCallback(OH_NativeXComponent *nativeXComponent); + void Destroy(); + static SampleXComponent *GetInstance(std::string &id); + std::string id_; + int defaultOffsetY = 200; + +private: + OH_NativeXComponent_Callback renderCallback_; + + uint64_t width_ = 0; + uint64_t height_ = 0; + + float aX = 0.0; + float aY = 0.0; + float bX = 80.0; + float cY = 0.0; + bool desc = false; + + OH_Drawing_Bitmap *cBitmap_ = nullptr; + OH_Drawing_Canvas *cCanvas_ = nullptr; + + OH_Drawing_Path *cPath_ = nullptr; + OH_Drawing_Brush *cBrush_ = nullptr; + OH_Drawing_Pen *cPen_ = nullptr; + OHNativeWindow *nativeWindow_ = nullptr; + uint32_t *mappedAddr_ = nullptr; + BufferHandle *bufferHandle_ = nullptr; + struct NativeWindowBuffer *buffer_ = nullptr; + int fenceFd_ = 0; +}; + +#endif diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/types/libentry/index.d.ts b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/types/libentry/index.d.ts new file mode 100644 index 000000000..72ce2401d --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/types/libentry/index.d.ts @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const add: (a: number, b: number) => number; \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/types/libentry/oh-package.json5 b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 000000000..65023700b --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,20 @@ +/* + * 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. + */ +{ + "name": "libentry.so", + "types": "./Index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/CustomDrawDisplaySync.ets b/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/CustomDrawDisplaySync.ets new file mode 100644 index 000000000..190d0eaf0 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/CustomDrawDisplaySync.ets @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start display_sync_by_ui_import_module] +import { displaySync } from '@kit.ArkGraphics2D'; +// [End display_sync_by_ui_import_module] +import { router } from '@kit.ArkUI'; + +// [Start display_sync_by_ui_complete_example] +// [Start display_sync_create_object] +@Entry +@Component +struct Index { + // [StartExclude display_sync_create_object] + @State drawFirstSize: number = 25; + @State drawSecondSize: number = 25; + // [EndExclude display_sync_create_object] + private backDisplaySyncSlow: displaySync.DisplaySync | undefined = undefined; + private backDisplaySyncFast: displaySync.DisplaySync | undefined = undefined; +// [End display_sync_create_object] + private isBigger_30: boolean = true; + private isBigger_60: boolean = true; + + // [Start display_sync_create_text_component] + @Builder + doSomeRenderFirst() { + Text('30') + .fontSize(this.drawFirstSize) + } + + @Builder + doSomeRenderSecond() { + Text('60') + .fontSize(this.drawSecondSize) + } + // [End display_sync_create_text_component] + + // [Start display_sync_frame_rate_setting_and_subscription_function_registration] + CreateDisplaySyncSlow() { + let range: ExpectedFrameRateRange = { + expected: 30, + min: 0, + max: 120 + }; + + let draw30 = (intervalInfo: displaySync.IntervalInfo) => { + if (this.isBigger_30) { + this.drawFirstSize += 1; + if (this.drawFirstSize > 150) { + this.isBigger_30 = false; + } + } else { + this.drawFirstSize -= 1; + if (this.drawFirstSize < 25) { + this.isBigger_30 = true; + } + } + }; + + this.backDisplaySyncSlow = displaySync.create(); + this.backDisplaySyncSlow.setExpectedFrameRateRange(range); + this.backDisplaySyncSlow.on("frame", draw30); + } + // [End display_sync_frame_rate_setting_and_subscription_function_registration] + + CreateDisplaySyncFast() { + let range: ExpectedFrameRateRange = { + expected: 60, + min: 0, + max: 120 + }; + + let draw60 = (intervalInfo: displaySync.IntervalInfo) => { + if (this.isBigger_60) { + this.drawSecondSize += 1; + if (this.drawSecondSize > 150) { + this.isBigger_60 = false; + } + } else { + this.drawSecondSize -= 1; + if (this.drawSecondSize < 25) { + this.isBigger_60 = true; + } + } + }; + + this.backDisplaySyncFast = displaySync.create(); + this.backDisplaySyncFast.setExpectedFrameRateRange(range); + this.backDisplaySyncFast.on("frame", draw60); + } + + // [Start display_sync_call_stop] + aboutToDisappear() { + if (this.backDisplaySyncSlow) { + this.backDisplaySyncSlow.stop(); + this.backDisplaySyncSlow = undefined; + } + if (this.backDisplaySyncFast) { + this.backDisplaySyncFast.stop(); + this.backDisplaySyncFast = undefined; + } + } + // [End display_sync_call_stop] + + build() { + Column() { + Row() { + this.doSomeRenderFirst(); + } + .height('40%') + + Row() { + this.doSomeRenderSecond(); + } + .height('40%') + + Row() { + // [Start display_sync_start_per_frame_callback] + Button('Start') + .id('CustomDrawStart') + .fontSize(14) + .fontWeight(500) + .margin({ bottom: 10, left: 5 }) + .fontColor(Color.White) + .onClick((): void => { + if (this.backDisplaySyncSlow == undefined) { + this.CreateDisplaySyncSlow(); + } + if (this.backDisplaySyncFast == undefined) { + this.CreateDisplaySyncFast(); + } + if (this.backDisplaySyncSlow) { + this.backDisplaySyncSlow.start(); + } + if (this.backDisplaySyncFast) { + this.backDisplaySyncFast.start(); + } + }) + .width('20%') + .height(40) + .shadow(ShadowStyle.OUTER_DEFAULT_LG) + // [End display_sync_start_per_frame_callback] + + // [Start display_sync_stop_per_frame_callback] + Button('Stop') + .id('CustomDrawStop') + .fontSize(14) + .fontWeight(500) + .margin({ bottom: 10, left: 5 }) + .fontColor(Color.White) + .onClick((): void => { + if (this.backDisplaySyncSlow) { + this.backDisplaySyncSlow.stop(); + } + if (this.backDisplaySyncFast) { + this.backDisplaySyncFast.stop(); + } + }) + .width('20%') + .height(40) + .shadow(ShadowStyle.OUTER_DEFAULT_LG) + // [End display_sync_stop_per_frame_callback] + + Button('Back') + .id('CustomDrawBack') + .fontSize(14) + .fontWeight(500) + .margin({ bottom: 10, left: 5 }) + .fontColor(Color.White) + .onClick((): void => { + if (this.backDisplaySyncSlow) { + this.backDisplaySyncSlow.stop(); + } + if (this.backDisplaySyncFast) { + this.backDisplaySyncFast.stop(); + } + router.back(); + }) + .width('20%') + .height(40) + .shadow(ShadowStyle.OUTER_DEFAULT_LG) + } + .width('100%') + .justifyContent(FlexAlign.Center) + .shadow(ShadowStyle.OUTER_DEFAULT_SM) + .alignItems(VerticalAlign.Bottom) + .layoutWeight(1) + } + } +} +// [End display_sync_by_ui_complete_example] \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/PropertyAnimationDisplaySync.ets b/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/PropertyAnimationDisplaySync.ets new file mode 100644 index 000000000..3eb15f8e0 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/PropertyAnimationDisplaySync.ets @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { router } from '@kit.ArkUI'; + +// [Start display_sync_by_property_animation_complete_example] +@Entry +@Component +struct AnimationToAnimationDemo { + @State isAnimation: boolean = false; + @State translateX1: number = -100; + @State translateX2: number = -100; + @State translateX3: number = -100; + uiContext: UIContext | undefined = undefined; + + aboutToAppear() { + this.uiContext = this.getUIContext(); + if (!this.uiContext) { + console.warn('no uiContext'); + return; + } + } + + build() { + Column() { + Row() { + Text('30') + .fontWeight(FontWeight.Bold) + .fontSize(16) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .borderRadius(10) + .backgroundColor(0xF56C6C) + .width(80) + .height(80) + .translate({ x: this.translateX1 }) + } + .height('20%') + + Row() { + Text('40') + .fontWeight(FontWeight.Bold) + .fontSize(16) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .borderRadius(10) + .backgroundColor(0x2E8B57) + .width(80) + .height(80) + .translate({ x: this.translateX2 }) + } + .height('20%') + + Row() { + // [Start display_sync_property_animation] + Text('60') + // [StartExclude display_sync_property_animation] + .fontWeight(FontWeight.Bold) + .fontSize(16) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .borderRadius(10) + .backgroundColor(0x008B8B) + .width(80) + .height(80) + .translate({ x: this.translateX3 }) + // [EndExclude display_sync_property_animation] + .animation({ + duration: 1200, + iterations: 10, + playMode: PlayMode.AlternateReverse, + expectedFrameRateRange: { + expected: 60, + min: 0, + max: 120, + }, + }) + // [End display_sync_property_animation] + } + .height('20%') + + Row() { + // [Start display_sync_explicit_animation] + Button('Start') + // [StartExclude display_sync_explicit_animation] + .id('PropertyAnimationStart') + .fontSize(14) + .fontWeight(500) + .margin({ bottom: 10, left: 5 }) + .fontColor(Color.White) + .onClick(() => { + this.isAnimation = !this.isAnimation; + this.translateX3 = this.isAnimation ? 100 : -100; + // [EndExclude display_sync_explicit_animation] + + this.uiContext?.animateTo({ + duration: 1200, + iterations: 10, + playMode: PlayMode.AlternateReverse, + expectedFrameRateRange: { + expected: 30, + min: 0, + max: 120, + }, + }, () => { + this.translateX1 = this.isAnimation ? 100 : -100; + }) + // [End display_sync_explicit_animation] + + this.uiContext?.animateTo({ + duration: 1200, + iterations: 10, + playMode: PlayMode.AlternateReverse, + expectedFrameRateRange: { + expected: 40, + min: 0, + max: 120, + }, + }, () => { + this.translateX2 = this.isAnimation ? 100 : -100; + }) + }) + .width('40%') + .height(40) + .shadow(ShadowStyle.OUTER_DEFAULT_LG) + + Button('Back') + .id('PropertyAnimationBack') + .fontSize(14) + .fontWeight(500) + .margin({ bottom: 10, left: 5 }) + .fontColor(Color.White) + .onClick((): void => { + router.back(); + }) + .width('40%') + .height(40) + .shadow(ShadowStyle.OUTER_DEFAULT_LG) + } + .width('100%') + .justifyContent(FlexAlign.Center) + .shadow(ShadowStyle.OUTER_DEFAULT_SM) + .alignItems(VerticalAlign.Bottom) + .layoutWeight(1) + } + .width('100%') + .justifyContent(FlexAlign.Center) + .shadow(ShadowStyle.OUTER_DEFAULT_SM) + .layoutWeight(1) + } +} +// [End display_sync_by_property_animation_complete_example] \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/XComponentDisplaySync.ets b/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/XComponentDisplaySync.ets new file mode 100644 index 000000000..96016ea26 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/XComponentDisplaySync.ets @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// [Start display_sync_create_xcomponent] +import XComponentContext from '../interface/XComponentContext'; +import { router } from '@kit.ArkUI'; + +@Entry +@Component +struct Index { + private xComponentContext1: XComponentContext | undefined = undefined; + private xComponentContext2: XComponentContext | undefined = undefined; + + build() { + Column() { + Row() { + // [StartExclude display_sync_create_xcomponent] + Text('30fps') + .fontWeight(FontWeight.Bold) + .fontSize(12) + .fontColor(Color.Red) + .textAlign(TextAlign.End) + .width(40) + .height(30) + // [EndExclude display_sync_create_xcomponent] + + XComponent({ + id: 'xcomponentId_30', + type: XComponentType.SURFACE, + libraryname: 'entry' + }) + .onLoad((xComponentContext) => { + this.xComponentContext1 = xComponentContext as XComponentContext; + }).width('640px') + .backgroundColor(Color.White) + + + }.height('40%') + + + Row() { + // [StartExclude display_sync_create_xcomponent] + Text('120fps') + .fontWeight(FontWeight.Bold) + .fontSize(12) + .fontColor(Color.Red) + .textAlign(TextAlign.End) + .width(40) + .height(30) + // [EndExclude display_sync_create_xcomponent] + + XComponent({ + id: 'xcomponentId_120', + type: XComponentType.SURFACE, + libraryname: 'entry' + }) + .onLoad((xComponentContext) => { + this.xComponentContext2 = xComponentContext as XComponentContext; + }).width('640px') + .backgroundColor(Color.White) + }.height('40%') + // [End display_sync_create_xcomponent] + + // [Start display_sync_start_and_stop_per_frame_callback] + Row() { + Button('Start') + .id('Start') + .fontSize(14) + .fontWeight(500) + .margin({ bottom: 20, right: 6, left: 6 }) + .onClick(() => { + if (this.xComponentContext1) { + this.xComponentContext1.register(); + } + if (this.xComponentContext2) { + this.xComponentContext2.register(); + } + }) + .width('30%') + .height(40) + .shadow(ShadowStyle.OUTER_DEFAULT_LG) + + Button('Stop') + .id('Stop') + .fontSize(14) + .fontWeight(500) + .margin({ bottom: 20, left: 6 }) + .onClick(() => { + if (this.xComponentContext1) { + this.xComponentContext1.unregister(); + } + if (this.xComponentContext2) { + this.xComponentContext2.unregister(); + } + }) + .width('30%') + .height(40) + .shadow(ShadowStyle.OUTER_DEFAULT_LG) + // [End display_sync_start_and_stop_per_frame_callback] + + Button('Back') + .id('Back') + .fontSize(14) + .fontWeight(500) + .margin({ bottom: 20, left: 6 }) + .onClick((): void => { + if (this.xComponentContext1) { + this.xComponentContext1.unregister(); + } + if (this.xComponentContext2) { + this.xComponentContext2.unregister(); + } + router.back(); + }) + .width('30%') + .height(40) + .shadow(ShadowStyle.OUTER_DEFAULT_LG) + } + .width('100%') + .height('20%') + } + } +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/ets/entryability/EntryAbility.ets b/ArkGraphics2D/DisplaySync/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 000000000..a32a8361c --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/ArkGraphics2D/DisplaySync/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 000000000..be794f48c --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/ets/interface/XComponentContext.ts b/ArkGraphics2D/DisplaySync/entry/src/main/ets/interface/XComponentContext.ts new file mode 100644 index 000000000..7bdd8fbc3 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/ets/interface/XComponentContext.ts @@ -0,0 +1,21 @@ +/* + * 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. + */ +// [Start display_sync_export_interface_xcomponent_context] +export default interface XComponentContext { + register(): void; + + unregister(): void; +}; +// [End display_sync_export_interface_xcomponent_context] diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/ets/pages/Index.ets b/ArkGraphics2D/DisplaySync/entry/src/main/ets/pages/Index.ets new file mode 100644 index 000000000..a4a4ba0bb --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,89 @@ +/* + * 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 { router } from '@kit.ArkUI'; +import { hilog } from '@kit.PerformanceAnalysisKit'; + +@Entry +@Component +struct Index { + build() { + Column({ space: 20 }) { + Button("Requesting Frame Rates for Animations") + .id("AnimationFpsRequest") + .fontSize(16) + .fontWeight(500) + .margin({ top: 200, left: 6 }) + .onClick((): void => { + router.pushUrl({ + url: 'DispalySync/PropertyAnimationDisplaySync' + }, router.RouterMode.Standard, (err) => { + if (err) { + hilog.error(0x0001, "router.pushUrl", + "Invoke replaceUrl failed, code is %{public}s, message is %{public}s", + err.code, err.message); + return; + } + hilog.info(0x0002, "router.pushUrl", "Invoke replaceUrl succeeded."); + }); + }) + .width('80%') + .height(40) + + + Button('Requesting Frame Rates for UI Components') + .id('UiFpsRequest') + .fontSize(16) + .fontWeight(500) + .margin({ top: 20, left: 6 }) + .onClick((): void => { + router.pushUrl({ + url: 'DispalySync/CustomDrawDisplaySync' + }, router.RouterMode.Standard, (err) => { + if (err) { + hilog.error(0x0001, "router.pushUrl", + "Invoke replaceUrl failed, code is %{public}s, message is %{public}s.", + err.code, err.message); + return; + } + hilog.info(0x0002, "router.pushUrl", "Invoke replaceUrl succeeded."); + }); + }) + .width('80%') + .height(40) + + Button('Requesting Frame Rates for Custom Content') + .id('XComponent') + .fontSize(16) + .fontWeight(500) + .margin({ top: 20, left: 6 }) + .onClick((): void => { + router.pushUrl({ + url: 'DispalySync/XComponentDisplaySync' + }, router.RouterMode.Single, (err) => { + if (err) { + hilog.error(0x0001, "router.pushUrl", + "Invoke replaceUrl failed, code is %{public}s, message is %{public}s.", + err.code, err.message); + return; + } + hilog.info(0x0002, "router.pushUrl", "Invoke replaceUrl succeeded."); + }); + }) + .width('80%') + .height(40) + } + .width('100%') + } +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/ets/utils/Logger.ets b/ArkGraphics2D/DisplaySync/entry/src/main/ets/utils/Logger.ets new file mode 100644 index 000000000..517c8134a --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/ets/utils/Logger.ets @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import hilog from '@ohos.hilog'; + +class Logger { + private domain: number; + private prefix: string; + private format: string = '%{public}s, %{public}s'; + + constructor(prefix: string) { + this.prefix = prefix; + this.domain = 0xFF00; + } + + debug(...args: string[]) { + hilog.debug(this.domain, this.prefix, this.format, args); + } + + info(...args: string[]) { + hilog.info(this.domain, this.prefix, this.format, args); + } + + warn(...args: string[]) { + hilog.warn(this.domain, this.prefix, this.format, args); + } + + error(...args: string[]) { + hilog.error(this.domain, this.prefix, this.format, args); + } +} + +export default new Logger('[Sample_DisplaySync]'); \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/module.json5 b/ArkGraphics2D/DisplaySync/entry/src/main/module.json5 new file mode 100644 index 000000000..ca3c9ba31 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/module.json5 @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/resources/base/element/color.json b/ArkGraphics2D/DisplaySync/entry/src/main/resources/base/element/color.json new file mode 100644 index 000000000..3c712962d --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/resources/base/element/string.json b/ArkGraphics2D/DisplaySync/entry/src/main/resources/base/element/string.json new file mode 100644 index 000000000..aa6d9f08b --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "Sample_DisplaySync" + } + ] +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/resources/base/media/background.png b/ArkGraphics2D/DisplaySync/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/resources/base/media/foreground.png b/ArkGraphics2D/DisplaySync/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 zcmeHuS6EX)+pUO#NL3(IK|}&d7YKwF5CM@UBE5tjTBw4Q5KwvxB2pw25vBJIB27p@ zOaSQt5eZd#CxmkF|4+F-=Q)?(#XNgvmzlk1)~tDFz3+~Fs;5bRo%8yoOPA=i9zS|^ z=@P~5f9V?4rAwDs!Yjfq4p(5Rx~i8hRVUG&*j~LT%Q>2AIqB+Nx_^yhg70E+c&i!%2~zqE0}mxIX= zz1$7|sWj&3yL#7D|4uLjQqV+x(Rz4WC{A9|^m@1A6`BNi38Cf3B^aJyqxF{TjS&2q=3$BC zB1Fu04C;%o9V_Yg;Ed;xpmge>%b<|5q52W_pTd9o;Qty2mQ+-Peu)^(K)RH^d5byH z>AGB-I7$|~9l)J0H_LPDsUUL#brIHpjO1>dJ9@_5&W zLV)s!AVn7*Hy{o<1zLA_Ky-TWzJ_^1=W=Gfyc#1ssqeY_2ww>;ANX%JT)(9uNHOtU zeqU2_{Wu6pLvCMBLgy+dx=13ZG-+cMrBf;#8KezD^}_F2x>_Nob0^iXEv>aML;8RQ@@sN(#bq~VsOa>) zW9RDe#_!zLkj)PyQ<05AjbPk5yJ^|B6q=sMX2L0JE|(P%=v2$6+4QL)cu$c*yt`EC z?)p#@xE12zK?QF2u^(xb0>KieYWS%DH`?=eOiFd!6)WRmCo6Joq6}7e=Nl_;oNJ{1 zu&szm^c0s*wAxfHSlk^+hb)aB<&B?9+_YvxC1LEy$(dDJ8J)d!>rwz?q zGTpJ5&uVwR#t4%B`T{*~RAd_Unnf&`*9c^zbZfsVc;v*@=BHOCX7VbyhnS5G*Pik} z@`U!W&dq$A-&GCYAWg@rG3W6ANL_2a)|;&HJSig{zyfyO87W{;ej&@-)yx~eu|G6S zO)U5U?QD)!ey@XcxEKX?m{R4VZN!*V9gT}6_lv@YD^}}y4OM(*#%kMMBij<9x4*by zCkGRQ3vqoZ)HvQ4oY~=kh{c09u`@Lzqk8)3R+$+hcYuhqajQqgq8qWy8X_QMy@1+T z0&yU)D$XzuW+GZpAB%%|^3*{x!r`8nOWhu6>t(2mvERH# zwD(@F(UyHL)A@d0q#?|SOaIrK7`~^_KhtD69y6E{G70hSpvkOuvhEmR1(|2efAmi@Xw9*}m%vZb>kVqe?t6*aL%179k2-;CD<(T2&{-rQ;%g&4b= zStwf@&UH8&T6lBt>jybuLy}~>HTF7(kmQuR6(8*l&xSQq79o~y=t@1Z0aSiA&-LWp z0NQ{@*q$n1m#1Z}?sFj0=6jxX!@eHh_D<=qD}vOG`kCQ^44In=iDu`srXYt8{4c&) z7G9;S9(*ydG({X#u#N%3l}&Yaq*lzrY-E%htNRQTrjCrX1NMi~a!soU$|=0*dXokbDxSFnm6OHLV@%5(K&ZQB%e+ZFne-TrP|veCOrVj;0pG zdbMMl{Z%MBfVA6b>SKLi zXyRQXFc}Krl(owbvDh?Um&9l0#P)rbdiZxK)8=RY8XvSG1@0=@vGxtW|3E{`T&9Zk zC0==A6=d?8`t>?}z3d12SZ$YU4KZHQPf~|w zJD7n^6bjSS+&0Kq6nxhj*9}9qDZC~A`nzEz{<+9lxx)v#qaCsGWko<{ahFVncU-R|715> z33|Jp;8Iq?Z)NXe;h$K{z8#lRB#JC*XUod!9+#hCfkg#-^FD5Jq@>Dt!SzYr@q0(& z;I!1>qg(PU*HMX7>G-#T5V;IOw~4L@XQ&5le>B4Va!sx0P1pm1PMa!%L##WB{CukUKwQLR#mw_r{d1DneIIJT(j#O#-det^FD zbdwZ-8R%84+Bo+g5iyd(a6x;*5F0xuclibP*ff{7PNPESiBNJu^Q2?h!4}38?XKcb z1cb%?RlBpM10D9~`7(D`#uzQxY}K)shcU_}%#WJZ`~FU)C1j&^b5i=Wc7uJW8^-NB z(rs3^Wms@#S~)+us~_(~uocjV^vU^euJHB^upc~CY%6gqBXHR3{FJ}D^V0uB8xrdo z%j>^}CvVUV6jaGJf5i$e;gXng&>{)uK?nWhEUaVrv+x8njtfCz>cqP8uUTn1`McQ;CD+jm zGle#Cefq~0!!v@W2XnNsA~8j@Gaaj+fT)QzP<&gR$L=bGEJ8^z*tHxS)sZ=vZPV!4 zw*)4rK3To_7<;de8PvEPu4Q5d;D=g00$bPnaG|sEP6(kDsxwc2+y=l@=8Gy3^DW?X z$=3@Y|B6^8mUadWxX-6z(Oh@9|3%Nv*Hz=bA3)}AiK3MrA@eOvp)YSd(Nf|v;6dz-v zI5xYnKImXz)PTM}jxK=GJh_OrE2HXqKgh*KB!U~;4W!DpXN6A98^kNt%~i7+I+`g5 zW}~Qod0A;Lw*Q@m73+!Rfuir!WXqcTd5mXE^DWV3AUSVk>5EA&b6Svd&!yh*!z+6( zh^>CvoV~2?y`UJ#Jho<+PlUEw=Y?Hyd8C#Oj$c!5d!Du*w4OQ9G&OxhDmQ=)tzD()srM-?#=f>aw-$x}3Z?qLOIJ{gnZu zd`Y3Pu@-6CD7)$*a6189&`vfy%c7^DmCj90Mw>5FgU_yh15-*dsMPOLpn%G&Gbq@c z)NN;i4jF!g3-}@w-}i(YUbp4WY;xYi8`sa3ep2V_UXf_!7A{;Fhp25CGF=6{xLd&d z!Mvrklt74KI=0hsCRMYBXM0Z?v1sDfN=Y&W2dW!hUyqiiU@A}R-XCxbIudes32?<&DQ!Hr>qn`aYQ?jSq?4X|x(CCDAB;b=wcWVCH1CfwqU1di z!|LlwpE@R5*{9XlM;`OM$(VZBN$c{`%$ZT3S3aYJwVO}kw)@4_EyP4SXgXkd)Q z7PtWeexnE98(N{TMKt-aG+YpQs`a~e_Y;}upm;CRXlTWI->sMI?cj%D`$7K@mQ<-e z6c3=23v>}kQ!+Z{G2&KQ99s+el!e053~lQJc`8%`$;xt_RQ&16M-jjl$HK)VZG-0esPL)%m(*xgTxhvj>YKkE?dOv3G%g-W9;dgR&pG1FoW|wrm7v|b_Y-VU zKV&S7NcSkHSjm4nrPIy#Wvwp8(lbN>^x7o60ICQ5m?QwOuUY9q(q~<6`0+a7 z_`Zhdli4>YUiT%XT1&z74m|S7pZ;||I*2@$Zd5=|9{V~xFLGS|sAE`ZQ=toXwPUzSz%(Ar!@#M}4%I2r*Ca<9 ze?7@cjo0^QC6zocYls~PXjm{I-w|^|?Hpmvl_!6;&?vERiS^(A2e-)2qxQ#IfuJ_M zgEhyUo8K;fE}w8OE$6nq26w$M-YgMyeYnhwguXF-@5ca=0xYn%I)Rl=_lZaUn5tgl zq{GPw`_E=ilA8s)Jy=%ks{*^ijmr0SqHYg5D%zYfzlqy~#fp6GHI7wm_SN!mo*B=(4jED535Cy$0WQgpMk_!VjQ zhjwgVnse1csNUVP_rkF)3q*bk`=D| zRm=kyT3qxBA7a}d4b433h)JR1r_zBVy6)DMRyM?5%=@^}YMnjurETi?w8)8Y2lox+B2Mc9(WcW709kmg&QO^PydT;QZ_K7tmYO8aA8M?Y);N zSn^>S4^jpy!tF}ZAn_;hcCNY$eyakky`&>*Nh{Yf8H17GR#{9&%f^ps6IAlo`0a7| z-5WT~hwWze!uONxb4D$Was0UyM#f|Al`@rMWg(+oyWOL{(2>P6$`ht&d;q3uD6W+D zQQKN!nzWpx$Ya8CUKa3dgn={(ad!Lm7qDcu`SB#dKHvAM#GW}Z>EZmS6yG22dWcVi zef}3H%>*xQE6XidovM|h{PD;~31ijm0ia9g=-tnlFk!0PDn12luSSt7gWP{nbUK-G z_;*xp66cFpR2OkYg+1wGZF$3SCHuNOh~T{QxmE}&DI?a%s+Q&BqRkJ^37TgbKmAKA z-lXW9)FAv@J#Z=C2lSk4@W5q7S0~BpAs>m(p{^)b2MCFka=_0~yTtPvSKJEH%6&GW zKv;f{iTBYXA0^wmTAmssRXI(3556s-FYRfgXSs2F7D?)Muw3X(n96>Fe~#_y!;5dQ zdOQ?Kp<{m8r8ee4PPIETr3Sr=L{BgNp=Hl~>nSiYS!vY-rs7>zJE&K9>k00!&bs>P zD`CMT*(GNFuh#^fdZE?R`V};&3K^rq3z5UT^^KE~V+Yq@nxU<{+Ug^t(FEIk@f~5* zgnEN(6_Zcdmg55!i|T1Xn2NBcinnnFghvgYxT5oG<#r&$ky|k5SaFs(+Vr@W6W!wc zhr8=;xACvw0kVQ6m+uK@w0M_|3*`l1D1SbQ1B%k-HMIa!=~kGkCfuQ8^C^ZQ&7xn%?zUs@ zJv~f?$}gE-(aEgrt|vKx z;}Q@0S-w8jTszP4_+Em>MvCg@+IT%eNk_MIr)gA`;*lhuP%vm}{=>pIah-$r^3{Da zp;l8BZIY#N3v`sN%POMh>Q=e-o^BM2OK_7-ztamrbZ{m49XWXIgg1Gqa+C!XfX?gxVvl@Yc z?lm`jKKariU3($HdVP4LPtp4+4mV=+tw*rjI~_q%R6DfIW|6`<`}My)W_VK!6c^i* zIvi5RI=c%+#{fOc1^%pnKBkmGk{n2 zC<)woa7^dmGd|$2v77jNVg{v9cP;?R<5Hz&w)i1YTrbpNc6%p0{Khx8hi!J94klTx zC9LuDS+2u)()U%ug}~voR<>Cq}#OQfXF2)TCm)4nk4dkJK<{Ji<% zcP30SBMi`eN&Lves%5zi8b`z0j<83Tc~cBqc7F%;N9zZcNAe!JR3!n;@j1h z1lCS;R&Xw6EFbwYNCw_`r4_DiPb}ogRDYy^watxfz7Xy(zQ=RKaRMV#RY}`WgLrrF zVY?S>T2T_0_gmfEc1P>euBpQk$h-TAw(GijhS$+YK=Tg$zQ6?>D}F1vFkHMoukc{a zEy_ED8Uf0r#&yr0HH7|2|B-{vV9-6x6%+AEp3Hd}4fvb`f5|t#1a^r!L``xWv0pYp zK_sWYo?M7Ka~?Ti?_2#VSWzD;+NOTq_0`+=>-+<27aH>r;wtxc2mAJdsVzr(62hGT z)&mW2D1I;#ot)2O9iIWid6J}Na=-qm<@K(sk9ppYVwcO*IkP(P8P9ER7!PsMfNBn& za^K3zdtRPHN^c^l9lmBs5m>rjxgOV7Io|5p!v}X)j;Ax&u7K?;q%XjX_~o%@lPr_8 z*9Uqq$6~D2?gL>l^=mP&+~8z3yT!99Io|+z9QCQwYR2S? z(t}t86UG(B`86l3E&Y`O1p($K!sj_~Szh|(peg0h(+?ymZ?)sk6C*iUD89q@SVAIS z4_&>H|FtF3pZ<_*-;w|rv%!y93`xISUXVWp-T~!8n*#@16?Q}v>{P^~9I69_ z%n*6qXY%Yy!%fWkW5OADjlkEKjP5d$8>`wRrhp=ra6@iEL)prjHQ=o3@+N$WN7maZarII1Zz-rqUrBVRY znukG8!4Q$))$$`IcgoPA;izr~)m2%Wl&%&EHeRmOXUJsiSwge{CQ5;l6K*f{(Y$dK zr+Ms$jZr918R?`Rysv0Z+#6wT~L%t0b;+Q^{rT$Y_J%=|3^Wd zt6$*epNax{<>cRLLyEm2t&MjM8j1U)pYxwc-MDWDwN~$V|G#;ney}e?-YB~f0-n-M zw?G0{JBvufZPvKoY*5O85X8y3)1IFwLkMFr+5G1knQdDje8Y{BGoelP12*9EUN%KY zxk|^L1xHs)rNCp_@p0*`=#9{%r)_7IsX3T&x{b&X;mgnjUOMtgKs#ylC}%kSdtkjl z8!FE;zg-elNMzzYzDjZ0)^Ieq?HW_G)|Sg=4mBA1EloCGZTG(+tr)OPwRZ{J7OY5O z-u^rg$|QACu3Cq*Al+><3gPrW!35XM#YAriTfXw+!m_NkpMN$HY+wKfNr4L9PYUX6 zzlS_jplR*TFaNt8ide7lbsipOGdSE!+zhi$@D8y%FCwjQ$r9L{z>FOk9`c^?Kjmj` zMuYzJ3lU=4n6Q;tr@a$L?%8~af{fraE2*s=hn>Cp;YCQ#>re~C6xoCO7}(mj#Xh*k zba*^&l5yo%qnHQd!W*<-IXZ+8vnMb>c^cM={07F5{v1ulw!aVecf>C42Ir44Vz);s zT-%=b<-{YEZ*nD{U;m4uIi#wyf4G^ggB0@5%#DRIbN7hz&!Bb!hl?A6#(~|dZ%%iN z%o^Sc0oq?wn5_;1HQ*s%km5+`HK!Bq9^dL$ZL7!o2j@&piKs-)bi>dGD9BCC4PSIk zrGJIk0P-Fv?{`4G0`eU>*i`V_XN2xXw%*xTUlVENh%_|iZDkl5p@Y866#=@Xg{cbE zjZtS75AB(^xEogv2B)1x^m!0XZdCqOZ~=~2%7kuI!6E74!u_j2iau*{do^aD^2Vk^O2eW~KSv(BzRD>xw` z&*Gb6ksujl^_Fg<9{Nxn%B8jSv6jcmU+Kw5-Q&psk7EU|G|_)%rogKwNzemwy6QX^ z@ujX`ZkT$alQ%3oWJ2VOJGz{G(ukN|LF&Ga)nKml$M>IY@1F)}2mL&m6~?A)CN|YS zLi^lZj;aN$DQnmlc~AgqcDB7)?<<0=D*JMD zM3%;`BX_AsO%3+;YjwAbOnkT+m^;*q5X>@S2hO@Aa1J zJCCx~6B|ewT}HQECVls)>JqY95!(x8tJTl^D9t}c_G8p6;&167Z{2*+*qbjZdPBKR zwYTwFdQwnL?Q_fZ1S5+O2`Bi&@(s_P_cQY7?>NOU&FL}U5YmlM6yw@TASK}~;pon& z&{?aE)kw+rf)rVR1R!KIA&R@6^&5tt+oJ8h+P)7GWpbZ0xhG1hCCSz8pFjdYT5mJUum4y`e6ST z&@%+@8U+Bx-^#X6vpu~G2`=~;;97zryltTvX_;q&`r%A)oV7(xhxX1-Obw!r%_aBq zXumue@LLi`iFY=9t~-zHYJC&!zW;W6TKK3YgAe-4E5@wu_HwjtlH4Ep5vqLS-2C5$ zSxHdkc#a7g$_vSgCJ_dxxPL&~SeaPflc=j>z18KsBxhHfhSRvim6wzyuJBI@*m2g@ zc2$Hh#1|Nide`x;s zFEY{lfS)AO1(&M2`md$eil6mNBxu2_M(#la)vUt>ub2uO+!3=jb#6Ic2xq$*jBF`n z%L9sP{NK&^17myQl!*yca`I%e*{%{^D5ld#5&5Dbmw2He%xl{Z?Bv@+UmIbjXEHB5 zH5Sh@UPidw19)2ZMmXkn`O@)IsF`Fbj+RLtb$qTJ#B-vXrZ?7??}cA6N56t|TzFj4 z=rAukcL+Zk?vE$J3_QP=HeaZiJ>sPUrar&8Ao}%X-FpDz+o?UsRbtr6!(ES)@vCo94^P>R%u%q(-9wy%Duenrn)jXuW z+2hV;WWLbrH-awRI4^BBwkb{USY=a|U+=L6IJbHc+!%aSb|KB}H$ z?;wmaMfCf`2o^LLsVRHayM++C2aVlLWRbMjawRSh!|`u4I8tjLx>H>?ZR&ba(LJXj z?DRP5gyUNUnznwc)C%qsQ!aTlw6i(@viQ+~|0fLN?FR=&Mz z!m?8%ms9Zm`@?A{S+a>p-JQ}TICnZa{gktp_;s>#3Wv_=7#GC;f$M! z&TRADKS2F7Grq42P=N2(^g3PHSv9Sr5khe~OZap~yE3UUWM-{Fh{H-BGK9MOV3L#y zw*TZQX^enrYRj7iXkEaCLTZF5z%T)MU*{_RxA-*;G{sl{7ry_e1h+X~HM>NyBnnV6 zzcFEEZvv5PId&nY^VG0nqu!l%4Ln9L8OVmkfQi1}=-j_u=t%I1_~|`SZ_zv+SV@2>e1;w+Y$vY75F((`NKQU2vax&tTw!~HE>c2M3z3d>g zk@W;ee$-qtx3IgJ&cQ;-5AmGPIIdtV0YQvcV7G)N!(PWkx#qq=;AiOzb$C@x+Z zu##CR=Q`hVF-LGTr?w9-umq+&6PrkTr)T1CJ!@XV9i+em9sS#E=UO}BNMwuBrCayH zAub{V#`%5ecrycz1$eSV8<2Ikv6CQ5E=h^K%3m6h74APzqFYP{oejD^Y7o_E2b3p| zeA*LbkS?zNs8`f>wX`CuZF=Vcnc?D9l|P;QF8KedIQiHkm!f>Y3}# zl9AL|w=FC#e&CG1Vj1SX@K&6z&wEdwI}i+9}=0 zD)hP8t2qSqGq-zz1>nRbHpsOX+Ou&rc&B>1K5Z`l|60?OVRG!%y@dyXhC`Y)1x&pBnbuTa%|7f^nM;OIHu%(W6&Ci`84e(2e5z z*ThM)rgG_sjP#cQ+Xs8;_5jS%p3?)1Cd0epUI+qH6)RAoaWyIr#O{wWN#wI+_de=e zPHAv`+(8DcYwZezvF?o<#{{xGw05-!dGx*J-i6B-YsG?>W6ke;g4Hg#P+$=@?s0UEI-*Bw6RE<{1I7> zjBlz61z%K{w(Fbs@*+5i`|zyRlh@qP_iu#(*1Wcpz$is&$q|YHc+dRFT7N)#@B@znBGn$2wXOi+ggc5BJ<+2( zlI3ksg*I$2(gaUp4h9pJY${1?hgh6#mU-3e=N{4cTb2V_4R`HbSASd)X&1AJD{hd8 z^}36_R=S?hhh>k{b|Q{V4g^$!<)__{4ZCIAOzE}*nn%8FpA_Bmaub%88)q94qdSj& zU&K}EwoAH(N;V`V{ZfKgP}7P8xX{2STb>)D)y3#SF&&=+6Jz=_o8pqGbBI1lUdL(1 zD2L567hm`YXfrYLV3fz4yv?7yE!3uaicqZ7ufRny<0U&B6qh8bcqsL`r9)-JOxkXy z+l@a1(ptpJ`{M2l$g!g@DX;KZcoPP93JT=vi}|dQ!tn5*k@U)brT5a*!NEAJ2Apj0 z3jNsKvYjiiy-sUG06+A3T)f+N_X|`ZAX$1+M8W1ZaK3Nm6Dd}Xw#CnL+A?Xi*n>}B z+g^J-yeBCQ;(6yjA1~5bLwIzXXp>6syw2d^&DXBrf$G@}~y*QOne;u_UdZD^Cl zXxza$QKpgXzp22W4GZI|8N{0M2?78Z`$wi+S>waN@uSr9`u5+ghvrjfhcjQNuoDp; zk9szfi0j_VBAd2M+55}LBoF!BASF5?QV6q5zf94lQ$2goh8#I@&N4tiMK&5WOgt0H zRiGPL-7G)N zj%2#teK$kweDwBL1+DK?B#>r?tjR02JIr zUq=)|zME?3CA9?-DRGfqM+;h7w&xgGmLjhTAOdy`b%#?iM;>=l7v)^GADOA64 zy}x#1eDIpJ^iQ-mHzp5#R2_{6(~wo;npi>z4tuCy@Z6Ovw1EGFOaCWi{Qog*{?+*F cSLciz6AsI{U0tD9;7S&f z3`9H(<`G*WCN>bN493AFOi{!!!L|afI7%o`6&6lXK&2`L1YumJiZTQ+5doQ^Fu|gz zI6Nvw1cME>!8`;4iI*N+z3;u_gZtzG5&vyF~^*1 z?S1yyXYbweAFzGO*PdLxe&gE9j&{c{J=rY}9i1#6cCzdq+ASx~UzXhiC(H6orN{Ar zj;qq$yDTU7NWP@ws1J2_*G}Ykx7%{iE$G@-7-eF^Y3#}`(v#ySiIZdTj}`y+a>=Im9Vq=f1W5yxR*!@kj+Rxz&v=+4_?qb>2v z^P8^zTt$BB=j8B|JpIS7`QY>Jz4z#w<>ZT>lB09T6nS2-t-LNa`Yg!ixr}^gvZsB` z{B;rQ@uVEqwOt7oA8%Sn=e2VBs;^`dNc~|xx$^LKH+*6BuO8<1`K9&UDuw8t_%!FY zoV0NZ!^eH~qhBH?uakr4K4~ZC5VHnAA|L9#J5r^|-)7;Y zUl$mM>pDMqeipwr+7#N+YO&F-3t!twD#tH9_S*S{wQ+C`@f*(uNuw}s=xXMh&DI;Q z;_u$0c(3`5*FEq(O?pz@6#ee_pZMDAFS)(D{hdnlGw+UhHaZ&vMC3y~_HorR=oT!) zD&Jv0*w5!@vBS?MX~$>r(d*!xjZ=9%U3__Gl0?W|%cDAF&TIVSk@)+3cqc!3boGhhYzil=`)k_5%wL2pqQz`Ju@50G)sNfVj zoXGZ|Q(f3+@xx0`O2~K<`L6lJ-SXStp$#*Nk@$Du%RKJ9@n>4_fX zCq4RXG{SB86?4nquk-Hy-E#B;AN86?zpBs|J16`d(I5ZXNB^!~KL7eV0uKN-_1L$Q zfhXMkzP+y=*8|%=cJL*vJ8JS$i*h!V@e z?gp)OZL3q^qPRQ$mTS*l z!1Lo9sgwA)pzOQd7ry0nSAP)8dF^z>J#;@|{wb*sK5UU+HV4!!`0VEJLKou6^E1;q z{-F(t{g8gMTs+F%4CL8B(dE++Be1u} zQa1d_@^?2B{4?(K#G2gBZ2YKxYj^wS1vv8wb2h-K`rtLS+C4j5oS5zZQT6pjk(( zJ4B5)x)C<~DS-Jn#3lX27u>p0yp_M+jn)mGYaUy>+T%Nnb1#0!>tbyAQ%)nklRSgJ z&7=Ic?ks-hoA@5fJ^x~JiY`PYkDmW0C(plGd!Q$Ex;t|N@d~qieC9rdJUa(Jbmg%% zxJoLcUW^RY7oUugb$iXkOVyLI8AJG+ zNchYly!4G7Y^6~5nrXo&e$8p}lUVB0m<1UOEOBY-ht5+)-??6hPx|GZjRV(b``>-$ zM|{PjUt-09)0*964ZWy4qG3A!iZuCL5J4vSq$?ol?wO2=1e&!;9t z{HK#&d2T{`aKZSSV$8nw`5IF+b?d?_&_RB2Nn@S=KEJHRZ&{wfFD-HANt+d!8=g@V${FeVy<@Q=p|RCl}k1iW;RIY+rXYw+ro1J ztScYrS3bq4R+FlcH(!!*-yB2t`NcV#59x0CP?FiqC-VdG1vMIuAg3o=Td=#P|3Z0B%|-@17rLGk-6p<6~!$6~POh1kU3(XXZO`=|>$d z!lw$=5_RyEi#Jr~RP#^%iC^4A^2m;K+VClBHe2;z6Z14*Mk&|$%X0f<_lmdugY8>E zPThfcKaZ0b)2b2Pn1`Dkmvb_pUZ*zC08jjo)ep|hccB`;;R{6kL;Ts-DL%Zk@M}Ec zYe??S-~5VIlRb~$9A!25WQb$>P5#6re$4=RZ7!m^$ICJHQwLq8^3qO zSIW*0ziJfhY2#Np#+5qaD29V6USiSHHu0r%dVQte1>d!Te30L9h<8T(gM1~;2HMmK zAIaG=K2h~u$+A`Ao#yL~^C@rnmi3*Dn>*0%_Q|VFij#Is9D-CUfq|-t52LPSO>Mf;|h8QzG9r>i*kxj)D&%wf12-@hxpQE(boL;`OLW% z&4ra*97R9KXL{m{MVR>LH~jeO-Z?hkb&`yq#K-O6lT$@0DD?-g)^Uzc7T&5n8gw__ z0DpXP`45D@vQE5>CYLA9MXJba02$ioVhjTWVS5bZ6(4zN`ENe`p5>!H^k})NKh(Lb zKhik@lUA-Xx~smjY)TJqEB4J>%kshNC(AGX&hhfC|NQ3id+))>f~iYr%eBS5L6diS z0c(T7VNUk2yzB*+mM{H`dzO#=6GzJf`m=$1G@nblG}%hD(09V$W~@UCQLSS;5BqEV zWae*vfSYo>EH@?Gc;aOFp#GTWmw)f}@_j#ZYkBJ*Le`;RxE%9>G%3oHFxKHSfF_;E zFF&fw_1jO}dg1SWTfI@g(_fZ9_1ee&mj2x4J1a|pX>wLqgaW;Whu>GnNZR9Y^4s;%W zx4i1NzvUU8TZ6Uq$a?oX>%J5^9jAU9em|0;-_C;e(1}uEYG}e zr$t+qTP`-spu!U-M~AgevS79|o^g>`wAc>y@e7Vk`?z91a^qxq>GOBXzxbc8ET8gX z-7Xxv6CigTGJZUUv*`9=vmA1gzg4h49N+Y^ODZ8#@KI9`q-_X zaPu5;fuSS!*@le$mhP;#HK&jK(B1NbUvXvmPhY0_kiYDk{5AHRoIkT@vw@Z8z;F1q z7l7fCCi(MA@@nf@5q}|i{jv8-IsM&M6%o3LI{BfEQREKp4HG$@wUJ1eYx}Q!%BAIh z`K$LWk8838tEq&7|H$p$UeKq__MwZg*U!9Rnw3=(J#1>imzU))z3%$*uKvrZuZ{Wd>ES!5dgNmrfBPTZ zSl;rks&UNFhD?$g9J)KT33%MPXFTyAfBeSP=e+&fch`Iedi2_(FPHhgB&G`tFhZFY^iGZTPO8%A6S;JedWE&6Z7VgKJMLTtbV@Au;oe}a$|fo@8QFpeTE;~ z=(!{4cwATZ_x+vv)3p?oK6COMai}`b-FNw9`G;R}pRW2^Ajgt*_)SjojgA<};ZV-D zH)q&q4iEL*eWU|BFmM=S?>NY;&)5I;`<6?(5sl{jyXGx}^8>dxQX%Vtv5PEo8w6JK zToHH6efQkYp6Q3Mqvhz+s$i(tXF7XpLn?CV%Z6Oqu_p_+nw!5{zT;K*3%heMNzF;f zzun5oTzGVll(CU?9of+U+nP1y(OpU zvv~w9Sr;nLG5?3p<|70ueyyDbUY}Yd!E0=`V+1F2S@%7DUU z!+3G5v_Yp@FhhD(9o{OXys6YM@?dLP0LotS!( zZ~o{ThY!62s*m!Sg&e-XdU0#<$S=0*Pb|w{eYqaXoLkS+K6Rp~Y^EN+{G*Qi6P;tq z8XuKI#YV0>%Nz^2?6yhv9fh2b=evx?JV#`6&=bQOMZM+dz(~P{OOO4g=JV%2_LA3t zIWdLGe~6_L*6U?ZoidN$t=;E~mp$XEY0L*5)a)#9%C_**_ejXj1}SaGL~lF&7ro-L z5_Il{V)fCw*fu?YZqYMj%cgB7z3S~eAahn{_@cQMlFic3)%3UY#Noj!JH4cEvRr#S z^9EDCiHH1&FTSjo9Q4r{^K&2ha-QnFK^=vKuFYqvdxW=7K2uz)M)&XO4}*2S)oU;32*?s`tzhPoNdy zMK~{~T*=4;PVlC()T`0MfB8pTs;kbv+GgKHr(Rq!;3+S|5(B&y+n5*@z^5dLrcGjDVs3` zF=w9B8T=Q$;LA>~9`X4+qVFJ-liI=f8qb5;adlP9$i*t%;M>z~dBL;M7jh(|v1O@a za}jzx7Y{1+b#a=fVe#WfJ$C)~F&^GD!hg8&3xD97hwY{wLOxnA2;wJqo|?br07>n| zdc9}P-SQkmio~mhtX%z&MJycY7!O^|^}~~L*w+vLY!DscBm0>6jPaAr#6u#lPtl}a zn^g8A4RF_SY<9BpclX?P?PZtsH(oFGD^X@u>A2cxb^Xba#{f#>E7Bp? ztFxkR`P@dmpq)Vyx9`@uFnA8e#&tpr-DGb_G^IYIlqLQGW*i-bW1&6e29O6Y4AR#5 zvw3QcRQo|aIrZklmvExE$M4X$oUyA07_9mhM=sXuWE_~5;nT=?xmN7c}VZTZ(}?rL~jVuDCHDd zW0I>4RkJL)P{rpZ{mdS{51lA{3Pf+T`jPlbs|k>vbZN6ZbRkPI+fmPp0DeI6t7Nc~ z$NhZ%nT)>k;6(Zz50&~yf1iG^fs4sKviK#}-Dl{r>Bu~hY2DR;F}T*pmL9|4wUTbw z@xnlPQdFhr&E%R&<~6QfTI+#VgCJrYF+`(acGqTfD_@rASLH)IiT<#`a<+xCqjpL` z>#D>_%Q%UnL=``~nBcrnhfBLfp$0UGM~}`pY-%%xL2Su?1!0>O+=jhV^Q|SHHsi~S zD~0ov1zlYjfNIlt^GFNNb-;qpg1EPAM(ME^ps)?4i@M~QXic5q&!wGA8~zyJ#}kr& z^`4JJ%2R4dCKVL9!V%6$c5)Gv^*q_xt7|K06))bGDUPP7^FtSfX;?h<0|XKb062A zIY|b0!pj0C)Y$7;i^P=d-~9Mh&zQKh^`h&1%>hsw!5hUsnpx4t z<}nU3;cAnu{B7X&Vn5^sgN95?k&<*Nw-dMSz$p_Pc^$xvIFk*X^*T}DEO_*uml7(B z&nEcAJ#m?Xu}#P#5u(vuOElFSM`G;J(?_?d0s0skGYz4+p=0BMwY@=f?C04B`6n16 z7Y+?9wH$J zAxS-==YiY@80*`{n1+s)KEk056AV77g?$%2H0xq(Q))9XS&VWbRL_G=l_J9>UJl0D zL}N3`NDj2QCw^L+J)AKpGPZ04N*&EdoH2o<_uVvg5ExqK?h8cD!pAn(v{$fP*#~QU zh>wrmGmlPAjvv4qPUcCCWLhX|Ka2&~1>W*WY1;yK(tBoXnGCEf#s(&kaR8=O7&`Rb z4)NokexjR!kF~8MOFmU5aQ$lW3aOlWOo#8pn)8ot^lQLVQZO5XoZ}x``u%x;$Cmjs zwt{}jE1RV@QuzczTVvNF(%{QMY#aX3$pievr_W(l1ZA{3C6z9Llh!WOKW`#3*AYhq z-tucRhL5MYjUq^yq;P4yz(j=;Uhu<*6tg}0;12PFp$~4~hxPm_+Zg8Ct>f7*BneZNsSb8?%&Jh@KlZTTrOg zc*d4a&)A=--&QSt^&=aCKtMfi2RM(tjY0_3lN)$zC%(pMOo(G{xaW#VQD)ml*8}*( zn%f398D{+~2NGYgRbLr0gOY-ta%{uQ8}bVGoMs=E!xb*`2zR1d+}H1qgGY~B`-@YJ z>*a;j$od&444i_t&M>U#WibY2>CmtI+6%Qc>JFq&fKMxFac!J|LFhSyp@oAfvh|$Q!ky#K zhS(4BtuuI=bE{5uez>A2b4!3M+hm`g$1$&w|CB6iS~rUj(~}eO8bJK3dJ?_67ebx{ zSHS|R%y8%`=YQMnAR>?_}JgGOix59Mum~lwBBOj7l{Dr%(^B9~CeuB#Ukb0`^qvuU*Y(62BICR)&Tg!A&&-M+!2eTcS zQp|kcb?_I5@TRuW`$zm0SeN?*o>tHfJx!tLIT3p}glz!EcCx$YvH;wLhF24aiOPLh zoyM4vMhXD7pn%KA%I|SJ3pjFVbc&HshPKa%R-zM#w$p3fhA+q*C$x=DN^`o8SMD%{ zlYy6XyKVf(AvWYbX0=U|B7A&%L$qy^lSpgCbq?mNVK#inCYah3&VIO?=1DXw=#`qC zbt3TAho;;JwjNhLV1kW_T;f+5&f5zw$zb{>8{!V`+%h~%KVy-DqlO+=H=VZ=FkY%TPJGOKbO-eUMZb@k`Qw5*kXQI4 zNn-VY-V}k{dvi=NgDj)aFv2b;9&Lhj62jH0Xgt5%4NV`a$nS9VFeZ8jwL3ZT-35mn zvUwAUQ9a=cgBJ%U^%9B`*>UXEt~NPJ9a#K=jILPgIq5_LF4);`bivL2J}%hVmz_pI z&(zfWn4ASNsVrtA?CTky6@SLgnCP>dnQ&s$k2bCduV@v=0M<$2v&?X_w&f?0 zdVL4q!ob4O|06wo;ixOrj>l#y;~Gg=-=WAx*pV-hTSqte=+)3!U&FCJJ(R7IGj_tH zSk_m_@)csRD}7KQl3@|As*N?`C_c!U@vo=O(oUUM9HYTXr$fev>%5uanu%NzjR zCb4pse%58Ff_FbT99ZTs=22SCWBp8Il>D>{j4u>gKeWxhWg0&$HJ{gkdPXCf61P@& ztiI#OvjYd~D)hvhL4pdPanYqKH?T(AS0xsJjcpoa4(T1TJw`VIoTCqRpI?P*;>dsN z5f0BOf=znyxkaZ2tJWn8N$N>lK}c;lWS?W5vOBR=JKko}KC|$3Z%PH$J5|jKJ-NqE z_ZknrZ7W~D$^f(y8P~onU3Oty2J4NY*@llDx%i|JpU9&wHDK(xtG@VU#^kYat*h>i zdSLC^jL7(-#cz$a=M=p%&kPDtW4)wR`B-^()-G4{E(m^LY+5LRq%6%7l<6vOPNhVCyvY=4yUI zIx&MxLE28(nmXlm7viLOLSs$b4|GCD7I{^>sJ)bo<7qB^r=YAS^^JFY6;xwEh zZpDM~;ZEeb0~BvkTQTEG0U3VZL5j9H_mXvxdHwoPMGk8H%GZ$DSUoG};o!Bp*+kXX z`qy7&0LlzDGC5UnIv&!hC5g%LKEG*AaEI$`J|`zF9*~_UC6v2ef%Yt=w?iGS=`x{m`*tc1v}Pz zf~slY{K=p-7He#u7L@_cNMwKhd*f^(-Vaneam*r{gTf>LelwEqaEL>^IXTI3UTi}^ zZkltHCYX)!fRgkGlZFWF0F?CZ*bebcbNh5(fov2_4=P{4lkUMPb=`l~2uhFxu>7&DseW}mFpI(L7m<98w3m<&s^gYwzKLS`@ ziH2UU5yjHI=Sa0E5;z6n)mm>R$Iaaa0HpF2H=cyKrST)6aY5j>Y2EFa4KyaOJpi`Y z0cR0NFVNX;eH&s&2RLs_Wk`!X1Ktl5EXMuVY^M5^Na4ay{PgzMr(hU*GqwVm<`|tx zHqpMHc}$IYj}CnPhO8RSa9ryZ-xY7p0CWe2u`wOua|f#J0CPySsjO015zUoj^|=$R z&P!8a>m2?Q`plg2TfXWox!mch;lqB)b!%4}(i&%-8hjt^C)?8v8krgXwGp&JSbXUmUuKNKj;seLQ@+i{*gD4%I@RALNg?5Nv zHQN3d?-dcg{ZuEQo!};N-E}JHlr|#Z=D+=Y^?ah~?(8cL)5{VsbD?G)a@Zyct*NHxP>~FNNVt39Nz-u{udkt;$vC~g<^Q~(o z@!$ErW946qkAsrqYR=YH5b{$F!kam>41*1>C($G?Qu;QuA8=!KcHIVdWNDr-8-7uK zNuNiULdrZEx{d!~v71dXW?a|C=vhDe#uyuYWb4hW)6k0ypF8ER{BAwTAx;YE-wb!) zU;16Was^(;$OUp5dXvkJY0hDAS|8fn=gyP6&xSuan8cZ0vW)z(=x@DiJPDG%HphC= z- zpYdSh-(EFF=R=BYI@>x#_%jYWdLEjhM|USaBzVpNLG3+y_(R$BD_RmMas$MWs~oG^0ClV~+&9ED$w?cD|Yz+=nu2k$xd2U}uu6PP0V zCo+iBf#`{lqWxs#{-;()(J&9)cV& z*MIxg+j{>(@hd`~jcXbH;1z zth?n%0u(-3tD58KJI#tQPuPp_{T#@NnLsv#(utmIWON>=r)G}FN{F5lNBD@6U;Bn9 z>MqnKn+0+&Jbe!0Sg#XY1|IL>WT_VXUT;oA+Kv6ir{@DlMjpC8`1rDX*N^ifn3Oa- zP>v=r{|3wSjsMrp<+?rvZ1#&IQ%o*?Q%fUy9{OfIvd7w82leqs-`IVe19y5!^8?p+ z%lE(O);9mymq@O`lr{MH-Gap%a!lvK(+9_5!wv_d}s`<0wzR2F;-6sG^f)1 zfAhBE<$Hhn)^a}|--)B-fGBwkg|A}DfUPxB;ADB-k7x(+!4Wu(Z^V|l+qB6&n>1q*9dcD_jHBlT z*vR|+hTp{?KmT(AyX9Nn__#hpI{B~9Yw%ik6(uW2wP}cuI}>`1H0k-6=fBTqX`C$v zyXpzH+GeRX%|8xjW>_S<&=S+Pnr``~H$Jia)W5&2PruNUE@20Cie;tIvIjt59r&b0 zjV=c|+__#ALk??qI+k=+1B_gv^QeSsUl&j? z;p|tZ|KgJ`FMscq_bfcG=0&dhz{tYj7c4!e`8Av9+C(?nNM0J_+A`~hL2+5Y%lGV- zcj`{^cVGXwo}+cX;<;dQvT7u2?0R+qYFq{XM198e*L=}E%d_>lL3~zo=0om&Voy%^ z%h9>f^lD0ytPpr zg~{1jZAiO~^T97J@yeh09w`1xwSh24F`NSEhCjRLSXJn`%mH@4#+$x@;up2ebwIl&_3snm%EJ(YEoj{-clclgY{Q#$UL- z{G^^VuQM1Gu)n(U2vif97a;}2J2D&cm4Ei0<mZtf?9#n|`tkjxXn6KX&EI1=R@*$+Kyw>;|^ zN6TfsKa#H^pu#R*_}$O*#n-X_6q!ggu8IzGT!q@a0d4&GoYsxW{s08 zxcb6`!zl91*VjDiv#}r4pKJ1goci!UFDRc`2%OJ$tT_0@2dCnL<$j-qr9L&M`lL5D z(Jg%h*(2AFmk(S^Onhux>cB?H;>YJE=cKZwR~3}pmJcYob}zo~KupBx=(Nh~M4*nz zFreXsw&7fy?>G)Rb7uLh_>fd0az4fHf;q3Jlg~yVw=Ucr;=5V{Uqw2b-#L3OowL9U z9j+Ix`1q<;8v}WtQ-xXig+I)9(3;nXc|pGNB1^pvR0~0A$kl-?YrweTR}h1GVi

c)ijgxDm}8EsRXFt3h@+Ufr7@DN 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 literal 0 HcmV?d00001 diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/resources/base/profile/backup_config.json b/ArkGraphics2D/DisplaySync/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 000000000..78f40ae7c --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/resources/base/profile/main_pages.json b/ArkGraphics2D/DisplaySync/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 000000000..5c9db65f6 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,8 @@ +{ + "src": [ + "pages/Index", + "DispalySync/CustomDrawDisplaySync", + "DispalySync/PropertyAnimationDisplaySync", + "DispalySync/XComponentDisplaySync" + ] +} diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/resources/en_US/element/string.json b/ArkGraphics2D/DisplaySync/entry/src/main/resources/en_US/element/string.json new file mode 100644 index 000000000..aa6d9f08b --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/resources/en_US/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "Sample_DisplaySync" + } + ] +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/resources/zh_CN/element/string.json b/ArkGraphics2D/DisplaySync/entry/src/main/resources/zh_CN/element/string.json new file mode 100644 index 000000000..3e449654f --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "模块描述" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "Sample_DisplaySync" + } + ] +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/mock/mock-config.json5 b/ArkGraphics2D/DisplaySync/entry/src/mock/mock-config.json5 new file mode 100644 index 000000000..e4eb8bbe4 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/mock/mock-config.json5 @@ -0,0 +1,16 @@ +/* + * 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. + */ +{ +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/test/Ability.test.ets b/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 000000000..c6ab165ab --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { describe, expect, it } from '@ohos/hypium'; +import { abilityDelegatorRegistry, Driver, ON } from '@kit.TestKit'; +import Logger from '../utils/Logger'; + +const TAG = '[Sample_DisplaySync]'; +const BUNDLE = 'MyApp_' +const DELAYMS_1S = 1000; +const DELAYMS_2S = 2000; +const DELAYMS_5S = 5000; + +const bundleName = abilityDelegatorRegistry.getArguments().bundleName; + +export default function abilityTest() { + describe('AbilityTest', () => { + it(BUNDLE + 'StartAbility_001, begin', 0, async (done: Function) => { + Logger.info(TAG, BUNDLE + 'StartAbility_001'); + let abilityDelegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); + try { + await abilityDelegator.startAbility({ + bundleName: bundleName, + abilityName: 'EntryAbility' + }); + } catch (err) { + Logger.info(TAG, `beforeAll exception = ${JSON.stringify(err)}`); + } + + Logger.info(TAG, BUNDLE + 'StartAbility_001, end'); + done(); + }); + + /** + * @tc.number:SUB_GRAPHIC_2D_HGM_DISPLAYSYNC_0200 + * @tc.name:PropertyAnimation_001 + * @tc.desc:PropertyAnimation + * @tc.size:MediumTest + * @tc.type:Function + * @tc.level:Level 1 + */ + it(BUNDLE + 'PropertyAnimation_001', 0, async (done: Function) => { + try { + Logger.info(TAG, BUNDLE + 'PropertyAnimation_001 beg' + + 'in'); + + let driver = Driver.create(); + await driver.delayMs(DELAYMS_2S); + + await driver.assertComponentExist(ON.id('AnimationFpsRequest')); + let propertyAnimationButton = await driver.findComponent(ON.id('AnimationFpsRequest')); + await propertyAnimationButton.click(); + await driver.delayMs(DELAYMS_2S); + + await driver.assertComponentExist(ON.id('PropertyAnimationStart')); + let startButton = await driver.findComponent(ON.id('PropertyAnimationStart')); + await startButton.click(); + await driver.delayMs(DELAYMS_5S); + + await driver.assertComponentExist(ON.id('PropertyAnimationBack')); + let backButton = await driver.findComponent(ON.id('PropertyAnimationBack')); + await backButton.click(); + await driver.delayMs(DELAYMS_1S); + + Logger.info(TAG, BUNDLE + 'PropertyAnimation_001 end'); + done(); + } catch (error) { + expect().assertFail(); + } + }); + + it(BUNDLE + 'UiFpsRequest_001', 0, async (done: Function) => { + try { + Logger.info(TAG, BUNDLE + 'UiFpsRequest_001, begin'); + + let driver = Driver.create(); + await driver.delayMs(DELAYMS_2S); + + await driver.assertComponentExist(ON.id('UiFpsRequest')); + let customDrawButton = await driver.findComponent(ON.id('UiFpsRequest')); + + await customDrawButton.click(); + await driver.delayMs(DELAYMS_2S); + + await driver.assertComponentExist(ON.id('CustomDrawStart')); + let startButton = await driver.findComponent(ON.id('CustomDrawStart')); + + await startButton.click(); + await driver.delayMs(DELAYMS_2S); + + await driver.assertComponentExist(ON.id('CustomDrawStop')); + let stopButton = await driver.findComponent(ON.id('CustomDrawStop')); + + await stopButton.click(); + await driver.delayMs(DELAYMS_2S); + + await driver.assertComponentExist(ON.id('CustomDrawBack')); + let backButton = await driver.findComponent(ON.id('CustomDrawBack')); + + await backButton.click(); + await driver.delayMs(DELAYMS_1S); + + Logger.info(TAG, BUNDLE + 'UiFpsRequest_001 end'); + done(); + } catch (error) { + expect().assertFail(); + } + }); + + /** + * @tc.number:SUB_GRAPHIC_2D_HGM_DISPLAYSYNC_0100 + * @tc.name:CustomDraw_001 + * @tc.desc:CustomDraw + * @tc.size:MediumTest + * @tc.type:Function + * @tc.level:Level 1 + */ + it(BUNDLE + 'CustomDraw_001', 0, async (done: Function) => { + try { + Logger.info(TAG, BUNDLE + 'CustomDraw_001 begin'); + + let driver = Driver.create(); + await driver.delayMs(DELAYMS_2S); + + await driver.assertComponentExist(ON.id('XComponent')); + + let customDrawButton = await driver.findComponent(ON.id('XComponent')); + + await customDrawButton.click(); + await driver.delayMs(DELAYMS_2S); + + await driver.assertComponentExist(ON.id('Start')); + + let startButton = await driver.findComponent(ON.id('Start')); + + await startButton.click(); + await driver.delayMs(DELAYMS_2S); + + await driver.assertComponentExist(ON.id('Stop')); + + let stopButton = await driver.findComponent(ON.id('Stop')); + + await stopButton.click(); + await driver.delayMs(DELAYMS_2S); + + await driver.assertComponentExist(ON.id('Back')); + + let backButton = await driver.findComponent(ON.id('Back')); + + await backButton.click(); + await driver.delayMs(DELAYMS_1S); + + Logger.info(TAG, BUNDLE + 'CustomDraw_001 end'); + done(); + } catch (error) { + expect().assertFail(); + } + }); + }) +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/test/List.test.ets b/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 000000000..3be234233 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import abilityTest from './Ability.test'; + +export default function testsuite() { + abilityTest(); +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/utils/Logger.ets b/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/utils/Logger.ets new file mode 100644 index 000000000..687ca76b7 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/utils/Logger.ets @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import hilog from '@ohos.hilog'; + +class Logger { + private domain: number = 0xF811; + private prefix: string = ''; + private format: string = '%{public}s, %{public}s'; + + constructor(prefix: string) { + this.prefix = prefix; + this.domain = 0xF811; + } + + debug(...args: string[]): void { + hilog.debug(this.domain, this.prefix, this.format, args); + } + + info(...args: string[]): void { + hilog.info(this.domain, this.prefix, this.format, args); + } + + warn(...args: string[]): void { + hilog.warn(this.domain, this.prefix, this.format, args); + } + + error(...args: string[]): void { + hilog.error(this.domain, this.prefix, this.format, args); + } +} + +export default new Logger('[Sample_DisplaySync]'); \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/ohosTest/module.json5 b/ArkGraphics2D/DisplaySync/entry/src/ohosTest/module.json5 new file mode 100644 index 000000000..944ed9985 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/ohosTest/module.json5 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/ArkGraphics2D/DisplaySync/entry/src/test/List.test.ets b/ArkGraphics2D/DisplaySync/entry/src/test/List.test.ets new file mode 100644 index 000000000..3bc7c739d --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/test/List.test.ets @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/entry/src/test/LocalUnit.test.ets b/ArkGraphics2D/DisplaySync/entry/src/test/LocalUnit.test.ets new file mode 100644 index 000000000..1d9c6cdcc --- /dev/null +++ b/ArkGraphics2D/DisplaySync/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,47 @@ +/* + * 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 { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/hvigor/hvigor-config.json5 b/ArkGraphics2D/DisplaySync/hvigor/hvigor-config.json5 new file mode 100644 index 000000000..87990affc --- /dev/null +++ b/ArkGraphics2D/DisplaySync/hvigor/hvigor-config.json5 @@ -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. + */ +{ + "modelVersion": "5.0.0", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/ArkGraphics2D/DisplaySync/hvigorfile.ts b/ArkGraphics2D/DisplaySync/hvigorfile.ts new file mode 100644 index 000000000..b74abd874 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/hvigorfile.ts @@ -0,0 +1,20 @@ +/* + * 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 { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins: [] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/ArkGraphics2D/DisplaySync/oh-package.json5 b/ArkGraphics2D/DisplaySync/oh-package.json5 new file mode 100644 index 000000000..7a7fe7781 --- /dev/null +++ b/ArkGraphics2D/DisplaySync/oh-package.json5 @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +{ + "modelVersion": "5.0.0", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/ArkGraphics2D/DisplaySync/ohosTest.md b/ArkGraphics2D/DisplaySync/ohosTest.md new file mode 100644 index 000000000..a9138197d --- /dev/null +++ b/ArkGraphics2D/DisplaySync/ohosTest.md @@ -0,0 +1,19 @@ +# DisplaySync测试用例归档 + +## 用例表 + +| 测试功能 | 预置条件 | 输入 | 预期输出 | 是否自动 | 测试结果 | +|-----------------|-----------------|----------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------|------|------| +| 拉起应用 | 设备正常运行 | | 成功拉起应用 | 是 | Pass | +| 主页展示 | 设备正常运行 | | 展示 Requesting Frame Rates for Animations、Requesting Frame Rates for UI Components、Requesting Frame Rates for Custom Content 按钮 | 是 | Pass | +| 主页按钮点击 | 位于主页 | 点击 Requesting Frame Rates for Animations | 跳转至请求动画绘制帧率页面 | 是 | Pass | +| 动画绘制帧率开始 | 位于动画绘制帧率面 | 点击Start | 三个方块分别按照30hz、40hz、60hz频率来回移动 | 是 | Pass | +| 动画绘制帧率返回主页 | 位于动画绘制帧率页面 | 点击Back | 回到主页 | 是 | Pass | +| 主页按钮点击 | 位于主页 | 点击 Requesting Frame Rates for UI Components | 跳转请求 UI 绘制帧率页面 | 是 | Pass | +| 请求 UI 绘制帧率开始 | 位于请求 UI 绘制帧率 | 点击 Start | 数字 30、60 分别按照 30hz、60hz 频率放大缩小 | 是 | Pass | +| 请求 UI 绘制帧率停止 | 位于请求 UI 绘制帧率 | 点击 Stop | 数字 30、60 变化停止 | 是 | Pass | +| 请求 UI 绘制帧率返回 | 位于请求 UI 绘制帧率 | 点击 Back | 回到主页 | 是 | Pass | +| 主页按钮点击 | 位于主页 | 点击 Requesting Frame Rates for Custom Content | 跳转 请求自绘制内容绘制帧率 页面 | 是 | Pass | +| 请求自绘制内容绘制帧率开始 | 位于请求自绘制内容绘制帧率页面 | 点击Start | 两个方块分别按照 30hz、120hz 频率来回移动 | 是 | pass | +| 请求自绘制内容绘制帧率停止 | 位于请求自绘制内容绘制帧率页面 | 点击Stop | 两个方块移动停止 | 是 | pass | +| 请求自绘制内容绘制帧率返回主页 | 位于请求自绘制内容绘制帧率页面 | 点击Back | 回到主页 | 是 | pass | \ No newline at end of file diff --git a/ArkGraphics2D/DisplaySync/screenshots/device/UI.png b/ArkGraphics2D/DisplaySync/screenshots/device/UI.png new file mode 100644 index 0000000000000000000000000000000000000000..edaa1bd7b952da56ada1f17f230bedc87f3b4d6b GIT binary patch literal 12543 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 literal 0 HcmV?d00001 diff --git a/ArkGraphics2D/DisplaySync/screenshots/device/XComponent.png b/ArkGraphics2D/DisplaySync/screenshots/device/XComponent.png new file mode 100644 index 0000000000000000000000000000000000000000..77d32d82edab02be8a93f43561283454764744f9 GIT binary patch literal 12483 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 literal 0 HcmV?d00001 diff --git a/ArkGraphics2D/DisplaySync/screenshots/device/animation.png b/ArkGraphics2D/DisplaySync/screenshots/device/animation.png new file mode 100644 index 0000000000000000000000000000000000000000..ec438b209234337590d796a9fa445f08f6d5f9a2 GIT binary patch literal 12407 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 Hu#NmLXpYJJ literal 0 HcmV?d00001 diff --git a/ArkGraphics2D/DisplaySync/screenshots/device/index.png b/ArkGraphics2D/DisplaySync/screenshots/device/index.png new file mode 100644 index 0000000000000000000000000000000000000000..d8949b46e924459b59871c0351703ba0b8fedeee GIT binary patch literal 13346 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 literal 0 HcmV?d00001 -- Gitee From 39630c46da8d8ba937265b889ce284b370d8287f Mon Sep 17 00:00:00 2001 From: kelinyang Date: Mon, 25 Aug 2025 16:35:45 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: kelinyang --- .../DisplaySoloist/AppScope/app.json5 | 2 +- .../DisplaySoloist/build-profile.json5 | 28 ++++--------------- .../DisplaySoloist/code-linter.json5 | 2 +- .../DisplaySoloist/entry/build-profile.json5 | 2 +- .../DisplaySoloist/entry/hvigorfile.ts | 2 +- .../DisplaySoloist/entry/oh-package.json5 | 2 +- .../entry/src/main/cpp/common/log_common.h | 2 +- .../entry/src/main/cpp/napi_init.cpp | 2 +- .../src/main/cpp/plugin/plugin_manager.cpp | 2 +- .../src/main/cpp/plugin/plugin_manager.h | 2 +- .../main/cpp/samples/sample_xcomponent.cpp | 2 +- .../src/main/cpp/samples/sample_xcomponent.h | 2 +- .../src/main/cpp/types/libentry/index.d.ts | 2 +- .../main/cpp/types/libentry/oh-package.json5 | 2 +- .../main/ets/entryability/EntryAbility.ets | 2 +- .../entrybackupability/EntryBackupAbility.ets | 2 +- .../main/ets/interface/XComponentContext.ts | 2 +- .../entry/src/main/ets/pages/Index.ets | 2 +- .../entry/src/main/ets/utils/Logger.ets | 2 +- .../entry/src/main/module.json5 | 2 +- .../entry/src/mock/Libentry.mock.ets | 2 +- .../entry/src/mock/mock-config.json5 | 2 +- .../src/ohosTest/ets/test/Ability.test.ets | 2 +- .../entry/src/ohosTest/ets/test/List.test.ets | 2 +- .../entry/src/ohosTest/ets/utils/Logger.ets | 2 +- .../entry/src/ohosTest/module.json5 | 2 +- .../entry/src/test/List.test.ets | 2 +- .../entry/src/test/LocalUnit.test.ets | 2 +- .../DisplaySoloist/hvigor/hvigor-config.json5 | 2 +- ArkGraphics2D/DisplaySoloist/hvigorfile.ts | 2 +- ArkGraphics2D/DisplaySoloist/oh-package.json5 | 2 +- ArkGraphics2D/DisplaySync/AppScope/app.json5 | 2 +- ArkGraphics2D/DisplaySync/build-profile.json5 | 28 ++++--------------- ArkGraphics2D/DisplaySync/code-linter.json5 | 2 +- .../DisplaySync/entry/build-profile.json5 | 2 +- ArkGraphics2D/DisplaySync/entry/hvigorfile.ts | 2 +- .../DisplaySync/entry/oh-package.json5 | 2 +- .../entry/src/main/cpp/common/log_common.h | 2 +- .../entry/src/main/cpp/napi_init.cpp | 2 +- .../src/main/cpp/plugin/plugin_manager.cpp | 2 +- .../src/main/cpp/plugin/plugin_manager.h | 2 +- .../main/cpp/samples/sample_xcomponent.cpp | 2 +- .../src/main/cpp/samples/sample_xcomponent.h | 2 +- .../src/main/cpp/types/libentry/index.d.ts | 2 +- .../main/cpp/types/libentry/oh-package.json5 | 2 +- .../ets/DispalySync/CustomDrawDisplaySync.ets | 2 +- .../PropertyAnimationDisplaySync.ets | 2 +- .../ets/DispalySync/XComponentDisplaySync.ets | 2 +- .../main/ets/entryability/EntryAbility.ets | 2 +- .../entrybackupability/EntryBackupAbility.ets | 2 +- .../main/ets/interface/XComponentContext.ts | 2 +- .../entry/src/main/ets/pages/Index.ets | 2 +- .../entry/src/main/ets/utils/Logger.ets | 2 +- .../DisplaySync/entry/src/main/module.json5 | 2 +- .../entry/src/mock/mock-config.json5 | 2 +- .../src/ohosTest/ets/test/Ability.test.ets | 2 +- .../entry/src/ohosTest/ets/test/List.test.ets | 2 +- .../entry/src/ohosTest/ets/utils/Logger.ets | 2 +- .../entry/src/ohosTest/module.json5 | 2 +- .../DisplaySync/entry/src/test/List.test.ets | 2 +- .../entry/src/test/LocalUnit.test.ets | 2 +- .../DisplaySync/hvigor/hvigor-config.json5 | 2 +- ArkGraphics2D/DisplaySync/hvigorfile.ts | 2 +- ArkGraphics2D/DisplaySync/oh-package.json5 | 2 +- 64 files changed, 74 insertions(+), 106 deletions(-) diff --git a/ArkGraphics2D/DisplaySoloist/AppScope/app.json5 b/ArkGraphics2D/DisplaySoloist/AppScope/app.json5 index 4059b8b3a..feca14423 100644 --- a/ArkGraphics2D/DisplaySoloist/AppScope/app.json5 +++ b/ArkGraphics2D/DisplaySoloist/AppScope/app.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/build-profile.json5 b/ArkGraphics2D/DisplaySoloist/build-profile.json5 index de594a6c8..ee9f710ef 100644 --- a/ArkGraphics2D/DisplaySoloist/build-profile.json5 +++ b/ArkGraphics2D/DisplaySoloist/build-profile.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -14,32 +14,16 @@ */ { "app": { + "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default", - "compileSdkVersion": 14, - "compatibleSdkVersion": 14, - "runtimeOS": "OpenHarmony", - "buildOption": { - "externalNativeOptions": { - "abiFilters": [ - "arm64-v8a", - "x86_64", - "armeabi-v7a" - ] - } - } - } - ], - "buildModeSet": [ - { - "name": "debug" - }, - { - "name": "release" + "compatibleSdkVersion": "5.0.2(14)", + "targetSdkVersion": "5.0.2(14)", + "runtimeOS": "HarmonyOS" } - ], + ] }, "modules": [ { diff --git a/ArkGraphics2D/DisplaySoloist/code-linter.json5 b/ArkGraphics2D/DisplaySoloist/code-linter.json5 index 3311c9280..44d503046 100644 --- a/ArkGraphics2D/DisplaySoloist/code-linter.json5 +++ b/ArkGraphics2D/DisplaySoloist/code-linter.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/build-profile.json5 b/ArkGraphics2D/DisplaySoloist/entry/build-profile.json5 index 13781d517..98128447b 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/build-profile.json5 +++ b/ArkGraphics2D/DisplaySoloist/entry/build-profile.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/hvigorfile.ts b/ArkGraphics2D/DisplaySoloist/entry/hvigorfile.ts index 037010409..90e5d264b 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/hvigorfile.ts +++ b/ArkGraphics2D/DisplaySoloist/entry/hvigorfile.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/oh-package.json5 b/ArkGraphics2D/DisplaySoloist/entry/oh-package.json5 index 1182eecc3..5b21e253a 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/oh-package.json5 +++ b/ArkGraphics2D/DisplaySoloist/entry/oh-package.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/common/log_common.h b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/common/log_common.h index fb896663b..db232e782 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/common/log_common.h +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/common/log_common.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/napi_init.cpp b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/napi_init.cpp index 8e3c41842..43e51b001 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/napi_init.cpp +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/napi_init.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/plugin/plugin_manager.cpp b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/plugin/plugin_manager.cpp index 3e27aa378..b71c471ab 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/plugin/plugin_manager.cpp +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/plugin/plugin_manager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/plugin/plugin_manager.h b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/plugin/plugin_manager.h index a590755fb..0c323bb13 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/plugin/plugin_manager.h +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/plugin/plugin_manager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/samples/sample_xcomponent.cpp b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/samples/sample_xcomponent.cpp index 6d536b715..464f21b74 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/samples/sample_xcomponent.cpp +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/samples/sample_xcomponent.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/samples/sample_xcomponent.h b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/samples/sample_xcomponent.h index 926d45738..9ced152ef 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/samples/sample_xcomponent.h +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/samples/sample_xcomponent.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/types/libentry/index.d.ts b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/types/libentry/index.d.ts index 72ce2401d..5c14affc6 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/types/libentry/index.d.ts +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/types/libentry/index.d.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/types/libentry/oh-package.json5 b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/types/libentry/oh-package.json5 index 8170db317..d818828a0 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/types/libentry/oh-package.json5 +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/entryability/EntryAbility.ets b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/entryability/EntryAbility.ets index 1f6370af7..24e1e0207 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/entryability/EntryAbility.ets +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/entryability/EntryAbility.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets index be794f48c..69a47ce6b 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/interface/XComponentContext.ts b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/interface/XComponentContext.ts index 02bc5d0d3..8e24b7b9b 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/interface/XComponentContext.ts +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/interface/XComponentContext.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/pages/Index.ets b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/pages/Index.ets index 6d29fe87e..9cdbd8142 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/pages/Index.ets +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/pages/Index.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/utils/Logger.ets b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/utils/Logger.ets index 985faa3be..009e2c38d 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/utils/Logger.ets +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/ets/utils/Logger.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/main/module.json5 b/ArkGraphics2D/DisplaySoloist/entry/src/main/module.json5 index ca3c9ba31..c75d702e2 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/main/module.json5 +++ b/ArkGraphics2D/DisplaySoloist/entry/src/main/module.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/mock/Libentry.mock.ets b/ArkGraphics2D/DisplaySoloist/entry/src/mock/Libentry.mock.ets index 44d5c9630..bbcd4ffee 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/mock/Libentry.mock.ets +++ b/ArkGraphics2D/DisplaySoloist/entry/src/mock/Libentry.mock.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/mock/mock-config.json5 b/ArkGraphics2D/DisplaySoloist/entry/src/mock/mock-config.json5 index a1e6f06e0..98b0ae79f 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/mock/mock-config.json5 +++ b/ArkGraphics2D/DisplaySoloist/entry/src/mock/mock-config.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/test/Ability.test.ets b/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/test/Ability.test.ets index 8648e182a..300a57165 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/test/Ability.test.ets +++ b/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/test/Ability.test.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/test/List.test.ets b/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/test/List.test.ets index 3be234233..c64e0b069 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/test/List.test.ets +++ b/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/test/List.test.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/utils/Logger.ets b/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/utils/Logger.ets index 01dc553e4..2b2a9cb54 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/utils/Logger.ets +++ b/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/ets/utils/Logger.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/module.json5 b/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/module.json5 index 944ed9985..f6bdce994 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/module.json5 +++ b/ArkGraphics2D/DisplaySoloist/entry/src/ohosTest/module.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/test/List.test.ets b/ArkGraphics2D/DisplaySoloist/entry/src/test/List.test.ets index 3bc7c739d..a60c87c5c 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/test/List.test.ets +++ b/ArkGraphics2D/DisplaySoloist/entry/src/test/List.test.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/entry/src/test/LocalUnit.test.ets b/ArkGraphics2D/DisplaySoloist/entry/src/test/LocalUnit.test.ets index 1d9c6cdcc..b080060dc 100644 --- a/ArkGraphics2D/DisplaySoloist/entry/src/test/LocalUnit.test.ets +++ b/ArkGraphics2D/DisplaySoloist/entry/src/test/LocalUnit.test.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/hvigor/hvigor-config.json5 b/ArkGraphics2D/DisplaySoloist/hvigor/hvigor-config.json5 index 87990affc..588ef752b 100644 --- a/ArkGraphics2D/DisplaySoloist/hvigor/hvigor-config.json5 +++ b/ArkGraphics2D/DisplaySoloist/hvigor/hvigor-config.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/hvigorfile.ts b/ArkGraphics2D/DisplaySoloist/hvigorfile.ts index b74abd874..d5e782664 100644 --- a/ArkGraphics2D/DisplaySoloist/hvigorfile.ts +++ b/ArkGraphics2D/DisplaySoloist/hvigorfile.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySoloist/oh-package.json5 b/ArkGraphics2D/DisplaySoloist/oh-package.json5 index 7a7fe7781..fa0f78a60 100644 --- a/ArkGraphics2D/DisplaySoloist/oh-package.json5 +++ b/ArkGraphics2D/DisplaySoloist/oh-package.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/AppScope/app.json5 b/ArkGraphics2D/DisplaySync/AppScope/app.json5 index 4a01f308a..c0dd94d4c 100644 --- a/ArkGraphics2D/DisplaySync/AppScope/app.json5 +++ b/ArkGraphics2D/DisplaySync/AppScope/app.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/build-profile.json5 b/ArkGraphics2D/DisplaySync/build-profile.json5 index de594a6c8..ee9f710ef 100644 --- a/ArkGraphics2D/DisplaySync/build-profile.json5 +++ b/ArkGraphics2D/DisplaySync/build-profile.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -14,32 +14,16 @@ */ { "app": { + "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default", - "compileSdkVersion": 14, - "compatibleSdkVersion": 14, - "runtimeOS": "OpenHarmony", - "buildOption": { - "externalNativeOptions": { - "abiFilters": [ - "arm64-v8a", - "x86_64", - "armeabi-v7a" - ] - } - } - } - ], - "buildModeSet": [ - { - "name": "debug" - }, - { - "name": "release" + "compatibleSdkVersion": "5.0.2(14)", + "targetSdkVersion": "5.0.2(14)", + "runtimeOS": "HarmonyOS" } - ], + ] }, "modules": [ { diff --git a/ArkGraphics2D/DisplaySync/code-linter.json5 b/ArkGraphics2D/DisplaySync/code-linter.json5 index 3311c9280..44d503046 100644 --- a/ArkGraphics2D/DisplaySync/code-linter.json5 +++ b/ArkGraphics2D/DisplaySync/code-linter.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/build-profile.json5 b/ArkGraphics2D/DisplaySync/entry/build-profile.json5 index 9e8e21e08..fe58975fb 100644 --- a/ArkGraphics2D/DisplaySync/entry/build-profile.json5 +++ b/ArkGraphics2D/DisplaySync/entry/build-profile.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/hvigorfile.ts b/ArkGraphics2D/DisplaySync/entry/hvigorfile.ts index 037010409..90e5d264b 100644 --- a/ArkGraphics2D/DisplaySync/entry/hvigorfile.ts +++ b/ArkGraphics2D/DisplaySync/entry/hvigorfile.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/oh-package.json5 b/ArkGraphics2D/DisplaySync/entry/oh-package.json5 index c29643810..10cda399b 100644 --- a/ArkGraphics2D/DisplaySync/entry/oh-package.json5 +++ b/ArkGraphics2D/DisplaySync/entry/oh-package.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/common/log_common.h b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/common/log_common.h index ab802e81d..be73dc024 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/common/log_common.h +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/common/log_common.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/napi_init.cpp b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/napi_init.cpp index dc7146d14..e83edffd5 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/napi_init.cpp +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/napi_init.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/plugin/plugin_manager.cpp b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/plugin/plugin_manager.cpp index d0f274144..31a6582ec 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/plugin/plugin_manager.cpp +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/plugin/plugin_manager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/plugin/plugin_manager.h b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/plugin/plugin_manager.h index 37f2a91ac..962428454 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/plugin/plugin_manager.h +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/plugin/plugin_manager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/samples/sample_xcomponent.cpp b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/samples/sample_xcomponent.cpp index 0dbd2cffa..59429267f 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/samples/sample_xcomponent.cpp +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/samples/sample_xcomponent.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/samples/sample_xcomponent.h b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/samples/sample_xcomponent.h index c58375197..4cf365a9f 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/samples/sample_xcomponent.h +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/samples/sample_xcomponent.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/types/libentry/index.d.ts b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/types/libentry/index.d.ts index 72ce2401d..5c14affc6 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/types/libentry/index.d.ts +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/types/libentry/index.d.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/types/libentry/oh-package.json5 b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/types/libentry/oh-package.json5 index 65023700b..77052c679 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/cpp/types/libentry/oh-package.json5 +++ b/ArkGraphics2D/DisplaySync/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/CustomDrawDisplaySync.ets b/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/CustomDrawDisplaySync.ets index 190d0eaf0..9368d12fd 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/CustomDrawDisplaySync.ets +++ b/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/CustomDrawDisplaySync.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/PropertyAnimationDisplaySync.ets b/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/PropertyAnimationDisplaySync.ets index 3eb15f8e0..801acb33c 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/PropertyAnimationDisplaySync.ets +++ b/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/PropertyAnimationDisplaySync.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/XComponentDisplaySync.ets b/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/XComponentDisplaySync.ets index 96016ea26..aae4ce027 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/XComponentDisplaySync.ets +++ b/ArkGraphics2D/DisplaySync/entry/src/main/ets/DispalySync/XComponentDisplaySync.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/ets/entryability/EntryAbility.ets b/ArkGraphics2D/DisplaySync/entry/src/main/ets/entryability/EntryAbility.ets index a32a8361c..23a5f2189 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/ets/entryability/EntryAbility.ets +++ b/ArkGraphics2D/DisplaySync/entry/src/main/ets/entryability/EntryAbility.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/ArkGraphics2D/DisplaySync/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets index be794f48c..69a47ce6b 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets +++ b/ArkGraphics2D/DisplaySync/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/ets/interface/XComponentContext.ts b/ArkGraphics2D/DisplaySync/entry/src/main/ets/interface/XComponentContext.ts index 7bdd8fbc3..821e80c28 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/ets/interface/XComponentContext.ts +++ b/ArkGraphics2D/DisplaySync/entry/src/main/ets/interface/XComponentContext.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/ets/pages/Index.ets b/ArkGraphics2D/DisplaySync/entry/src/main/ets/pages/Index.ets index a4a4ba0bb..fb9d6dd96 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/ets/pages/Index.ets +++ b/ArkGraphics2D/DisplaySync/entry/src/main/ets/pages/Index.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/ets/utils/Logger.ets b/ArkGraphics2D/DisplaySync/entry/src/main/ets/utils/Logger.ets index 517c8134a..3040a04a4 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/ets/utils/Logger.ets +++ b/ArkGraphics2D/DisplaySync/entry/src/main/ets/utils/Logger.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/main/module.json5 b/ArkGraphics2D/DisplaySync/entry/src/main/module.json5 index ca3c9ba31..c75d702e2 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/main/module.json5 +++ b/ArkGraphics2D/DisplaySync/entry/src/main/module.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/mock/mock-config.json5 b/ArkGraphics2D/DisplaySync/entry/src/mock/mock-config.json5 index e4eb8bbe4..323d1d611 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/mock/mock-config.json5 +++ b/ArkGraphics2D/DisplaySync/entry/src/mock/mock-config.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/test/Ability.test.ets b/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/test/Ability.test.ets index c6ab165ab..0ab410fb7 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/test/Ability.test.ets +++ b/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/test/Ability.test.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/test/List.test.ets b/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/test/List.test.ets index 3be234233..c64e0b069 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/test/List.test.ets +++ b/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/test/List.test.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/utils/Logger.ets b/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/utils/Logger.ets index 687ca76b7..e6d55f5ac 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/utils/Logger.ets +++ b/ArkGraphics2D/DisplaySync/entry/src/ohosTest/ets/utils/Logger.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/ohosTest/module.json5 b/ArkGraphics2D/DisplaySync/entry/src/ohosTest/module.json5 index 944ed9985..f6bdce994 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/ohosTest/module.json5 +++ b/ArkGraphics2D/DisplaySync/entry/src/ohosTest/module.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/test/List.test.ets b/ArkGraphics2D/DisplaySync/entry/src/test/List.test.ets index 3bc7c739d..a60c87c5c 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/test/List.test.ets +++ b/ArkGraphics2D/DisplaySync/entry/src/test/List.test.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/entry/src/test/LocalUnit.test.ets b/ArkGraphics2D/DisplaySync/entry/src/test/LocalUnit.test.ets index 1d9c6cdcc..b080060dc 100644 --- a/ArkGraphics2D/DisplaySync/entry/src/test/LocalUnit.test.ets +++ b/ArkGraphics2D/DisplaySync/entry/src/test/LocalUnit.test.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/hvigor/hvigor-config.json5 b/ArkGraphics2D/DisplaySync/hvigor/hvigor-config.json5 index 87990affc..588ef752b 100644 --- a/ArkGraphics2D/DisplaySync/hvigor/hvigor-config.json5 +++ b/ArkGraphics2D/DisplaySync/hvigor/hvigor-config.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/hvigorfile.ts b/ArkGraphics2D/DisplaySync/hvigorfile.ts index b74abd874..d5e782664 100644 --- a/ArkGraphics2D/DisplaySync/hvigorfile.ts +++ b/ArkGraphics2D/DisplaySync/hvigorfile.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/ArkGraphics2D/DisplaySync/oh-package.json5 b/ArkGraphics2D/DisplaySync/oh-package.json5 index 7a7fe7781..fa0f78a60 100644 --- a/ArkGraphics2D/DisplaySync/oh-package.json5 +++ b/ArkGraphics2D/DisplaySync/oh-package.json5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at -- Gitee From b2b3249676d49a06d0f908ea59556d97259afcae Mon Sep 17 00:00:00 2001 From: kelinyang Date: Mon, 25 Aug 2025 17:24:47 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: kelinyang --- ArkGraphics2D/DisplaySoloist/README.md | 2 +- ArkGraphics2D/DisplaySync/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ArkGraphics2D/DisplaySoloist/README.md b/ArkGraphics2D/DisplaySoloist/README.md index 6cc4eb090..71b3f9ce2 100644 --- a/ArkGraphics2D/DisplaySoloist/README.md +++ b/ArkGraphics2D/DisplaySoloist/README.md @@ -2,7 +2,7 @@ ### 介绍 -本示例通过 DisplaySoloist 系列功能,使用 UI 外的线程对 XComponent 的绘制内容,设置开发者所期望的帧率。使用 [NativeDisplaySoloist](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/graphics/displaysoloist-native-guidelines.md) 和 [Drawing](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/graphics/drawing-guidelines.md) 来实现图像绘制和显示。 +本示例通过 DisplaySoloist 系列功能,使用 UI 外的线程对 XComponent 的绘制内容,设置开发者所期望的帧率。使用 [NativeDisplaySoloist](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/displaysoloist-native-guidelines) 和 [Drawing](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/graphic-drawing-overview) 来实现图像绘制和显示。 ### 效果预览 diff --git a/ArkGraphics2D/DisplaySync/README.md b/ArkGraphics2D/DisplaySync/README.md index d6d57281b..e679d025f 100644 --- a/ArkGraphics2D/DisplaySync/README.md +++ b/ArkGraphics2D/DisplaySync/README.md @@ -4,7 +4,7 @@ 本示例通过 DisplaySync 系列功能,对请求动画绘制帧率、请求 UI 绘制帧率和请求自绘制内容绘制帧率设置开发者所期望的帧率。 -本示例主要展示了 DisplaySync 系列能力,使用 [ExpectedFrameRateRange](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-explicit-animation.md#expectedframeraterange11) 属性来配置显性动画和属性动画的帧率;利用 [@ohos.graphics.displaySync](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-arkgraphics2d/js-apis-graphics-displaySync.md) 方法来为独立的帧率绘制、更新操作UI界面;采用 [XComponent](https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/ui/napi-xcomponent-guidelines.md) 组件进行开发,从而可以请求独立的绘制帧率进行内容开发。 +本示例主要展示了 DisplaySync 系列能力,使用 [ExpectedFrameRateRange](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-explicit-animation#expectedframeraterange11) 属性来配置显性动画和属性动画的帧率;利用 [@ohos.graphics.displaySync](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-graphics-displaysync) 方法来为独立的帧率绘制、更新操作UI界面;采用 [XComponent](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/napi-xcomponent-guidelines) 组件进行开发,从而可以请求独立的绘制帧率进行内容开发。 ### 效果预览 -- Gitee